KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > cache > ConstraintMatcherTest


1 package org.mmbase.cache;
2
3 import java.util.*;
4
5 import org.mmbase.bridge.*;
6 import org.mmbase.bridge.util.Queries;
7 import org.mmbase.core.CoreField;
8 import org.mmbase.core.event.NodeEvent;
9 import org.mmbase.core.event.Event;
10 import org.mmbase.core.event.NodeEventHelper;
11 import org.mmbase.module.core.MMBase;
12 import org.mmbase.module.core.MMObjectBuilder;
13 import org.mmbase.module.core.MMObjectNode;
14 import org.mmbase.module.corebuilders.FieldDefs;
15 import org.mmbase.storage.search.implementation.*;
16 import org.mmbase.storage.search.*;
17 import org.mmbase.tests.BridgeTest;
18 import org.mmbase.util.logging.Logger;
19 import org.mmbase.util.logging.Logging;
20
21 public class ConstraintMatcherTest extends BridgeTest {
22     static protected Cloud cloud = null;
23
24     private static final Logger log = Logging.getLoggerInstance(ConstraintMatcherTest.class);
25
26     static private int nodeNumber = -1;
27
28     static protected ConstraintsMatchingStrategy matchingStrategy;
29
30     public ConstraintMatcherTest(String JavaDoc name) {
31         super(name);
32     }
33
34     public void setUp() throws Exception JavaDoc {
35         if (cloud == null) {
36             startMMBase();
37             cloud = getCloud();
38             Node newNode = cloud.getNodeManager("datatypes").createNode();
39             newNode.commit();
40             nodeNumber = newNode.getNumber();
41             
42         }
43         matchingStrategy = new ConstraintsMatchingStrategy();
44     }
45
46     protected static Map createMap(Object JavaDoc[][] objects) {
47         Map map = new HashMap();
48         for (int i = 0; i < objects.length; i++) {
49             map.put(objects[i][0], objects[i][1]);
50         }
51         return map;
52     }
53
54
55
56     public void testBasicFieldValueConstraintMatcherString() {
57
58         // type string. Allso tests non-matching events (different step, different field), and non-matching datatypes
59
Query q1 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "string = 'disco'", null, null, null, false);
60
61         NodeEvent event1a = new NodeEvent(null, "datatypes", nodeNumber, createMap(new String JavaDoc[][] { { "string", "disco" } }), createMap(new String JavaDoc[][] { { "string", "disco" } }), Event.TYPE_CHANGE);
62         NodeEvent event1b = new NodeEvent(null, "datatypes", nodeNumber, createMap(new String JavaDoc[][] { { "string", "disco" } }), createMap(new String JavaDoc[][] { { "string", "something" } }), Event.TYPE_CHANGE);
63         NodeEvent event1c = new NodeEvent(null, "datatypes", nodeNumber, new HashMap(), createMap(new String JavaDoc[][] { { "string", "disco" } }), Event.TYPE_CHANGE);
64         NodeEvent event1d = new NodeEvent(null, "datatypes", nodeNumber, createMap(new String JavaDoc[][] { { "string", "bobo" } }), createMap(new String JavaDoc[][] { { "string", "something" } }), Event.TYPE_CHANGE);
65         NodeEvent event1e = new NodeEvent(null, "datatypes", nodeNumber, createMap(new String JavaDoc[][] { { "string", "bobo" } }), createMap(new String JavaDoc[][] { { "string", "disco" } }), Event.TYPE_CHANGE);
66         NodeEvent event1f = new NodeEvent(null, "news", nodeNumber, createMap(new String JavaDoc[][] { { "string", "bobo" } }), createMap(new String JavaDoc[][] { { "string", "disco" } }), Event.TYPE_CHANGE);
67         NodeEvent event1g = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object JavaDoc[][] { { "integer", new Integer JavaDoc(3) } }), createMap(new String JavaDoc[][] { { "string", "disco" } }), Event.TYPE_CHANGE);
68         NodeEvent event1h = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object JavaDoc[][] { { "string", new Boolean JavaDoc(true) } }), createMap(new String JavaDoc[][] { { "string", "disco" } }), Event.TYPE_CHANGE);
69         NodeEvent event1i = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object JavaDoc[][] { { "string", new ArrayList() } }), createMap(new String JavaDoc[][] { { "string", "disco" } }), Event.TYPE_CHANGE);
70
71         // constraint matching tests
72
// first tetst type 'changed'
73
assertTrue("Changed node falls within constraints before, and within constraints after event. flush", matchingStrategy.evaluate(event1a, q1, null).shouldRelease());
74         assertTrue("Changed node falls within constraints before, but outside constraints after event. flush", matchingStrategy.evaluate(event1b, q1, null).shouldRelease());
75         assertFalse("Changed node falls outside constraint before and outside constraint after event: no flush", matchingStrategy.evaluate(event1d, q1, null).shouldRelease());
76         assertTrue("Changed node falls outside constraint before but within constraints after: flush", matchingStrategy.evaluate(event1e, q1, null).shouldRelease());
77
78         // non-matching step and field
79
assertTrue("Changed node's type does not match the constraint's step: flush", matchingStrategy.evaluate(event1f, q1, null).shouldRelease());
80         assertTrue("Changed node's changed field does not match the constraint's field: flush", matchingStrategy.evaluate(event1g, q1, null).shouldRelease());
81         // empty values map- exception
82
assertTrue("A FieldComparisonException occurs: flush", matchingStrategy.evaluate(event1c, q1, null).shouldRelease());
83
84         // wrong datatype
85
assertTrue("Datatype Boolean does not match field integer: flush", matchingStrategy.evaluate(event1h, q1, null).shouldRelease());
86         // unsupported datatype
87
assertTrue("Datatype 'List' is not supported: don't flush", matchingStrategy.evaluate(event1i, q1, null).shouldRelease());
88
89         // test different operators
90
NodeEvent event2a = new NodeEvent(null, "datatypes", nodeNumber, null, createMap(new String JavaDoc[][] { { "string", "a" } }), Event.TYPE_NEW);
91         NodeEvent event2b = new NodeEvent(null, "datatypes", nodeNumber, null, createMap(new String JavaDoc[][] { { "string", "c" } }), Event.TYPE_NEW);
92
93         Query q2 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "string > 'b'", null, null, null, false);
94         Query q3 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "string < 'b'", null, null, null, false);
95         Query q4 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "string != 'c'", null, null, null, false);
96         Query q5 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "string >= 'b'", null, null, null, false);
97         Query q6 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "string <= 'b'", null, null, null, false);
98
99 // >
100
assertTrue("(>) New node falls within constraint: flush", matchingStrategy.evaluate(event2b, q2, null).shouldRelease());
101         assertFalse("(>) New node falls outside constraint: don't flush", matchingStrategy.evaluate(event2a, q2, null).shouldRelease());
102 // <
103
assertTrue("(<) New node falls within constraint: flush", matchingStrategy.evaluate(event2a, q3, null).shouldRelease());
104         assertFalse("(<) New node falls outside constraint: don't flush", matchingStrategy.evaluate(event2b, q3, null).shouldRelease());
105 // !=
106
assertTrue("(!=) New node falls within constraint: flush", matchingStrategy.evaluate(event2a, q4, null).shouldRelease());
107         assertFalse("(!=) New node falls outside constraint: don't flush", matchingStrategy.evaluate(event2b, q4, null).shouldRelease());
108 // >=
109
assertTrue("(>=) New node falls within constraint: flush", matchingStrategy.evaluate(event2b, q5, null).shouldRelease());
110         assertFalse("(>=) New node falls outside constraint: don't flush", matchingStrategy.evaluate(event2a, q5, null).shouldRelease());
111 // <=
112
assertTrue("(<=) New node falls within constraint: flush", matchingStrategy.evaluate(event2a, q6, null).shouldRelease());
113         assertFalse("(<=) New node falls outside constraint: don't flush", matchingStrategy.evaluate(event2b, q6, null).shouldRelease());
114
115         // test the like comparison
116
NodeEvent event2c = new NodeEvent(null, "datatypes", nodeNumber, null, createMap(new String JavaDoc[][] { { "string", "abcd" } }), Event.TYPE_NEW);
117         Query q7 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "string like 'a' ", null, null, null, false);
118         Query q8 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "string like 'a?'", null, null, null, false);
119         Query q9 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "string like 'a%'", null, null, null, false);
120         Query q10= Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "string like'c'", null, null, null, false);
121         Query q11= Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "string like '?c?'", null, null, null, false);
122         Query q12= Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "string like '%c?'", null, null, null, false);
123         Query q13= Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "string like lower('ADBC')", null, null, null, false);
124         Query q14= Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "string like lower('%C?')", null, null, null, false);
125
126         assertFalse("(like 1) no match: don't flush", matchingStrategy.evaluate(event2c, q7, null).shouldRelease());
127         assertFalse("(like 2) no match: don't flush", matchingStrategy.evaluate(event2c, q8, null).shouldRelease());
128         assertTrue("(like 3) matches: flush", matchingStrategy.evaluate(event2c, q9, null).shouldRelease());
129         assertFalse("(like 4) no match: don't flush", matchingStrategy.evaluate(event2c, q10, null).shouldRelease());
130         assertFalse("(like 5) no match: don't flush", matchingStrategy.evaluate(event2c, q11, null).shouldRelease());
131         assertTrue("(like 6) matches: flush", matchingStrategy.evaluate(event2c, q12, null).shouldRelease());
132         assertTrue("(like 7) matches: flush", matchingStrategy.evaluate(event2c, q13, null).shouldRelease());
133         assertTrue("(like 8) matches: flush", matchingStrategy.evaluate(event2c, q14, null).shouldRelease());
134
135         Query q16= Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "string!='xyz'", null, null, null, false);
136         assertTrue("(not) matches: flush", matchingStrategy.evaluate(event2c, q16, null).shouldRelease());
137
138         Query q15= Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "NOT([string]='xyz')", null, null, null, false);
139         assertTrue("(not) matches: flush", matchingStrategy.evaluate(event1a, q15, null).shouldRelease());
140         assertTrue("(not) matches: flush", matchingStrategy.evaluate(event2c, q15, null).shouldRelease());
141
142     }
143
144
145     public void testBasicFieldValueConstraintMatcherBoolean(){
146
147         MMBase mmbase = MMBase.getMMBase();
148         MMObjectBuilder builder = mmbase.getBuilder("datatypes");
149         MMObjectNode node = builder.getNewNode("system");
150         node.setValue("boolean", new Boolean JavaDoc(true));
151         node.setValue("checksum", "jewjkekwekk");
152         builder.insert("system", node);
153
154         NodeEvent event1 = NodeEventHelper.createNodeEventInstance(node, Event.TYPE_NEW, null);
155
156
157         BasicSearchQuery query3 = new BasicSearchQuery(false);
158         BasicStep s1 = query3.addStep(builder);
159         CoreField bField = builder.getField("boolean");
160         BasicStepField sf1 = query3.addField(s1, bField);
161         BasicFieldValueConstraint c1 = new BasicFieldValueConstraint(sf1, new Boolean JavaDoc(true));
162         c1.setOperator(FieldCompareConstraint.EQUAL);
163         query3.setConstraint(c1);
164
165         BasicSearchQuery query4 = (BasicSearchQuery) query3.clone();
166         BasicFieldValueConstraint c2 = (BasicFieldValueConstraint) query4.getConstraint();
167         c2.setValue(new Boolean JavaDoc(false));
168
169
170         assertTrue("boolean value does match: flush", matchingStrategy.evaluate(event1, query3, null).shouldRelease());
171         assertFalse("boolean value dus not match: don't flush", matchingStrategy.evaluate(event1, query4, null).shouldRelease());
172     }
173
174
175
176     public void testBasicFieldValueConstraintMatcherNode(){
177
178         MMBase mmbase = MMBase.getMMBase();
179         MMObjectBuilder builder = mmbase.getBuilder("datatypes");
180
181         MMObjectNode node = builder.getNewNode("system");
182         builder.insert("system", node);
183
184
185         MMObjectNode othernode = builder.getNewNode("system");
186         builder.insert("system", othernode);
187
188         MMObjectNode node1 = builder.getNewNode("system");
189         node1.setValue("node",node);
190         builder.insert("system", node1);
191
192         NodeEvent event1 = NodeEventHelper.createNodeEventInstance(node1, Event.TYPE_NEW, null);
193
194
195         BasicSearchQuery query3 = new BasicSearchQuery(false);
196         BasicStep s1 = query3.addStep(builder);
197         CoreField bField = builder.getField("node");
198         BasicStepField sf1 = query3.addField(s1, bField);
199         BasicFieldValueConstraint c1 = new BasicFieldValueConstraint(sf1, new Integer JavaDoc(node.getNumber()));
200         c1.setOperator(FieldCompareConstraint.EQUAL);
201         query3.setConstraint(c1);
202
203         BasicSearchQuery query4 = (BasicSearchQuery) query3.clone();
204         BasicFieldValueConstraint c2 = (BasicFieldValueConstraint) query4.getConstraint();
205         c2.setValue(new Integer JavaDoc(othernode.getNumber()));
206
207         assertTrue("node value does match: flush", matchingStrategy.evaluate(event1, query3, null).shouldRelease());
208         assertFalse("node value dus not match: don't flush", matchingStrategy.evaluate(event1, query4, null).shouldRelease());
209     }
210
211
212     public void testBasicFieldValueConstraintMatcherDate(){
213         MMBase mmbase = MMBase.getMMBase();
214         MMObjectBuilder builder = mmbase.getBuilder("datatypes");
215         MMObjectNode node = builder.getNewNode("system");
216         Date date = new Date();
217         node.setValue("datetime", date);
218         builder.insert("system", node);
219
220         NodeEvent event1 = NodeEventHelper.createNodeEventInstance(node, Event.TYPE_NEW, null);
221
222
223         BasicSearchQuery query3 = new BasicSearchQuery(false);
224         BasicStep s1 = query3.addStep(builder);
225         CoreField bField = builder.getField("datetime");
226         BasicStepField sf1 = query3.addField(s1, bField);
227         BasicFieldValueConstraint c1 = new BasicFieldValueConstraint(sf1, date);
228         c1.setOperator(FieldCompareConstraint.EQUAL);
229         query3.setConstraint(c1);
230
231         BasicSearchQuery query4 = (BasicSearchQuery) query3.clone();
232         BasicFieldValueConstraint c2 = (BasicFieldValueConstraint) query4.getConstraint();
233         Calendar cal =Calendar.getInstance();
234         cal.set(Calendar.YEAR, -1);
235         c2.setValue(cal.getTime());
236
237
238         assertTrue("date value does match: flush", matchingStrategy.evaluate(event1, query3, null).shouldRelease());
239         assertFalse("date value dus not match: don't flush", matchingStrategy.evaluate(event1, query4, null).shouldRelease());
240     }
241     public void testBasicFieldValueConstraintMatcherInt() {
242         // type integer. allso tests event types delete and new
243
Query query1 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "datatypes.integer < 3", null, null, null, false);
244
245         NodeEvent event2a = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(2) } }), createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(1) } }), Event.TYPE_CHANGE);
246         NodeEvent event2b = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(2) } }), createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(10) } }), Event.TYPE_CHANGE);
247         NodeEvent event2c = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(10) } }), createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(100) } }), Event.TYPE_CHANGE);
248         NodeEvent event2d = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(3) } }), createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(2) } }), Event.TYPE_CHANGE);
249
250         // when the event type is 'new' the new values should be checked against the constraint
251
NodeEvent event2e = new NodeEvent(null, "datatypes", nodeNumber, null, createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(2) } }), Event.TYPE_NEW);
252         NodeEvent event2f = new NodeEvent(null, "datatypes", nodeNumber, null, createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(4) } }), Event.TYPE_NEW);
253
254         // event type Delete
255
NodeEvent event2g = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(2) } }), null, Event.TYPE_DELETE);
256         NodeEvent event2h = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(4) } }), null, Event.TYPE_DELETE);
257
258         // operator >
259
Query query2 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "datatypes.integer > 3", null, null, null, false);
260         // operator ==
261
Query query3 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "datatypes.integer = 2", null, null, null, false);
262         // operator >=
263
Query query4 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "datatypes.integer >= 4", null, null, null, false);
264         // operator <=
265
Query query5 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "datatypes.integer <= 3", null, null, null, false);
266         // operator <=
267
Query query6 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "datatypes.integer != 4", null, null, null, false);
268
269         assertTrue("Changed node falls within constraints before, and within constraints after event. flush,", matchingStrategy.evaluate(event2a, query1, null).shouldRelease());
270         assertTrue("Changed node falls within constraints before, but outside constraints after event. flush", matchingStrategy.evaluate(event2b, query1, null).shouldRelease());
271         assertFalse("Changed node falls outside constraint before and outside constraint after event: no flush", matchingStrategy.evaluate(event2c, query1, null).shouldRelease());
272         assertTrue("Changed node falls outside constraint before but within constraints after: flush", matchingStrategy.evaluate(event2d, query1, null).shouldRelease());
273
274         // try event type New
275
assertTrue("New node falls within constraint: flush", matchingStrategy.evaluate(event2e, query1, null).shouldRelease());
276         assertFalse("New node falls outside constraint: don't flush", matchingStrategy.evaluate(event2f, query1, null).shouldRelease());
277         // try event type Delete
278
assertTrue("Old node falls within constraint: flush", matchingStrategy.evaluate(event2g, query1, null).shouldRelease());
279         assertFalse("Old node falls outside constraint: don't flush", matchingStrategy.evaluate(event2h, query1, null).shouldRelease());
280
281         // different operators:
282
// >
283
assertTrue("(>) New node falls within constraint: flush", matchingStrategy.evaluate(event2f, query2, null).shouldRelease());
284         assertFalse("(>) New node falls outside constraint: don't flush", matchingStrategy.evaluate(event2e, query2, null).shouldRelease());
285         // ==
286
assertTrue("(==) New node falls within constraint: flush", matchingStrategy.evaluate(event2e, query3, null).shouldRelease());
287         assertFalse("(==) New node falls outside constraint: don't flush", matchingStrategy.evaluate(event2f, query3, null).shouldRelease());
288         // >=
289
assertTrue("(>=) New node falls within constraint: flush", matchingStrategy.evaluate(event2f, query4, null).shouldRelease());
290         assertFalse("(>=) New node falls outside constraint: don't flush", matchingStrategy.evaluate(event2e, query4, null).shouldRelease());
291         // <=
292
assertTrue("(<=) New node falls within constraint: flush", matchingStrategy.evaluate(event2e, query5, null).shouldRelease());
293         assertFalse("(<=) New node falls outside constraint: don't flush", matchingStrategy.evaluate(event2f, query5, null).shouldRelease());
294         // !=
295
assertTrue("(!=) New node falls within constraint: flush", matchingStrategy.evaluate(event2e, query6, null).shouldRelease());
296         assertFalse("(!=) New node falls outside constraint: don't flush", matchingStrategy.evaluate(event2f, query6, null).shouldRelease());
297     }
298
299     public void testCompositeMatcherAnd(){
300         MMBase mmbase = MMBase.getMMBase();
301         MMObjectBuilder magsBuilder = mmbase.getBuilder("mags");
302         MMObjectNode node = magsBuilder.getNewNode("system");
303         node.setValue("title", "test");
304         node.setValue("subtitle", "testsub");
305         node.setValue("intro", "intro");
306         magsBuilder.insert("system", node);
307
308             //test the new node
309
NodeEvent event = NodeEventHelper.createNodeEventInstance(node, Event.TYPE_NEW, null);
310         Query query1 = Queries.createQuery(cloud, null, "mags", "mags.number", "mags.number = "+node.getNumber()+" AND mags.title='test'", null, null, null, false);
311         Query query2 = Queries.createQuery(cloud, null, "mags", "mags.number", "mags.number = 11 AND mags.title='test'", null, null, null, false);
312         Query query3 = Queries.createQuery(cloud, null, "mags", "mags.number", "mags.number = "+node.getNumber()+" AND mags.title='hallo'", null, null, null, false);
313         Query query4 = Queries.createQuery(cloud, null, "mags,news", "mags.number", "mags.number = 11 AND news.title='test'", null, null, null, false);
314
315         assertTrue("both constraints match: flush", matchingStrategy.evaluate(event, query1, null).shouldRelease());
316         assertFalse("node number does not match: don't flush", matchingStrategy.evaluate(event, query2, null).shouldRelease());
317         assertFalse("magazine title does not match: don't flush", matchingStrategy.evaluate(event, query3, null).shouldRelease());
318         assertTrue("event does not (fully) match query: flush", matchingStrategy.evaluate(event, query4, null).shouldRelease());
319
320         //test the changed node
321
node.setValue("subtitle", "newTitle");
322         NodeEvent event1 = NodeEventHelper.createNodeEventInstance(node, Event.TYPE_CHANGE, null);
323
324         Query query5 = Queries.createQuery(cloud, null, "mags", "mags.number", "mags.title = 'test' AND mags.subtitle='testsub'", null, null, null, false);
325         Query query6 = Queries.createQuery(cloud, null, "mags", "mags.number", "mags.title = 'test' AND mags.subtitle='newTitle'", null, null, null, false);
326         Query query7 = Queries.createQuery(cloud, null, "mags", "mags.number", "mags.title = 'test' AND mags.intro='intro'", null, null, null, false);
327
328         assertTrue("changed node: value used to match, but no more: flush", matchingStrategy.evaluate(event1, query5, null).shouldRelease());
329         assertTrue("changed node: value matches now, but did not before: flush", matchingStrategy.evaluate(event1, query6, null).shouldRelease());
330         assertTrue("changed node: value matched before and matches now: flush", matchingStrategy.evaluate(event1, query7, null).shouldRelease());
331
332         node.commit();
333
334         //test deleted nodes
335
NodeEvent event2 = NodeEventHelper.createNodeEventInstance(node, Event.TYPE_DELETE, null);
336         Query query8 = Queries.createQuery(cloud, null, "mags", "mags.number", "mags.title = 'hallo' AND mags.intro='intro'", null, null, null, false);
337         Query query9 = Queries.createQuery(cloud, null, "mags", "mags.number", "mags.title = 'test' AND mags.intro='intro'", null, null, null, false);
338         Query query10 = Queries.createQuery(cloud, null, "mags", "mags.number", "mags.title = 'test' AND mags.intro='something'", null, null, null, false);
339         Query query11 = Queries.createQuery(cloud, null, "mags,news", "mags.number", "news.title = 'test' AND mags.intro='something'", null, null, null, false);
340
341         assertFalse("deleted node: one value matches: don't flush", matchingStrategy.evaluate(event2, query8, null).shouldRelease());
342         assertTrue("deleted node: both values matches: flush", matchingStrategy.evaluate(event2, query9, null).shouldRelease());
343         assertFalse("deleted node: both values don't match: don't flush", matchingStrategy.evaluate(event2, query10, null).shouldRelease());
344         assertTrue("deleted node: event does not (fully) match query: flush", matchingStrategy.evaluate(event2, query11, null).shouldRelease());
345     }
346
347     public void testCompositeMatcherOr(){
348
349         MMBase mmbase = MMBase.getMMBase();
350         MMObjectBuilder magsBuilder = mmbase.getBuilder("mags");
351         MMObjectNode node = magsBuilder.getNewNode("system");
352         node.setValue("title", "test");
353         node.setValue("subtitle", "testsub");
354         node.setValue("intro", "intro");
355         magsBuilder.insert("system", node);
356
357         NodeEvent event1 = NodeEventHelper.createNodeEventInstance(node, Event.TYPE_NEW, null);
358         Query query1 = Queries.createQuery(cloud, null, "mags", "mags.number", "mags.subtitle='notso' OR mags.title='test'", null, null, null, false);
359         Query query2 = Queries.createQuery(cloud, null, "mags, news", "mags.number", "news.title='notso' OR mags.title='test'", null, null, null, false);
360         Query query3 = Queries.createQuery(cloud, null, "mags", "mags.number", "mags.subtitle='testsub' OR mags.title='test'", null, null, null, false);
361         Query query4 = Queries.createQuery(cloud, null, "mags", "mags.number", "mags.subtitle='notso' OR mags.title='notso'", null, null, null, false);
362         Query query5 = Queries.createQuery(cloud, null, "mags,news", "mags.number", "news.subtitle='notso' OR news.title='test'", null, null, null, false);
363
364         assertTrue("new node: one value matches, and both can be cheked: flush", matchingStrategy.evaluate(event1, query1, null).shouldRelease());
365         assertTrue("new node: one value matches, and the other can not be cheked: flush", matchingStrategy.evaluate(event1, query2, null).shouldRelease());
366         assertTrue("new node: both values matches: flush", matchingStrategy.evaluate(event1, query3, null).shouldRelease());
367         assertFalse("new node: no values matches: don't flush", matchingStrategy.evaluate(event1, query4, null).shouldRelease());
368         assertTrue("new node: no values can be checked: flush", matchingStrategy.evaluate(event1, query5, null).shouldRelease());
369     }
370
371
372     public void testBasicFieldValueInConstraintMatcher() {
373         Query query = Queries.createQuery(cloud, null, "datatypes", "datatypes.number,datatypes.integer", null, null, null, null, false);
374         Set values = new HashSet();
375         values.add(new Integer JavaDoc(0));
376         values.add(new Integer JavaDoc(1));
377         query.setConstraint(Queries.createConstraint(query, "datatypes.integer", Queries.getOperator("IN"), values, null, false));
378
379
380         {
381             // will match
382
NodeEvent event = new NodeEvent(null, "datatypes", nodeNumber,
383                                             createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(2) } }),
384                                             createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(1) } }), Event.TYPE_CHANGE);
385             assertTrue(matchingStrategy.evaluate(event, query, null).shouldRelease());
386         }
387
388         {
389             // never matches
390
NodeEvent event = new NodeEvent(null, "datatypes", nodeNumber,
391                                             createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(2) } }),
392                                             createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(3) } }), Event.TYPE_CHANGE);
393             assertFalse(matchingStrategy.evaluate(event, query, null).shouldRelease());
394         }
395         {
396             // did match
397
NodeEvent event = new NodeEvent(null, "datatypes", nodeNumber,
398                                             createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(1) } }),
399                                             createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(2) } }), Event.TYPE_CHANGE);
400             assertTrue(matchingStrategy.evaluate(event, query, null).shouldRelease());
401         }
402         {
403             // still matches
404
NodeEvent event = new NodeEvent(null, "datatypes", nodeNumber,
405                                             createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(1) } }),
406                                             createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(0) } }), Event.TYPE_CHANGE);
407             assertTrue(matchingStrategy.evaluate(event, query, null).shouldRelease());
408         }
409     }
410
411
412     public void testSpeed() {
413         Query query = Queries.createQuery(cloud, null, "datatypes", "datatypes.number,datatypes.integer", null, null, null, null, false);
414         Set values = new HashSet();
415         values.add(new Integer JavaDoc(0));
416         values.add(new Integer JavaDoc(1));
417         query.setConstraint(Queries.createConstraint(query, "datatypes.integer", Queries.getOperator("IN"), values, null, false));
418
419         NodeEvent event1 = new NodeEvent(null, "datatypes", nodeNumber,
420                                          createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(2) } }),
421                                          createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(1) } }), Event.TYPE_CHANGE);
422         NodeEvent event2 = new NodeEvent(null, "datatypes", nodeNumber,
423                                          createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(2) } }),
424                                          createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(3) } }), Event.TYPE_CHANGE);
425         NodeEvent event3 = new NodeEvent(null, "datatypes", nodeNumber,
426                                             createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(1) } }),
427                                             createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(2) } }), Event.TYPE_CHANGE);
428         
429         NodeEvent event4 = new NodeEvent(null, "datatypes", nodeNumber,
430                                             createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(1) } }),
431                                             createMap(new Object JavaDoc[][] { { new String JavaDoc("integer"), new Integer JavaDoc(0) } }), Event.TYPE_CHANGE);
432
433         ChainedReleaseStrategy chain = new ChainedReleaseStrategy(); // in reality always a chain is used;
434
chain.addReleaseStrategy(matchingStrategy);
435         System.out.println("Simple performance (constraint matching).");
436         long startTime = System.currentTimeMillis();
437         for (int i = 0; i < 50000; i++) {
438             chain.evaluate(event1, query, null).shouldRelease();
439             chain.evaluate(event2, query, null).shouldRelease();
440             chain.evaluate(event3, query, null).shouldRelease();
441             //chain.evaluate(event3, query, null).shouldRelease();
442
}
443         System.out.println("Simple performance test result (contraint matching): " + (System.currentTimeMillis() - startTime) + " ms");
444
445
446     }
447
448
449 }
450
Popular Tags