import java.util.Properties; import uk.ac.imperial.lsds.seep.api.DataStore; import uk.ac.imperial.lsds.seep.api.DataStoreType; import uk.ac.imperial.lsds.seep.api.QueryComposer; import uk.ac.imperial.lsds.seep.api.QueryExecutionMode; import uk.ac.imperial.lsds.seep.api.data.Schema; import uk.ac.imperial.lsds.seep.api.data.Schema.SchemaBuilder; import uk.ac.imperial.lsds.seep.api.data.Type; import uk.ac.imperial.lsds.seep.api.operator.LogicalOperator; import uk.ac.imperial.lsds.seep.api.operator.SeepLogicalQuery; import uk.ac.imperial.lsds.seep.api.operator.sources.SyntheticSource; import uk.ac.imperial.lsds.seep.api.operator.sources.SyntheticSourceConfig; public class Base implements QueryComposer { int operatorId = 0; int connectionId = 0; Schema schema = SchemaBuilder.getInstance().newField(Type.INT, "userId").newField(Type.LONG, "value").build(); private int sel; private int cost; private long isize; private boolean incremental_choose; private int fanout1; private int fanout2; private int compfactor; public Base(String[] qParams) { String sel = "selectivity"; String cost = "cost"; String isize = "isize"; String incrementalchoose = "incchoose"; String fanout = "fanout"; String fanout2 = "fanout2"; String compfactor = "compfactor"; for(int i = 0; i < qParams.length; i++) { String token = qParams[i]; if(token.equals(sel)) { this.sel = new Integer(qParams[(i+1)]); } else if(token.equals(cost)) { this.cost = new Integer(qParams[(i+1)]); } else if(token.equals(isize)) { this.isize = new Long(qParams[(i+1)]); } else if(token.equals(incrementalchoose)){ this.incremental_choose = new Boolean(qParams[(i+1)]); } else if(token.equalsIgnoreCase(fanout)) { this.fanout1 = new Integer(qParams[i+1]); } else if(token.equalsIgnoreCase(fanout2)) { this.fanout2 = new Integer(qParams[i+1]); } else if(token.equalsIgnoreCase(compfactor)) { this.compfactor = new Integer(qParams[i+1]); } } } @Override public SeepLogicalQuery compose() { Properties syncConfig = new Properties(); String size = ""+isize+""; syncConfig.setProperty(SyntheticSourceConfig.GENERATED_SIZE, size); // source with adder (fixed selectivity) SyntheticSource synSrc = SyntheticSource.newSource(operatorId++, syncConfig); LogicalOperator adderOne = queryAPI.newStatelessOperator(new Adder(1.0, compfactor), operatorId++); synSrc.connectTo(adderOne, schema, connectionId++); // We create a choose LogicalOperator outerChoose = queryAPI.newChooseOperator(new Choose(incremental_choose), operatorId++); for(int i = 0; i < fanout1; i++) { LogicalOperator branch = queryAPI.newStatelessOperator(new Branch1(i, compfactor), operatorId++); adderOne.connectTo(branch, connectionId++, new DataStore(schema, DataStoreType.NETWORK)); // Choose for internal branch LogicalOperator choose = queryAPI.newChooseOperator(new Choose(incremental_choose), operatorId++); for(int j = 0; j < fanout2; j++) { LogicalOperator branch2 = queryAPI.newStatelessOperator(new Branch1(j, compfactor), operatorId++); LogicalOperator eval2 = queryAPI.newStatelessOperator(new Evaluator(), operatorId++); branch.connectTo(branch2, connectionId++, new DataStore(schema, DataStoreType.NETWORK)); branch2.connectTo(eval2, connectionId++, new DataStore(schema, DataStoreType.NETWORK)); eval2.connectTo(choose, connectionId++, new DataStore(schema, DataStoreType.NETWORK)); } LogicalOperator eval = queryAPI.newStatelessOperator(new Evaluator(), operatorId++); choose.connectTo(eval, connectionId++, new DataStore(schema, DataStoreType.NETWORK)); eval.connectTo(outerChoose, connectionId++, new DataStore(schema, DataStoreType.NETWORK)); } // Finally connect choose to sink LogicalOperator snk = queryAPI.newStatelessSink(new Snk(), operatorId++); outerChoose.connectTo(snk, connectionId++, new DataStore(schema, DataStoreType.NETWORK)); SeepLogicalQuery slq = queryAPI.build(); slq.setExecutionModeHint(QueryExecutionMode.ALL_SCHEDULED); return slq; } }