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 name) { 31 super(name); 32 } 33 34 public void setUp() throws Exception { 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 [][] 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 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 [][] { { "string", "disco" } }), createMap(new String [][] { { "string", "disco" } }), Event.TYPE_CHANGE); 62 NodeEvent event1b = new NodeEvent(null, "datatypes", nodeNumber, createMap(new String [][] { { "string", "disco" } }), createMap(new String [][] { { "string", "something" } }), Event.TYPE_CHANGE); 63 NodeEvent event1c = new NodeEvent(null, "datatypes", nodeNumber, new HashMap(), createMap(new String [][] { { "string", "disco" } }), Event.TYPE_CHANGE); 64 NodeEvent event1d = new NodeEvent(null, "datatypes", nodeNumber, createMap(new String [][] { { "string", "bobo" } }), createMap(new String [][] { { "string", "something" } }), Event.TYPE_CHANGE); 65 NodeEvent event1e = new NodeEvent(null, "datatypes", nodeNumber, createMap(new String [][] { { "string", "bobo" } }), createMap(new String [][] { { "string", "disco" } }), Event.TYPE_CHANGE); 66 NodeEvent event1f = new NodeEvent(null, "news", nodeNumber, createMap(new String [][] { { "string", "bobo" } }), createMap(new String [][] { { "string", "disco" } }), Event.TYPE_CHANGE); 67 NodeEvent event1g = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object [][] { { "integer", new Integer (3) } }), createMap(new String [][] { { "string", "disco" } }), Event.TYPE_CHANGE); 68 NodeEvent event1h = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object [][] { { "string", new Boolean (true) } }), createMap(new String [][] { { "string", "disco" } }), Event.TYPE_CHANGE); 69 NodeEvent event1i = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object [][] { { "string", new ArrayList() } }), createMap(new String [][] { { "string", "disco" } }), Event.TYPE_CHANGE); 70 71 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 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 assertTrue("A FieldComparisonException occurs: flush", matchingStrategy.evaluate(event1c, q1, null).shouldRelease()); 83 84 assertTrue("Datatype Boolean does not match field integer: flush", matchingStrategy.evaluate(event1h, q1, null).shouldRelease()); 86 assertTrue("Datatype 'List' is not supported: don't flush", matchingStrategy.evaluate(event1i, q1, null).shouldRelease()); 88 89 NodeEvent event2a = new NodeEvent(null, "datatypes", nodeNumber, null, createMap(new String [][] { { "string", "a" } }), Event.TYPE_NEW); 91 NodeEvent event2b = new NodeEvent(null, "datatypes", nodeNumber, null, createMap(new String [][] { { "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 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 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 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 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 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 NodeEvent event2c = new NodeEvent(null, "datatypes", nodeNumber, null, createMap(new String [][] { { "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 (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 (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 (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 (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 (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 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 [][] { { new String ("integer"), new Integer (2) } }), createMap(new Object [][] { { new String ("integer"), new Integer (1) } }), Event.TYPE_CHANGE); 246 NodeEvent event2b = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object [][] { { new String ("integer"), new Integer (2) } }), createMap(new Object [][] { { new String ("integer"), new Integer (10) } }), Event.TYPE_CHANGE); 247 NodeEvent event2c = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object [][] { { new String ("integer"), new Integer (10) } }), createMap(new Object [][] { { new String ("integer"), new Integer (100) } }), Event.TYPE_CHANGE); 248 NodeEvent event2d = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object [][] { { new String ("integer"), new Integer (3) } }), createMap(new Object [][] { { new String ("integer"), new Integer (2) } }), Event.TYPE_CHANGE); 249 250 NodeEvent event2e = new NodeEvent(null, "datatypes", nodeNumber, null, createMap(new Object [][] { { new String ("integer"), new Integer (2) } }), Event.TYPE_NEW); 252 NodeEvent event2f = new NodeEvent(null, "datatypes", nodeNumber, null, createMap(new Object [][] { { new String ("integer"), new Integer (4) } }), Event.TYPE_NEW); 253 254 NodeEvent event2g = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object [][] { { new String ("integer"), new Integer (2) } }), null, Event.TYPE_DELETE); 256 NodeEvent event2h = new NodeEvent(null, "datatypes", nodeNumber, createMap(new Object [][] { { new String ("integer"), new Integer (4) } }), null, Event.TYPE_DELETE); 257 258 Query query2 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "datatypes.integer > 3", null, null, null, false); 260 Query query3 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "datatypes.integer = 2", null, null, null, false); 262 Query query4 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "datatypes.integer >= 4", null, null, null, false); 264 Query query5 = Queries.createQuery(cloud, null, "datatypes", "datatypes.number", "datatypes.integer <= 3", null, null, null, false); 266 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 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 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 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 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 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 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 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 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 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 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 (0)); 376 values.add(new Integer (1)); 377 query.setConstraint(Queries.createConstraint(query, "datatypes.integer", Queries.getOperator("IN"), values, null, false)); 378 379 380 { 381 NodeEvent event = new NodeEvent(null, "datatypes", nodeNumber, 383 createMap(new Object [][] { { new String ("integer"), new Integer (2) } }), 384 createMap(new Object [][] { { new String ("integer"), new Integer (1) } }), Event.TYPE_CHANGE); 385 assertTrue(matchingStrategy.evaluate(event, query, null).shouldRelease()); 386 } 387 388 { 389 NodeEvent event = new NodeEvent(null, "datatypes", nodeNumber, 391 createMap(new Object [][] { { new String ("integer"), new Integer (2) } }), 392 createMap(new Object [][] { { new String ("integer"), new Integer (3) } }), Event.TYPE_CHANGE); 393 assertFalse(matchingStrategy.evaluate(event, query, null).shouldRelease()); 394 } 395 { 396 NodeEvent event = new NodeEvent(null, "datatypes", nodeNumber, 398 createMap(new Object [][] { { new String ("integer"), new Integer (1) } }), 399 createMap(new Object [][] { { new String ("integer"), new Integer (2) } }), Event.TYPE_CHANGE); 400 assertTrue(matchingStrategy.evaluate(event, query, null).shouldRelease()); 401 } 402 { 403 NodeEvent event = new NodeEvent(null, "datatypes", nodeNumber, 405 createMap(new Object [][] { { new String ("integer"), new Integer (1) } }), 406 createMap(new Object [][] { { new String ("integer"), new Integer (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 (0)); 416 values.add(new Integer (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 [][] { { new String ("integer"), new Integer (2) } }), 421 createMap(new Object [][] { { new String ("integer"), new Integer (1) } }), Event.TYPE_CHANGE); 422 NodeEvent event2 = new NodeEvent(null, "datatypes", nodeNumber, 423 createMap(new Object [][] { { new String ("integer"), new Integer (2) } }), 424 createMap(new Object [][] { { new String ("integer"), new Integer (3) } }), Event.TYPE_CHANGE); 425 NodeEvent event3 = new NodeEvent(null, "datatypes", nodeNumber, 426 createMap(new Object [][] { { new String ("integer"), new Integer (1) } }), 427 createMap(new Object [][] { { new String ("integer"), new Integer (2) } }), Event.TYPE_CHANGE); 428 429 NodeEvent event4 = new NodeEvent(null, "datatypes", nodeNumber, 430 createMap(new Object [][] { { new String ("integer"), new Integer (1) } }), 431 createMap(new Object [][] { { new String ("integer"), new Integer (0) } }), Event.TYPE_CHANGE); 432 433 ChainedReleaseStrategy chain = new ChainedReleaseStrategy(); 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 } 443 System.out.println("Simple performance test result (contraint matching): " + (System.currentTimeMillis() - startTime) + " ms"); 444 445 446 } 447 448 449 } 450 | Popular Tags |