package org.infinispan.objectfilter.impl.syntax; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import org.infinispan.objectfilter.impl.syntax.parser.IckleParsingResult; import org.infinispan.objectfilter.impl.syntax.parser.IckleParser; import org.infinispan.objectfilter.impl.syntax.parser.ReflectionEntityNamesResolver; import org.infinispan.objectfilter.impl.syntax.parser.ReflectionPropertyHelper; import org.junit.Test; /** * @author anistor@redhat.com * @since 8.0 */ public class BooleShannonExpansionTest { private final ReflectionPropertyHelper propertyHelper = new ReflectionPropertyHelper(new ReflectionEntityNamesResolver(null)); private final BooleanFilterNormalizer booleanFilterNormalizer = new BooleanFilterNormalizer(); private final BooleShannonExpansion booleShannonExpansion = new BooleShannonExpansion(3, new IndexedFieldProvider.FieldIndexingMetadata() { @Override public boolean isIndexed(String[] propertyPath) { String last = propertyPath[propertyPath.length - 1]; return !"number".equals(last) && !"license".equals(last); } @Override public boolean isAnalyzed(String[] propertyPath) { return false; } @Override public boolean isStored(String[] propertyPath) { return isIndexed(propertyPath); } }); /** * @param queryString the input query to parse and expand * @param expectedExprStr the expected 'toString()' of the output AST * @param expectedQuery the expected equivalent JPA of the AST */ private void assertExpectedTree(String queryString, String expectedExprStr, String expectedQuery) { IckleParsingResult<Class<?>> parsingResult = IckleParser.parse(queryString, propertyHelper); BooleanExpr expr = booleanFilterNormalizer.normalize(parsingResult.getWhereClause()); expr = booleShannonExpansion.expand(expr); if (expectedExprStr != null) { assertNotNull(expr); assertEquals(expectedExprStr, expr.toString()); } else { assertNull(expr); } if (expectedQuery != null) { String queryOut = SyntaxTreePrinter.printTree(parsingResult.getTargetEntityName(), null, expr, parsingResult.getSortFields()); assertEquals(expectedQuery, queryOut); } } @Test public void testNothingToExpand() throws Exception { assertExpectedTree("from org.infinispan.objectfilter.test.model.Person", null, "FROM org.infinispan.objectfilter.test.model.Person"); } @Test public void testExpansionNotNeeded() throws Exception { assertExpectedTree("from org.infinispan.objectfilter.test.model.Person p where " + "p.surname = 'Adrian' or p.name = 'Nistor'", "OR(EQUAL(PROP(surname), CONST(\"Adrian\")), EQUAL(PROP(name), CONST(\"Nistor\")))", "FROM org.infinispan.objectfilter.test.model.Person WHERE (surname = \"Adrian\") OR (name = \"Nistor\")"); } @Test public void testExpansionNotPossible() throws Exception { assertExpectedTree("from org.infinispan.objectfilter.test.model.Person p where " + "p.license = 'A' or p.name = 'Nistor'", "CONST_TRUE", "FROM org.infinispan.objectfilter.test.model.Person"); } @Test public void testExpansionNotPossible2() throws Exception { assertExpectedTree("from org.infinispan.objectfilter.test.model.Person p where " + "p.name = 'A' and p.name > 'A'", "CONST_FALSE", null); } @Test public void testExpansionPossible() throws Exception { assertExpectedTree("from org.infinispan.objectfilter.test.model.Person p where " + "p.phoneNumbers.number != '1234' and p.surname = 'Adrian' or p.name = 'Nistor'", "OR(EQUAL(PROP(surname), CONST(\"Adrian\")), EQUAL(PROP(name), CONST(\"Nistor\")))", "FROM org.infinispan.objectfilter.test.model.Person WHERE (surname = \"Adrian\") OR (name = \"Nistor\")"); } @Test public void testExpansionTooBig() throws Exception { assertExpectedTree("from org.infinispan.objectfilter.test.model.Person p where " + "p.phoneNumbers.number != '1234' and p.surname = 'Adrian' or p.name = 'Nistor' and license = 'PPL'", "CONST_TRUE", "FROM org.infinispan.objectfilter.test.model.Person"); } }