@cap-js-community/common 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -875,27 +875,68 @@ function selectFromRefs(model, query) {
|
|
|
875
875
|
return refs;
|
|
876
876
|
}
|
|
877
877
|
|
|
878
|
+
function selectFromAliases(model, query) {
|
|
879
|
+
let aliases = {};
|
|
880
|
+
if (query.SELECT.from.SELECT) {
|
|
881
|
+
// Sub-select aliases are not (yet) supported
|
|
882
|
+
} else if (query.SELECT.from.ref) {
|
|
883
|
+
const ref = resolveRef(model, query.SELECT.from.ref);
|
|
884
|
+
if (query.SELECT.from.as) {
|
|
885
|
+
aliases[query.SELECT.from.as] = ref;
|
|
886
|
+
} else {
|
|
887
|
+
const as = ref.split(".").pop();
|
|
888
|
+
aliases[as] = ref;
|
|
889
|
+
}
|
|
890
|
+
} else if ((query.SELECT.from.join || query.SELECT.from.SET) && query.SELECT.from.args) {
|
|
891
|
+
for (const arg of query.SELECT.from.args) {
|
|
892
|
+
const ref = resolveRef(model, arg.ref);
|
|
893
|
+
if (arg.as) {
|
|
894
|
+
aliases[arg.as] = ref;
|
|
895
|
+
} else {
|
|
896
|
+
const as = ref.split(".").pop();
|
|
897
|
+
aliases[as] = ref;
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
return aliases;
|
|
902
|
+
}
|
|
903
|
+
|
|
878
904
|
function selectRefs(model, query) {
|
|
879
905
|
let refs = selectFromRefs(model, query);
|
|
906
|
+
const aliases = selectFromAliases(model, query);
|
|
880
907
|
if (query._target) {
|
|
881
908
|
const target = model.definitions[query._target.name];
|
|
882
909
|
if (query.SELECT.orderBy) {
|
|
883
|
-
refs = refs.concat(expressionRefs(model, target, query.SELECT.orderBy, query.SELECT.mixin));
|
|
910
|
+
refs = refs.concat(expressionRefs(model, target, query.SELECT.orderBy, query.SELECT.mixin, aliases));
|
|
884
911
|
}
|
|
885
912
|
if (query.SELECT.columns) {
|
|
886
|
-
refs = refs.concat(expressionRefs(model, target, query.SELECT.columns, query.SELECT.mixin));
|
|
887
|
-
refs = refs.concat(expandRefs(model, target, query.SELECT.columns, query.SELECT.mixin));
|
|
913
|
+
refs = refs.concat(expressionRefs(model, target, query.SELECT.columns, query.SELECT.mixin, aliases));
|
|
914
|
+
refs = refs.concat(expandRefs(model, target, query.SELECT.columns, query.SELECT.mixin, aliases));
|
|
888
915
|
}
|
|
889
916
|
if (query.SELECT.where) {
|
|
890
|
-
refs = refs.concat(expressionRefs(model, target, query.SELECT.where, query.SELECT.mixin));
|
|
917
|
+
refs = refs.concat(expressionRefs(model, target, query.SELECT.where, query.SELECT.mixin, aliases));
|
|
891
918
|
}
|
|
892
919
|
if (query.SELECT.having) {
|
|
893
|
-
refs = refs.concat(expressionRefs(model, target, query.SELECT.having, query.SELECT.mixin));
|
|
920
|
+
refs = refs.concat(expressionRefs(model, target, query.SELECT.having, query.SELECT.mixin, aliases));
|
|
894
921
|
}
|
|
895
922
|
}
|
|
896
923
|
return refs;
|
|
897
924
|
}
|
|
898
925
|
|
|
926
|
+
function resolveRef(model, refs) {
|
|
927
|
+
let ref = refs[0];
|
|
928
|
+
if (ref.id) {
|
|
929
|
+
ref = ref.id;
|
|
930
|
+
}
|
|
931
|
+
let current = model.definitions[ref];
|
|
932
|
+
for (const ref of refs.slice(1)) {
|
|
933
|
+
if (current.elements[ref].type === "cds.Association" || current.elements[ref].type === "cds.Composition") {
|
|
934
|
+
current = current.elements[ref]._target;
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
return current.name;
|
|
938
|
+
}
|
|
939
|
+
|
|
899
940
|
function resolveRefs(model, refs) {
|
|
900
941
|
let resolvedRefs = [];
|
|
901
942
|
let ref = refs[0];
|
|
@@ -917,17 +958,16 @@ function resolveRefs(model, refs) {
|
|
|
917
958
|
return resolvedRefs;
|
|
918
959
|
}
|
|
919
960
|
|
|
920
|
-
function identifierRefs(model, definition, expressions,
|
|
961
|
+
function identifierRefs(model, definition, expressions, mixins, aliases) {
|
|
921
962
|
let refs = [];
|
|
922
963
|
for (const expression of expressions) {
|
|
923
964
|
if (Array.isArray(expression.ref)) {
|
|
924
965
|
let current = definition;
|
|
925
|
-
let
|
|
966
|
+
let currentMixins = mixins;
|
|
926
967
|
for (const ref of expression.ref) {
|
|
927
|
-
|
|
928
|
-
if (
|
|
929
|
-
|
|
930
|
-
currentMixin = {};
|
|
968
|
+
current = target(model, current, currentMixins, aliases, ref);
|
|
969
|
+
if (current !== null) {
|
|
970
|
+
currentMixins = {};
|
|
931
971
|
refs.push(current.name);
|
|
932
972
|
}
|
|
933
973
|
}
|
|
@@ -936,13 +976,13 @@ function identifierRefs(model, definition, expressions, mixin) {
|
|
|
936
976
|
return refs;
|
|
937
977
|
}
|
|
938
978
|
|
|
939
|
-
function expressionRefs(model, definition, expressions,
|
|
940
|
-
let refs = identifierRefs(model, definition, expressions,
|
|
979
|
+
function expressionRefs(model, definition, expressions, mixins, aliases) {
|
|
980
|
+
let refs = identifierRefs(model, definition, expressions, mixins, aliases);
|
|
941
981
|
for (const expression of expressions) {
|
|
942
982
|
if (expression.xpr) {
|
|
943
|
-
refs = refs.concat(expressionRefs(model, definition, expression.xpr,
|
|
983
|
+
refs = refs.concat(expressionRefs(model, definition, expression.xpr, mixins, aliases));
|
|
944
984
|
} else if (expression.args) {
|
|
945
|
-
refs = refs.concat(expressionRefs(model, definition, expression.args,
|
|
985
|
+
refs = refs.concat(expressionRefs(model, definition, expression.args, mixins, aliases));
|
|
946
986
|
} else if (expression.SELECT) {
|
|
947
987
|
refs = refs.concat(selectRefs(model, expression));
|
|
948
988
|
}
|
|
@@ -950,16 +990,15 @@ function expressionRefs(model, definition, expressions, mixin) {
|
|
|
950
990
|
return refs;
|
|
951
991
|
}
|
|
952
992
|
|
|
953
|
-
function expandRefs(model, definition, columns,
|
|
993
|
+
function expandRefs(model, definition, columns, mixins, aliases) {
|
|
954
994
|
let refs = [];
|
|
955
995
|
for (const column of columns) {
|
|
956
996
|
if (Array.isArray(column.ref) && column.expand) {
|
|
957
997
|
let current = definition;
|
|
958
|
-
let
|
|
998
|
+
let currentMixins = mixins;
|
|
959
999
|
for (const ref of column.ref) {
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
currentMixin = {};
|
|
1000
|
+
current = target(model, current, currentMixins, aliases, ref);
|
|
1001
|
+
currentMixins = {};
|
|
963
1002
|
refs.push(current.name);
|
|
964
1003
|
}
|
|
965
1004
|
refs = refs.concat(expandRefs(model, current, column.expand));
|
|
@@ -968,6 +1007,26 @@ function expandRefs(model, definition, columns, mixin) {
|
|
|
968
1007
|
return refs;
|
|
969
1008
|
}
|
|
970
1009
|
|
|
1010
|
+
function target(model, entity, mixins, aliases, ref) {
|
|
1011
|
+
if (aliases?.[ref]) {
|
|
1012
|
+
return typeof aliases[ref] === "string" ? model.definitions[aliases[ref]] : aliases[ref];
|
|
1013
|
+
}
|
|
1014
|
+
if (entity.name.endsWith(`.${ref}`)) {
|
|
1015
|
+
return entity;
|
|
1016
|
+
}
|
|
1017
|
+
const element = entity.elements[ref] || mixins?.[ref];
|
|
1018
|
+
if (!element) {
|
|
1019
|
+
cds.log(Component).warn("Reference not found in entity", {
|
|
1020
|
+
entity: entity.name,
|
|
1021
|
+
ref,
|
|
1022
|
+
});
|
|
1023
|
+
}
|
|
1024
|
+
if (element.type === "cds.Association" || element.type === "cds.Composition") {
|
|
1025
|
+
return model.definitions[element.target];
|
|
1026
|
+
}
|
|
1027
|
+
return null;
|
|
1028
|
+
}
|
|
1029
|
+
|
|
971
1030
|
function staticRefs(model, refs) {
|
|
972
1031
|
for (const ref of refs) {
|
|
973
1032
|
if (!model.definitions[ref][Annotations.ReplicateStatic]) {
|