-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathSponateUtils.js
More file actions
113 lines (82 loc) · 3.34 KB
/
SponateUtils.js
File metadata and controls
113 lines (82 loc) · 3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
var ObjectUtils = require('../util/ObjectUtils');
var PrefixUtils = require('../util/PrefixUtils');
var Element = require('../sparql/element/Element');
var ElementString = require('../sparql/element/ElementString');
var TemplateParser = require('./TemplateParser');
var ListServiceUtils = require('./ListServiceUtils');
var AggMap = require('./agg/AggMap');
var MappedConcept = require('./MappedConcept');
var ExprVar = require('../sparql/expr/ExprVar');
var Concept = require('../sparql/Concept');
var AggUtils = require('./AggUtils');
var SponateUtils = {
/**
* Parses a sponate mapping spec object into a MappedConcept.
*
*/
parseSpec: function(spec, prefixMapping, templateParser) {
var template = spec.template;
var result
= (template instanceof MappedConcept)
? template
: this.parseSpecCore(spec, prefixMapping, templateParser)
;
return result;
},
parseSpecCore: function(spec, prefixMapping, templateParser) {
templateParser = templateParser || new TemplateParser();
var template = spec.template;
var from = spec.from;
// Parse the 'from' attribute into an ElementFactory
// TODO Move to util class
var element;
if(ObjectUtils.isString(from)) {
var elementStr = from;
if(prefixMapping != null) {
var prefixes = prefixMapping.getNsPrefixMap();
//var vars = sparql.extractSparqlVars(elementStr);
elementStr = PrefixUtils.expandPrefixes(prefixes, elementStr);
}
element = new ElementString.create(elementStr);
//elementFactory = new sparql.ElementFactoryConst(element);
}
else if(from instanceof Element) {
element = from;
}
// else if(from instanceof ElementFactory) {
// throw new Error('ElementFactories / functions in the FROM part not supported anymore');
// }
else if(ObjectUtils.isFunction(from)) {
throw new Error('ElementFactories / functions in the FROM part not supported anymore');
}
else {
throw new Error('Unknown argument type for FROM attribute', from);
}
//this.context.mapTableNameToElementFactory(name, elementFactory);
// TODO The support joining the from element
var tmp = templateParser.parseAgg(template);
// Remove the outer most transformation wrapping an AggMap!
var agg = AggUtils.unwrapAggTransform(tmp);
// Extract the ID attribute
var idExpr;
//var tmp = AggUtils.unwrapAggTransform(agg);
if(agg instanceof AggMap) {
var keyBindingMapper = agg.getKeyBindingMapper();
idExpr = keyBindingMapper.getExpr(); // TODO Check for whether the mapper provides getExpr()
}
else {
throw new Error('Could not obtain ID attribute from aggregator');
}
var idVar;
if(idExpr instanceof ExprVar) {
idVar = idExpr.asVar();
}
else {
throw new Error('Variable required for ID attribute, got an expression instead: ' + idExpr);
}
var concept = new Concept(element, idVar);
var result = new MappedConcept(concept, agg);
return result;
},
};
module.exports = SponateUtils;