-
Notifications
You must be signed in to change notification settings - Fork 5
/
CountUtils.js
157 lines (119 loc) · 6.23 KB
/
CountUtils.js
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
var Class = require('../ext/Class');
var HashMap = require('../util/collection/HashMap');
var NodeUtils = require('../rdf/NodeUtils');
var NodeFactory = require('../rdf/NodeFactory');
var ElementSubQuery = require('../sparql/element/ElementSubQuery');
var ElementUnion = require('../sparql/element/ElementUnion');
var ElementFilter = require('../sparql/element/ElementFilter');
var ElementGroup = require('../sparql/element/ElementGroup');
var Query = require('../sparql/Query');
var Concept = require('../sparql/Concept');
var ConceptUtils = require('../sparql/ConceptUtils');
var NodeValueUtils = require('../sparql/NodeValueUtils');
var ExprVar = require('../sparql/expr/ExprVar');
var E_OneOf = require('../sparql/expr/E_OneOf');
var E_Equals = require('../sparql/expr/E_Equals');
//var ListServiceConcept = require('../service/list_service/ListServiceConcept');
var ListServiceSparqlQuery = require('../service/list_service/ListServiceSparqlQuery');
//var FacetService = require('./FacetService');
var LookupService = require('../service/lookup_service/LookupService');
var FacetUtils = require('./FacetUtils');
var Relation = require('../sparql/Relation');
var RelationUtils = require('../sparql/RelationUtils');
var VarUtils = require('../sparql/VarUtils');
var AggMap = require('../sponate/agg/AggMap');
var AggTransform = require('../sponate/agg/AggTransform');
var AggLiteral = require('../sponate/agg/AggLiteral');
var BindingMapperExpr = require('../sponate/binding_mapper/BindingMapperExpr');
var LookupServiceUtils = require('../sponate/LookupServiceUtils');
var ServiceUtils = require('../sponate/ServiceUtils');
var shared = require('../util/shared');
var Promise = shared.Promise;
var QueryUtils = require('../sparql/QueryUtils');
var CountUtils = {
createAggMapCount: function(sourceVar, targetVar) {
//var result = new AggTransform(new AggLiteral(new BindingMapperExpr(new ExprVar(targetVar))), NodeUtils.getValue);
var result =
new AggMap(
new BindingMapperExpr(new ExprVar(sourceVar)),
new AggTransform(new AggLiteral(new BindingMapperExpr(new ExprVar(targetVar))), NodeUtils.getValue));
return result;
},
execQueries: function(sparqlService, subQueries, sourceVar, targetVar) {
var query = QueryUtils.createQueryUnionSubQueries(subQueries, [sourceVar, targetVar]);
var result;
if(query) {
var agg = this.createAggMapCount(sourceVar, targetVar);
result = ServiceUtils.execAgg(sparqlService, query, agg);
//var ls = LookupServiceUtils.createLookupServiceAgg(sparqlService, query, sourceVar, agg);
//result = ls.lookup(); // unconstrained lookup
} else {
result = Promise.resolve(new HashMap());
}
return result;
},
createQueriesPreCountCore: function(facetRelationIndex, countVar, properties, propertyQueryFn) {
// Create the queries
var defaultRelation = facetRelationIndex.getDefaultRelation();
var propertyToRelation = facetRelationIndex.getPropertyToRelation();
//throw new Error('here' + JSON.stringify(properties));
var result = properties.map(function(property) {
var relation = propertyToRelation.get(property);
if(!relation) {
relation = defaultRelation;
}
var r = propertyQueryFn(relation, property, countVar);
return r;
});
return result;
},
createQueriesPreCount: function(facetRelationIndex, countVar, properties, rowLimit) {
var result = this.createQueriesPreCountCore(facetRelationIndex, countVar, properties, function(relation, property, countVar) {
var r = RelationUtils.createQueryRawSize(relation, property, countVar, rowLimit);
return r;
});
return result;
},
createQueriesExactCount: function(facetRelationIndex, countVar, properties) {
var result = this.createQueriesExactCountSingle(facetRelationIndex, countVar, properties);
return result;
},
createQueriesExactCountSingle: function(facetRelationIndex, countVar, properties) {
var result = this.createQueriesPreCountCore(facetRelationIndex, countVar, properties, function(relation, property, countVar) {
var sourceVar = relation.getSourceVar();
var filter = new ElementFilter(new E_Equals(new ExprVar(sourceVar), NodeValueUtils.makeNode(property)));
var filteredRel = new Relation(new ElementGroup([relation.getElement(), filter]), sourceVar, relation.getTargetVar());
var r = RelationUtils.createQueryDistinctValueCount(filteredRel, countVar);
return r;
});
return result;
},
// TODO This approach uses ?property In (propertyList)
// but it is utterly slow on virtuoso :( - thus we created the single version
createQueriesExactCountMulti: function(facetRelationIndex, countVar, properties) {
var sourceVar = facetRelationIndex.getSourceVar();
var defaultRelation = facetRelationIndex.getDefaultRelation();
var propertyToRelation = facetRelationIndex.getPropertyToRelation();
var defaultProperties = [];
var result = [];
// If properties map to a relation, we can create the query right away,
// as this indicates that special constraints apply that do not apply to any other property
properties.forEach(function(property) {
var relation = propertyToRelation.get(property);
if(!relation) {
defaultProperties.push(property);
} else {
var query = RelationUtils.createQueryDistinctValueCount(relation, countVar);
result.push(query);
}
});
// Those properties that did not map to a relation can be grouped into a single query
var fr = defaultRelation;
var filter = new ElementFilter(new E_OneOf(new ExprVar(sourceVar), defaultProperties));
var filteredRel = new Relation(new ElementGroup([fr.getElement(), filter]), fr.getSourceVar(), fr.getTargetVar());
var defaultQuery = RelationUtils.createQueryDistinctValueCount(filteredRel, countVar);
result.push(defaultQuery);
return result;
},
};
module.exports = CountUtils;