forked from vcwu/rdf_sandbox
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCardOp.java
More file actions
342 lines (278 loc) · 9.27 KB
/
CardOp.java
File metadata and controls
342 lines (278 loc) · 9.27 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
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
package rdf;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.sparql.algebra.Algebra;
import com.hp.hpl.jena.sparql.algebra.Op;
import com.hp.hpl.jena.sparql.algebra.OpVisitor;
import com.hp.hpl.jena.sparql.algebra.OpWalker;
import com.hp.hpl.jena.sparql.algebra.op.OpAssign;
import com.hp.hpl.jena.sparql.algebra.op.OpBGP;
import com.hp.hpl.jena.sparql.algebra.op.OpConditional;
import com.hp.hpl.jena.sparql.algebra.op.OpDatasetNames;
import com.hp.hpl.jena.sparql.algebra.op.OpDiff;
import com.hp.hpl.jena.sparql.algebra.op.OpDisjunction;
import com.hp.hpl.jena.sparql.algebra.op.OpDistinct;
import com.hp.hpl.jena.sparql.algebra.op.OpExt;
import com.hp.hpl.jena.sparql.algebra.op.OpExtend;
import com.hp.hpl.jena.sparql.algebra.op.OpFilter;
import com.hp.hpl.jena.sparql.algebra.op.OpGraph;
import com.hp.hpl.jena.sparql.algebra.op.OpGroup;
import com.hp.hpl.jena.sparql.algebra.op.OpJoin;
import com.hp.hpl.jena.sparql.algebra.op.OpLabel;
import com.hp.hpl.jena.sparql.algebra.op.OpLeftJoin;
import com.hp.hpl.jena.sparql.algebra.op.OpList;
import com.hp.hpl.jena.sparql.algebra.op.OpMinus;
import com.hp.hpl.jena.sparql.algebra.op.OpNull;
import com.hp.hpl.jena.sparql.algebra.op.OpOrder;
import com.hp.hpl.jena.sparql.algebra.op.OpPath;
import com.hp.hpl.jena.sparql.algebra.op.OpProcedure;
import com.hp.hpl.jena.sparql.algebra.op.OpProject;
import com.hp.hpl.jena.sparql.algebra.op.OpPropFunc;
import com.hp.hpl.jena.sparql.algebra.op.OpQuad;
import com.hp.hpl.jena.sparql.algebra.op.OpQuadPattern;
import com.hp.hpl.jena.sparql.algebra.op.OpReduced;
import com.hp.hpl.jena.sparql.algebra.op.OpSequence;
import com.hp.hpl.jena.sparql.algebra.op.OpService;
import com.hp.hpl.jena.sparql.algebra.op.OpSlice;
import com.hp.hpl.jena.sparql.algebra.op.OpTable;
import com.hp.hpl.jena.sparql.algebra.op.OpTopN;
import com.hp.hpl.jena.sparql.algebra.op.OpTriple;
import com.hp.hpl.jena.sparql.algebra.op.OpUnion;
/*
* Delicious sandboxing for cardinality optimization woohoo
*
*/
public class CardOp {
//Here's the meat and potatoes.
public static Op reorder(Query orig){
System.out.println("Original Query\n========================");
System.out.println(orig);
Op op = Algebra.compile(orig);
System.out.println("Original Algebra\n========================");
System.out.println(op);
ArrayList<Op> indivServices = grabIndivServices(op);
//System.out.println("Grab indiv services \n========================");
//System.out.println(indivServices);
ArrayList<ServiceObj> cardinalities = grabEstimatedCardinalityArray(indivServices);
System.out.println("Grab cardinalities \n========================");
System.out.println(cardinalities);
cardinalities= reorderAlgebra(cardinalities); //do the actual reordering based on the cardinality
System.out.println("Reorder Algebra \n========================");
System.out.println(cardinalities);
Op newOp = makeNewAlgebra(cardinalities); //mash them together into one algebra expression again
System.out.println("redone algebra \n========================");
System.out.println(newOp);
return newOp;
}
/*
* reorder the algebra using greedy algorithm
* returns the reordered algebra
*
* -> looking up if hash map even preserves order in java
* ok. hash map doesn't preserve or guarantee order. but treemap does which implements sortedmap interface :D
*
* wait. so treemaps are apparently a loooot slower. i don't actually even need to be sorting IN the map itself,
* all that matters is the key value anyways
*
*/
private static ArrayList<ServiceObj> reorderAlgebra(ArrayList<ServiceObj> servObjs) {
//Reorder the service calls based on the cardinality
Collections.sort(servObjs); //sorts based on the compareTo method in servObjs
return servObjs; //just return the sorted array list for now for testing
}
/*
* makeNewAlgebra
* given an array list of already sorted service calls, mash them together into one algebra expression again
*/
private static Op makeNewAlgebra(ArrayList<ServiceObj> servObjs) {
//erm let's just assume we have two service calls ok
Op op = OpSequence.create(servObjs.get(0).getOp(), servObjs.get(1).getOp());
return op;
}
/*
* Returns array list of individual service calls
*/
private static ArrayList<Op> grabIndivServices(Op op) {
ArrayList<Op> stuff = new ArrayList<Op>();
OpWalker.walk(op, new ServiceGrabber(stuff));
return stuff;
}
/*
* matches incoming service calls with their cardinalities, and returns it all in a hash map.
* not going to use this, since sorting a hash map/treempa is a pain
*/
/*
private static HashMap<Op,Integer> grabEstimatedCardinality(ArrayList<Op> services) {
//Based on the service ops in this array list, will lookup their cardinality
//we assume we already know the cardinality estimates and store them in a table somewhere
//for now I'll just hardcode this thing, but really we should look these up
//... it seems that opwalker may use go from bottom up so the order will be a bit messed up TODO
ArrayList<Integer> fakeCardinality = new ArrayList<Integer>();
fakeCardinality.add(3);
fakeCardinality.add(25);
HashMap<Op,Integer> meat = new HashMap<Op,Integer>();
for(int i =0; i < services.size(); i++) {
meat.put(services.get(i), fakeCardinality.get(i)); //matching the service calls to the fake cardinalities
}
return meat;
}
*/
/*
* Given a bunch of service calls, will look up their respective estimated cardinalities
*
*/
private static ArrayList<ServiceObj> grabEstimatedCardinalityArray(ArrayList<Op> services){
ArrayList<ServiceObj> list = new ArrayList<ServiceObj>();
int cardinality = 10;
for(Op op: services){
//int cardinality = (int) (Math.random() * 30); //for now randomly generate cardinalites from 0 - 30
list.add(new ServiceObj(op, cardinality));
cardinality -=1;
}
return list;
}
public static class ServiceGrabber implements OpVisitor {
//private HashMap<Op, Integer> map;
private ArrayList<Op> map;
public ServiceGrabber(ArrayList<Op> m) {
map = m;
}
@Override
public void visit(OpService arg0) {
// TODO Auto-generated method stub
//YAAAY!... opefully this does what i want it to do T.T
System.out.println("VISITING OPSERVICE");
map.add(arg0);
}
@Override
public void visit(OpBGP arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpQuadPattern arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpTriple arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpQuad arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpPath arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpTable arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpNull arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpProcedure arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpPropFunc arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpFilter arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpGraph arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpDatasetNames arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpLabel arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpAssign arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpExtend arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpJoin arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpLeftJoin arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpUnion arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpDiff arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpMinus arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpConditional arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpSequence arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpDisjunction arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpExt arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpList arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpOrder arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpProject arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpReduced arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpDistinct arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpSlice arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpGroup arg0) {
// TODO Auto-generated method stub
}
@Override
public void visit(OpTopN arg0) {
// TODO Auto-generated method stub
}
}
}