Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
basic
Manage
Activity
Members
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Model registry
Analyze
Contributor analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
xrm
basic
Commits
27df85f1
Commit
27df85f1
authored
5 years ago
by
S.Listl
Browse files
Options
Downloads
Patches
Plain Diff
SqlBuilder object
parent
39005163
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
entity/AttributeRelation_entity/recordcontainers/jdito/contentProcess.js
+26
-19
26 additions, 19 deletions
...eRelation_entity/recordcontainers/jdito/contentProcess.js
process/Sql_lib/process.js
+106
-58
106 additions, 58 deletions
process/Sql_lib/process.js
with
132 additions
and
77 deletions
entity/AttributeRelation_entity/recordcontainers/jdito/contentProcess.js
+
26
−
19
View file @
27df85f1
...
...
@@ -19,7 +19,7 @@ var showEmpty = vars.exists("$param.ShowEmpty_param") && vars.getString("$param.
var
displaySimpleName
=
vars
.
exists
(
"
$param.DisplaySimpleName_param
"
)
&&
vars
.
get
(
"
$param.DisplaySimpleName_param
"
);
var
sqlCondition
=
new
SqlCondition
();
var
sub
Condition
=
new
SqlCondition
();
var
join
Condition
=
new
SqlCondition
();
if
(
vars
.
exists
(
"
$local.idvalues
"
)
&&
vars
.
get
(
"
$local.idvalues
"
))
{
...
...
@@ -51,28 +51,29 @@ else if (showEmpty || rowId)
{
let
filteredIds
=
JSON
.
parse
(
vars
.
getString
(
"
$param.FilteredAttributeIds_param
"
));
sub
Condition
.
clear
();
join
Condition
.
clear
();
let
filteredIdChildren
=
AttributeUtil
.
getAllChildren
(
filteredIds
);
sub
Condition
.
andIn
(
"
AB_ATTRIBUTE.AB_ATTRIBUTEID
"
,
filteredIdChildren
);
sub
Condition
.
andPrepare
(
"
AB_ATTRIBUTE.ATTRIBUTE_TYPE
"
,
$AttributeTypes
.
COMBOVALUE
,
"
# != ?
"
)
join
Condition
.
andIn
(
"
AB_ATTRIBUTE.AB_ATTRIBUTEID
"
,
filteredIdChildren
);
join
Condition
.
andPrepare
(
"
AB_ATTRIBUTE.ATTRIBUTE_TYPE
"
,
$AttributeTypes
.
COMBOVALUE
,
"
# != ?
"
)
// return nothing if filteredAttributeIds is an empty array. (--> and 1=2)
sqlCondition
.
andSqlCondition
(
sub
Condition
,
"
1=2
"
);
sqlCondition
.
andSqlCondition
(
join
Condition
,
"
1=2
"
);
}
}
var
joinCondition
=
""
;
if
(
rowId
)
{
sub
Condition
.
andPrepare
(
"
AB_ATTRIBUTERELATION.OBJECT_ROWID
"
,
rowId
);
join
Condition
.
andPrepare
(
"
AB_ATTRIBUTERELATION.OBJECT_ROWID
"
,
rowId
);
if
(
objectType
!=
null
)
subCondition
.
andPrepare
(
"
AB_ATTRIBUTERELATION.OBJECT_TYPE
"
,
objectType
);
if
(
subCondition
.
isSet
())
joinCondition
=
"
and
"
+
db
.
translateCondition
(
subCondition
.
build
(
"
1=1
"
));
joinCondition
.
andPrepare
(
"
AB_ATTRIBUTERELATION.OBJECT_TYPE
"
,
objectType
);
// add condition to match all returned by joins (override default 1=2 of build)
sqlCondition
.
and
(
"
1=1
"
);
}
joinCondition
.
and
(
"
AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID
"
);
var
defaultFields
=
[
"
AB_ATTRIBUTERELATIONID
"
,
"
AB_ATTRIBUTE.AB_ATTRIBUTEID
"
,
...
...
@@ -84,14 +85,20 @@ var defaultFields = [
];
//these fields hold the attributeRelation value, depending on the attribute type
var
valueFields
=
AttributeTypeUtil
.
getAllDatabaseFields
();
var
attributeSql
=
sqlCondition
.
buildSql
(
"
select
"
+
defaultFields
.
join
(
"
,
"
)
+
"
,
"
+
valueFields
.
join
(
"
,
"
)
+
"
from AB_ATTRIBUTE
"
+
(
showEmpty
?
"
left
"
:
""
)
+
"
join AB_ATTRIBUTERELATION on AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID
"
+
joinCondition
+
"
left join AB_ATTRIBUTE COMBOVAL on
"
+
$AttributeTypes
.
COMBO
.
databaseField
+
"
= COMBOVAL.AB_ATTRIBUTEID
"
//for the view value of combobox attributes
,
"
1=2
"
);
var
attributeValues
=
db
.
table
(
attributeSql
).
map
(
function
(
row
)
var
attributeSql
=
SqlBuilder
.
begin
()
.
select
(
defaultFields
.
concat
(
valueFields
))
.
from
(
"
AB_ATTRIBUTE
"
);
if
(
showEmpty
)
attributeSql
.
leftJoin
(
"
AB_ATTRIBUTERELATION
"
,
joinCondition
.
build
(
"
1=1
"
));
else
attributeSql
.
join
(
"
AB_ATTRIBUTERELATION
"
,
joinCondition
.
build
(
"
1=1
"
));
attributeSql
.
leftJoin
(
"
AB_ATTRIBUTE
"
,
SqlCondition
.
begin
()
.
andPrepare
([
"
AB_ATTRIBUTE
"
,
"
AB_ATTRIBUTEID
"
,
"
COMBOVAL
"
],
$AttributeTypes
.
COMBO
.
databaseField
)
.
build
(),
"
COMBOVAL
"
);
var
attributeValues
=
db
.
table
(
attributeSql
.
build
()).
map
(
function
(
row
)
{
var
attributeId
=
row
[
1
];
var
attributeName
=
translate
.
text
(
row
[
4
]);
...
...
@@ -149,4 +156,4 @@ function _fetchAttributes (pAttributeIds)
if
(
nextIds
.
length
)
_fetchAttributes
(
nextIds
);
}
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
process/Sql_lib/process.js
+
106
−
58
View file @
27df85f1
import
(
"
system.logging
"
);
import
(
"
system.translate
"
);
import
(
"
system.vars
"
);
import
(
"
system.util
"
);
...
...
@@ -598,7 +599,17 @@ SqlCondition.equalsNot = function(pField, pValue, pAlternativeCond, pAlias) {
*/
function
SqlBuilder
()
{
this
.
_query
=
[];
if
(
!
(
this
instanceof
SqlBuilder
))
throw
new
Error
(
translate
.
text
(
"
SqlBuilder must be instanciated with 'new'
"
));
this
.
_sqlStr
=
""
;
this
.
_select
=
null
;
this
.
_from
=
null
;
this
.
_joins
=
[];
this
.
_where
=
null
;
this
.
_groupBy
=
null
;
this
.
_having
=
null
;
this
.
_orderBy
=
null
;
this
.
_unions
=
[];
}
/**
...
...
@@ -606,6 +617,20 @@ function SqlBuilder ()
* methods on it directly without having to put brackets around it
*
* @return {SqlBuilder} a new SqlBuilder object
*
* @example
* var query = SqlBuilder.begin()
* .select("ORGANISATION.NAME, FIRSTNAME, LASTNAME")
* .from("PERSON")
* .join("CONTACT", "CONTACT.PERSON_ID = PERSON.PERSONID")
* .leftJoin("ORGANISATION", SqlCondition.begin()
* .and("CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID")
* .andPrepare("ORGANISATION.NAME", "S%", "# like ?"))
* .where(SqlCondition.begin()
* .andPrepare("CONTACT.STATUS", $KeywordRegistry.contactStatus$active()))
* .build();
*
* var data = db.table(query);
*/
SqlBuilder
.
begin
=
function
()
{
...
...
@@ -628,7 +653,7 @@ SqlBuilder.prototype.toString = function ()
*/
SqlBuilder
.
prototype
.
select
=
function
(
pFields
)
{
this
.
_
append
(
pFields
,
"
select
"
,
true
);
this
.
_
select
=
this
.
_getClause
(
pFields
,
"
select
"
,
true
);
return
this
;
}
...
...
@@ -639,7 +664,7 @@ SqlBuilder.prototype.select = function (pFields)
*/
SqlBuilder
.
prototype
.
selectDistinct
=
function
(
pFields
)
{
this
.
_
append
(
pFields
,
"
select distinct
"
,
true
);
this
.
_
select
=
this
.
_getClause
(
pFields
,
"
select distinct
"
,
true
);
return
this
;
}
...
...
@@ -653,15 +678,15 @@ SqlBuilder.prototype.from = function (pTable, pAlias)
{
if
(
pAlias
)
pTable
+=
"
"
+
pAlias
;
this
.
_
append
(
pTable
,
"
from
"
);
this
.
_
from
=
this
.
_getClause
(
pTable
,
"
from
"
);
return
this
;
}
/**
* Adds a join clause to the sql.
* @param {String} pTable
* @param {String|String[]} pCondition The where condition. This can be
* a string (without the where keyword) or an array (for prepared queries).
* @param {String|String[]
|SqlCondition
} pCondition The where condition. This can be
* a string (without the where keyword)
, a SqlCondition
or an array (for prepared queries).
* @param {String} [pAlias] table alias
* @return {SqlBuilder} current SqlBuilder object
*/
...
...
@@ -670,16 +695,15 @@ SqlBuilder.prototype.join = function (pTable, pCondition, pAlias)
var
joinStr
=
"
join
"
+
pTable
;
if
(
pAlias
)
joinStr
+=
"
"
+
pAlias
;
this
.
_append
(
joinStr
+
"
on
"
);
this
.
_append
(
pCondition
);
this
.
_joins
.
push
(
this
.
_getClause
(
pCondition
,
joinStr
+
"
on
"
));
return
this
;
}
/**
* Adds a left join clause to the sql.
* @param {String} pTable
* @param {String|String[]} pCondition The where condition. This can be
* a string (without the where keyword) or an array (for prepared queries).
* @param {String|String[]
|SqlCondition
} pCondition The where condition. This can be
* a string (without the where keyword)
, a SqlCondition
or an array (for prepared queries).
* @param {String} [pAlias] table alias
* @return {SqlBuilder} current SqlBuilder object
*/
...
...
@@ -688,23 +712,21 @@ SqlBuilder.prototype.leftJoin = function (pTable, pCondition, pAlias)
var
joinStr
=
"
left join
"
+
pTable
;
if
(
pAlias
)
joinStr
+=
"
"
+
pAlias
;
this
.
_append
(
joinStr
+
"
on
"
);
this
.
_append
(
pCondition
);
this
.
_joins
.
push
(
this
.
_getClause
(
pCondition
,
joinStr
+
"
on
"
));
return
this
;
}
/**
* Adds a where clause to the sql.
*
* @param {String|String[]} pCondition The where condition. This can be
* a string (without the where keyword) or an array (for prepared queries).
* @param {String|String[]
|SqlCondition
} pCondition The where condition. This can be
* a string (without the where keyword)
, a SqlCondition
or an array (for prepared queries).
*
* @return {SqlBuilder} current SqlBuilder object
*/
SqlBuilder
.
prototype
.
where
=
function
(
pCondition
)
{
this
.
_append
(
"
where
"
);
this
.
_append
(
pCondition
);
this
.
_where
=
this
.
_getClause
(
pCondition
,
"
where
"
);
return
this
;
}
...
...
@@ -715,18 +737,7 @@ SqlBuilder.prototype.where = function (pCondition)
*/
SqlBuilder
.
prototype
.
orderBy
=
function
(
pOrderBy
)
{
this
.
_append
(
pOrderBy
,
"
order by
"
);
return
this
;
}
/**
* Adds another SqlBuilder object as a subquery.
* @param {SqlBuilder} pSubSelect
* @return {SqlBuilder} current SqlBuilder object
*/
SqlBuilder
.
prototype
.
subSelect
=
function
(
pSubSelect
)
{
this
.
_append
(
pSubSelect
);
this
.
orderBy
=
this
.
_getClause
(
pOrderBy
,
"
order by
"
);
return
this
;
}
...
...
@@ -737,7 +748,7 @@ SqlBuilder.prototype.subSelect = function (pSubSelect)
*/
SqlBuilder
.
prototype
.
groupBy
=
function
(
pFields
)
{
this
.
_
append
(
pFields
,
"
group by
"
,
true
);
this
.
_
groupBy
=
this
.
_getClause
(
pFields
,
"
group by
"
,
true
);
return
this
;
}
...
...
@@ -748,8 +759,7 @@ SqlBuilder.prototype.groupBy = function (pFields)
*/
SqlBuilder
.
prototype
.
union
=
function
(
pSelect
)
{
this
.
_append
(
"
union
"
);
this
.
_append
(
pSelect
);
this
.
_unions
.
push
(
this
.
_getClause
(
pSelect
,
"
union
"
));
return
this
;
}
...
...
@@ -760,28 +770,26 @@ SqlBuilder.prototype.union = function (pSelect)
*/
SqlBuilder
.
prototype
.
unionAll
=
function
(
pSelect
)
{
this
.
_append
(
"
union all
"
);
this
.
_append
(
pSelect
);
this
.
_unions
.
push
(
this
.
_getClause
(
pSelect
,
"
union all
"
));
return
this
;
}
/**
* Adds a having clause to the sql.
*
* @param {String|String[]} pCondition The where condition. This can be
* a string (without the where keyword) or an array (for prepared queries).
* @param {String|String[]
|SqlCondition
} pCondition The where condition. This can be
* a string (without the where keyword)
, a SqlCondition
or an array (for prepared queries).
*
* @return {SqlBuilder} current SqlBuilder object
*/
SqlBuilder
.
prototype
.
having
=
function
(
pCondition
)
{
this
.
_append
(
"
having
"
);
this
.
_append
(
pCondition
);
this
.
_having
=
this
.
_getClause
(
pCondition
,
"
having
"
);
return
this
;
}
/**
*
adds an element
*
generates a part of the sql
*
* @param {String|String[]|SqlBuilder} pElement the element to append
* @param {String} [pPrefix] string to be added before pElement
...
...
@@ -790,13 +798,44 @@ SqlBuilder.prototype.having = function (pCondition)
*
* @private
*/
SqlBuilder
.
prototype
.
_
append
=
function
(
pElement
,
pPrefix
,
pAutoJoin
)
SqlBuilder
.
prototype
.
_
getClause
=
function
(
pElement
,
pPrefix
,
pAutoJoin
)
{
if
(
pAutoJoin
&&
pElement
&&
typeof
pElement
!==
"
string
"
&&
pElement
.
length
!==
undefined
)
pElement
=
pElement
.
join
(
"
,
"
);
var
preparedValues
=
[];
if
(
pElement
instanceof
SqlBuilder
||
pElement
instanceof
SqlCondition
)
{
pElement
=
_getElement
(
pElement
);
}
else
if
(
typeof
pElement
!==
"
string
"
&&
pElement
.
length
!==
undefined
)
//array
{
if
(
pAutoJoin
)
{
for
(
let
i
=
0
,
l
=
pElement
.
length
;
i
<
l
;
i
++
)
{
if
(
pElement
[
i
]
instanceof
SqlBuilder
)
pElement
[
i
]
=
_getElement
(
pElement
);
}
pElement
=
pElement
.
join
(
"
,
"
);
}
else
{
preparedValues
=
preparedValues
.
concat
(
pElement
[
1
]);
pElement
=
pElement
[
0
];
}
}
if
(
pPrefix
)
pElement
=
pPrefix
+
"
"
+
pElement
;
this
.
_query
.
push
(
pPrefix
+
"
"
+
pElement
);
return
[
pElement
.
toString
(),
preparedValues
];
function
_getElement
(
element
)
{
let
condition
=
element
.
build
();
preparedValues
=
preparedValues
.
concat
(
element
[
1
]);
if
(
element
instanceof
SqlBuilder
)
return
"
(
"
+
element
[
0
]
+
"
)
"
;
return
element
[
0
];
}
}
/**
...
...
@@ -806,27 +845,36 @@ SqlBuilder.prototype._append = function (pElement, pPrefix, pAutoJoin)
*/
SqlBuilder
.
prototype
.
build
=
function
()
{
var
sqlStr
=
""
;
var
preparedValues
=
[];
if
(
!
this
.
_select
)
throw
new
Error
(
translate
.
text
(
"
SqlBuilder must contain a select clause!
"
));
if
(
!
this
.
_from
)
throw
new
Error
(
translate
.
text
(
"
SqlBuilder must contain a from clause!
"
));
for
(
let
i
=
0
,
l
=
this
.
_query
.
length
;
i
<
l
;
i
++
)
var
sqlStr
=
""
;
var
preparedVals
=
[];
var
allParts
=
[
this
.
_select
,
this
.
_from
].
concat
(
this
.
_joins
).
concat
([
this
.
_where
,
this
.
_groupBy
,
this
.
_having
,
this
.
_orderBy
,
this
.
_unions
]).
concat
(
this
.
_unions
);
for
(
let
i
=
0
,
l
=
allParts
.
length
;
i
<
l
;
i
++
)
{
let
sqlPart
=
this
.
_query
[
i
];
if
(
sqlPart
instanceof
SqlBuilder
)
{
let
condition
=
sqlPart
.
build
();
sqlPart
=
"
(
"
+
condition
[
0
]
+
"
)
"
;
preparedValues
=
preparedValues
.
concat
(
condition
[
1
]);
}
//array => prepared statement
else
if
(
typeof
pElement
!==
"
string
"
&&
pElement
.
length
===
2
&&
pElement
[
1
].
length
!==
undefined
)
let
part
=
allParts
[
i
];
if
(
part
&&
part
.
length
)
{
preparedValues
=
preparedValues
.
concat
(
sqlPart
[
1
]);
sqlPart
=
sqlPart
[
0
];
if
(
sqlStr
)
sqlStr
+=
"
"
;
sqlStr
+=
part
[
0
];
preparedVals
=
preparedVals
.
concat
(
part
[
1
]);
}
sqlStr
+=
"
"
+
sqlPart
;
}
return
[
sqlStr
.
trim
()
,
preparedVal
ue
s
];
return
[
sqlStr
,
preparedVals
];
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment