22 import ca.uqac.lif.cep.Connector;
23 import ca.uqac.lif.cep.Context;
24 import ca.uqac.lif.cep.EventTracker;
25 import ca.uqac.lif.cep.GroupProcessor;
26 import ca.uqac.lif.cep.Processor;
27 import ca.uqac.lif.cep.Pushable;
28 import ca.uqac.lif.cep.complex.RangeCep;
29 import ca.uqac.lif.cep.functions.ApplyFunction;
30 import ca.uqac.lif.cep.functions.Constant;
31 import ca.uqac.lif.cep.functions.Cumulate;
32 import ca.uqac.lif.cep.functions.CumulativeFunction;
33 import ca.uqac.lif.cep.functions.Function;
34 import ca.uqac.lif.cep.functions.FunctionTree;
35 import ca.uqac.lif.cep.functions.IfThenElse;
36 import ca.uqac.lif.cep.functions.StreamVariable;
37 import ca.uqac.lif.cep.io.Print.Println;
38 import ca.uqac.lif.cep.tmf.SliceLast;
39 import ca.uqac.lif.cep.util.Booleans;
40 import ca.uqac.lif.cep.util.Equals;
41 import ca.uqac.lif.cep.util.Lists;
42 import ca.uqac.lif.cep.util.NthElement;
43 import ca.uqac.lif.cep.util.Numbers;
63 public static void main(String[] args)
67 RangeCep cep =
new RangeCep(
70 new ApplyFunction(
new FunctionTree(Booleans.not,
new FunctionTree(Equals.instance,
new FunctionTree(
new NthElement(1), StreamVariable.X),
new Constant(
"dispose")))),
74 new ApplyFunction(
new NthElement(0)),
78 new CountIf(
"hasNext"),
80 new CountIf(
"remove")},
83 new CreateIteratorLifecycle()).allowRestarts(
true);
87 SliceLast slice =
new SliceLast(
new NthElement(0), cep);
90 Connector.connect(slice,
new Lists.Unpack(),
new Println());
91 Pushable p = slice.getPushableInput();
92 Object i1 =
new Object();
93 Object i2 =
new Object();
94 p.push(
new Object[]{i1,
"next"});
95 p.push(
new Object[]{i2,
"hasNext"});
96 p.push(
new Object[]{i1,
"hasNext"});
97 p.push(
new Object[]{i2,
"dispose"});
98 p.push(
new Object[]{i1,
"dispose"});
99 p.push(
new Object[]{i1,
"next"});
100 p.push(
new Object[]{i1,
"dispose"});
107 protected static class CountIf
extends GroupProcessor
109 public CountIf(String name)
112 ApplyFunction nth =
new ApplyFunction(
new NthElement(1));
113 ApplyFunction ite =
new ApplyFunction(
114 new FunctionTree(IfThenElse.instance,
115 new FunctionTree(Equals.instance, StreamVariable.X,
new Constant(name)),
118 Cumulate sum =
new Cumulate(
new CumulativeFunction<Number>(Numbers.addition));
119 Connector.connect(nth, ite, sum);
120 addProcessors(nth, ite, sum).associateInput(nth).associateOutput(sum);
135 protected static class IteratorLifecycle
140 protected final int m_hash;
145 protected final int m_numNext;
150 protected final int m_numHasNext;
155 protected final int m_numRemove;
164 public IteratorLifecycle(
int hash,
int num_next,
int num_hasNext,
int num_remove)
168 m_numNext = num_next;
169 m_numHasNext = num_hasNext;
170 m_numRemove = num_remove;
174 public String toString()
176 StringBuilder out =
new StringBuilder();
177 out.append(
"subject: ").append(m_hash).append(
",");
178 out.append(
"next: ").append(m_numNext).append(
",");
179 out.append(
"hasNext: ").append(m_numHasNext).append(
",");
180 out.append(
"remove: ").append(m_numRemove);
181 return out.toString();
189 protected static class CreateIteratorLifecycle
extends Function
192 public void evaluate(Object[] inputs, Object[] outputs, Context context, EventTracker tracker)
194 outputs[0] =
new IteratorLifecycle(inputs[0].hashCode(), ((Number) inputs[1]).intValue(), ((Number) inputs[2]).intValue(), ((Number) inputs[3]).intValue());
198 public int getInputArity()
204 public int getOutputArity()
210 public void getInputTypesFor(Set<Class<?>> classes,
int index)
212 classes.add(Number.class);
216 public Class<?> getOutputTypeFor(
int index)
222 public Function duplicate(
boolean with_state)
Creates complex events out of low-level events occurring to Java iterators.