Author: thomasm
Date: Fri Nov 20 15:35:40 2015
New Revision: 1715377

URL: http://svn.apache.org/viewvc?rev=1715377&view=rev
Log:
OAK-2539 SQL2 query not working with filter (s.[stringa] = 'a' OR 
CONTAINS(s.[stringb], 'b'))

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AndImpl.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ConstraintImpl.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/OrImpl.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/MultiPropertyOrTestOptimisation.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/FilterTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2OptimiseQueryTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/AndImplTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/OrImplTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1715377&r1=1715376&r2=1715377&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java
 Fri Nov 20 15:35:40 2015
@@ -131,14 +131,15 @@ public interface Query {
     boolean isSortedByIndex();
     
     /**
-     * Perform optimisation on the object itself. To avoid any potential error 
due to state
-     * variables perfom the optimisation before the {@link #init()}.
+     * Try to convert the query to an alternative form, specially a "union". To
+     * avoid any potential error due to state variables perform the conversion
+     * before the {@link #init()}.
      * 
-     * @return {@code this} if no optimisations are possible or a new instance 
of a {@link Query}.
-     *         Cannot return null.
+     * @return {@code this} if no conversions are possible or a new instance of
+     *         a {@link Query}. Cannot return null.
      */
     @Nonnull
-    Query optimise();
+    Query buildAlternativeQuery();
     
     /**
      * <p>
@@ -162,12 +163,6 @@ public interface Query {
     boolean isInit();
     
     /**
-     * @return {@code true} if the query is a result of optimisations. {@code 
false} if it's the
-     *         originally computed one.
-     */
-    boolean isOptimised();
-    
-    /**
      * @return the original statement as it was used to construct the object. 
If not provided the
      *         {@link #toString()} will be used instead.
      */

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java?rev=1715377&r1=1715376&r2=1715377&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java
 Fri Nov 20 15:35:40 2015
@@ -18,11 +18,11 @@ package org.apache.jackrabbit.oak.query;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.ImmutableSet.of;
-import static com.google.common.collect.Sets.newHashSet;
 import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
 import static 
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
 
 import java.text.ParseException;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -49,24 +49,26 @@ import org.slf4j.MDC;
 public abstract class QueryEngineImpl implements QueryEngine {
     
     /**
-     * used to instruct the {@link QueryEngineImpl} on how to act with respect 
of the SQL2
+     * Used to instruct the {@link QueryEngineImpl} on how to act with respect 
of the SQL2
      * optimisation.
      */
-    public static enum ForceOptimised {
+    public static enum QuerySelectionMode {
+        
         /**
-         * will force the original SQL2 query to be executed
+         * Will execute the cheapest (default).
          */
-        ORIGINAL, 
-        
+        CHEAPEST,
+
         /**
-         * will force the computed optimised query to be executed. If 
available.
+         * Will use the original SQL2 query.
          */
-        OPTIMISED, 
+        ORIGINAL, 
         
         /**
-         * will execute the cheapest.
+         * Will force the computed alternate query to be executed. If 
available.
          */
-        CHEAPEST
+        ALTERNATIVE
+        
     }
 
     private static final AtomicInteger ID_COUNTER = new AtomicInteger();
@@ -95,10 +97,11 @@ public abstract class QueryEngineImpl im
     private boolean traversalEnabled = true;
     
     /**
-     * Whether the query engine should be forced to use the optimised version 
of the query if
-     * available.
+     * Which query to select in case multiple options are available. Whether 
the
+     * query engine should pick the one with the lowest expected cost 
(default),
+     * or the original, or the alternative.
      */
-    private ForceOptimised forceOptimised = ForceOptimised.CHEAPEST;
+    private QuerySelectionMode querySelectionMode = 
QuerySelectionMode.CHEAPEST;
 
     /**
      * Get the execution context for a single query execution.
@@ -125,12 +128,22 @@ public abstract class QueryEngineImpl im
     public List<String> getBindVariableNames(
             String statement, String language, Map<String, String> mappings)
             throws ParseException {
-        Set<Query> qs = parseQuery(statement, language, getExecutionContext(), 
mappings);
+        List<Query> qs = parseQuery(statement, language, 
getExecutionContext(), mappings);
         
         return qs.iterator().next().getBindVariableNames();
     }
 
-    private static Set<Query> parseQuery(
+    /**
+     * Parse the query.
+     * 
+     * @param statement the statement
+     * @param language the language
+     * @param context the context
+     * @param mappings the mappings
+     * @return the list of queries, where the first is the original, and all
+     *         others are alternatives (for example, a "union" query)
+     */
+    private static List<Query> parseQuery(
             String statement, String language, ExecutionContext context,
             Map<String, String> mappings) throws ParseException {
         
@@ -156,7 +169,7 @@ public abstract class QueryEngineImpl im
             parser.setAllowTextLiterals(false);
         }
         
-        Set<Query> queries = newHashSet();
+        ArrayList<Query> queries = new ArrayList<Query>();
         
         Query q;
         
@@ -190,9 +203,9 @@ public abstract class QueryEngineImpl im
                 LOG.trace("Skipping optimisation as internal query.");
             } else {
                 LOG.trace("Attempting optimisation");
-                Query q2 = q.optimise();
+                Query q2 = q.buildAlternativeQuery();
                 if (q2 != q) {
-                    LOG.debug("Optimised query available. {}", q2);
+                    LOG.debug("Alternative query available: {}", q2);
                     queries.add(q2);
                 }
             }
@@ -241,7 +254,7 @@ public abstract class QueryEngineImpl im
         }
 
         ExecutionContext context = getExecutionContext();
-        Set<Query> queries = parseQuery(statement, language, context, 
mappings);
+        List<Query> queries = parseQuery(statement, language, context, 
mappings);
         
         for (Query q : queries) {
             q.setExecutionContext(context);
@@ -257,7 +270,7 @@ public abstract class QueryEngineImpl im
 
         boolean mdc = false;
         try {
-            Query query = prepareAndGetCheapest(queries); 
+            Query query = prepareAndSelect(queries); 
             mdc = setupMDC(query);
             return query.executeQuery();
         } finally {
@@ -268,29 +281,29 @@ public abstract class QueryEngineImpl im
     }
     
     /**
-     * will prepare all the available queries and by based on the {@link 
ForceOptimised} flag return
+     * Prepare all the available queries and by based on the {@link 
QuerySelectionMode} flag return
      * the appropriate.
      * 
-     * @param queries the list of queries to be executed. cannot be null
-     * @return
+     * @param queries the list of queries to be executed. Cannot be null.
+     *      If there are multiple, the first one is the original, and the 
second the alternative.
+     * @return the query
      */
     @Nonnull
-    private Query prepareAndGetCheapest(@Nonnull final Set<Query> queries) {
+    private Query prepareAndSelect(@Nonnull List<Query> queries) {
         Query result = null;
         
         if (checkNotNull(queries).size() == 1) {
             // we only have the original query so we prepare and return it.
             result = queries.iterator().next();
             result.prepare();
-            LOG.debug("No optimisations found. Query: {}", result);
+            LOG.debug("No alternatives found. Query: {}", result);
         } else {
             double bestCost = Double.POSITIVE_INFINITY;
-            double originalCost = Double.POSITIVE_INFINITY;
-            Query original = null;
             
-            // always prepare all of the queries and compute the cheapest as 
it's the default behaviour.
-            // It should trigger more errors during unit and integration 
testing. Changing
-            // `forceOptimised` flag should be in case used only during 
testing.
+            // Always prepare all of the queries and compute the cheapest as
+            // it's the default behaviour. That way, we always log the cost and
+            // can more easily analyze problems. The querySelectionMode flag 
can
+            // be used to override the cheapest.
             for (Query q : checkNotNull(queries)) {
                 q.prepare();
                 double cost = q.getEstimatedCost();
@@ -303,50 +316,22 @@ public abstract class QueryEngineImpl im
                     result = q;
                     bestCost = cost;
                 }
-                if (!q.isOptimised()) {
-                    original = q;
-                    originalCost = cost;
-                }
-            }
-            
-            if (original != null && bestCost == originalCost && result != 
original) {
-                // if the optimised cost is the same as the original SQL2 
query we prefer the original. As
-                // we deal with references the `cheapest!=original` should 
work.
-                LOG.trace("Same cost for original and optimised. Using 
original");
-                result = original;
             }
 
-            switch (forceOptimised) {
+            switch (querySelectionMode) {
             case ORIGINAL:
                 LOG.debug("Forcing the original SQL2 query to be executed by 
flag");
-                for (Query q  : checkNotNull(queries)) {
-                    if (!q.isOptimised()) {
-                        result = q;
-                    }
-                }
+                result = queries.get(0);
                 break;
 
-            case OPTIMISED:
-                LOG.debug("Forcing the optimised SQL2 query to be executed by 
flag");
-                for (Query q  : checkNotNull(queries)) {
-                    if (q.isOptimised()) {
-                        result = q;
-                    }
-                }
+            case ALTERNATIVE:
+                LOG.debug("Forcing the alternative SQL2 query to be executed 
by flag");
+                result = queries.get(1);
                 break;
 
             // CHEAPEST is the default behaviour
             case CHEAPEST:
             default:
-                if (result == null) {
-                    // this should not really happen. Defensive coding.
-                    LOG.debug("Cheapest is null. Returning the original SQL2 
query.");
-                    for (Query q  : checkNotNull(queries)) {
-                        if (!q.isOptimised()) {
-                            result = q;
-                        }
-                    }
-                }
             }
         }
         
@@ -380,9 +365,9 @@ public abstract class QueryEngineImpl im
      * Instruct the query engine on how to behave with regards to the SQL2 
optimised query if
      * available.
      * 
-     * @param forceOptimised cannot be null
+     * @param querySelectionMode cannot be null
      */
-    protected void setForceOptimised(@Nonnull ForceOptimised forceOptimised) {
-        this.forceOptimised = forceOptimised;
+    protected void setQuerySelectionMode(@Nonnull QuerySelectionMode 
querySelectionMode) {
+        this.querySelectionMode = querySelectionMode;
     }
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java?rev=1715377&r1=1715376&r2=1715377&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
 Fri Nov 20 15:35:40 2015
@@ -172,11 +172,6 @@ public class QueryImpl implements Query
      * whether the object has been initialised or not
      */
     private boolean init;
-    
-    /**
-     * whether the query is a result of optimisation or original one.
-     */
-    private boolean optimised;
 
     private boolean isSortedByIndex;
 
@@ -191,20 +186,13 @@ public class QueryImpl implements Query
     private boolean isInternal;
 
     QueryImpl(String statement, SourceImpl source, ConstraintImpl constraint,
-            ColumnImpl[] columns, NamePathMapper mapper, QueryEngineSettings 
settings) {
-        this(statement, source, constraint, columns, mapper, settings, false);
-    }
-
-    QueryImpl(String statement, SourceImpl source, ConstraintImpl constraint,
-        ColumnImpl[] columns, NamePathMapper mapper, QueryEngineSettings 
settings, 
-        final boolean optimised) {
+        ColumnImpl[] columns, NamePathMapper mapper, QueryEngineSettings 
settings) {
         this.statement = statement;
         this.source = source;
         this.constraint = constraint;
         this.columns = columns;
         this.namePathMapper = mapper;
         this.settings = settings;
-        this.optimised = optimised;
     }
 
     @Override
@@ -1198,12 +1186,11 @@ public class QueryImpl implements Query
     }
 
     @Override
-    public Query optimise() {
-        // optimising for UNION
-        Query optimised = this;
+    public Query buildAlternativeQuery() {
+        Query result = this;
         
         if (constraint != null) {
-            Set<ConstraintImpl> unionList = constraint.simplifyForUnion();
+            Set<ConstraintImpl> unionList = constraint.convertToUnion();
             if (unionList.size() > 1) {
                 // there are some cases where multiple ORs simplify into a 
single one. If we get a
                 // union list of just one we don't really have to UNION 
anything.
@@ -1212,7 +1199,7 @@ public class QueryImpl implements Query
                 // we have something to do here.
                 for (ConstraintImpl c : unionList) {
                     if (right != null) {
-                        right = newOptimisedUnionQuery(left, right);
+                        right = newAlternativeUnionQuery(left, right);
                     } else {
                         // pulling left to the right
                         if (left != null) {
@@ -1221,7 +1208,7 @@ public class QueryImpl implements Query
                     }
                     
                     // cloning original query
-                    left = (QueryImpl) this.copyOf(true);
+                    left = (QueryImpl) this.copyOf();
                     
                     // cloning the constraints and assigning to new query
                     left.constraint = (ConstraintImpl) 
copyElementAndCheckReference(c);
@@ -1229,11 +1216,11 @@ public class QueryImpl implements Query
                     left.statement = recomposeStatement(left);
                 }
                 
-                optimised = newOptimisedUnionQuery(left, right);
+                result = newAlternativeUnionQuery(left, right);
             }
         }
         
-        return optimised;
+        return result;
     }
     
     private static String recomposeStatement(@Nonnull QueryImpl query) {
@@ -1258,29 +1245,26 @@ public class QueryImpl implements Query
     }
     
     /**
-     * convenience method for creating a UnionQueryImpl with proper settings.
+     * Convenience method for creating a UnionQueryImpl with proper settings.
      * 
-     * @param left
-     * @param right
-     * @return
+     * @param left the first subquery
+     * @param right the second subquery
+     * @return the union query
      */
-    private UnionQueryImpl newOptimisedUnionQuery(@Nonnull Query left, 
@Nonnull Query right) {
+    private UnionQueryImpl newAlternativeUnionQuery(@Nonnull Query left, 
@Nonnull Query right) {
         UnionQueryImpl u = new UnionQueryImpl(
             false, 
             checkNotNull(left, "`left` cannot be null"), 
             checkNotNull(right, "`right` cannot be null"),
-            this.settings, 
-            true);
+            this.settings);
         u.setExplain(explain);
+        u.setMeasure(measure);
+        u.setInternal(isInternal);
         return u;
     }
     
     @Override
-    public Query copyOf() throws IllegalStateException {
-        return copyOf(false);
-    }
-    
-    private Query copyOf(final boolean optimised) {
+    public Query copyOf() {
         if (isInit()) {
             throw new IllegalStateException("QueryImpl cannot be cloned once 
initialised.");
         }
@@ -1296,8 +1280,7 @@ public class QueryImpl implements Query
             this.constraint,
             cols.toArray(new ColumnImpl[0]),
             this.namePathMapper,
-            this.settings,
-            optimised);
+            this.settings);
         copy.explain = this.explain;
         copy.distinct = this.distinct;
         
@@ -1310,11 +1293,6 @@ public class QueryImpl implements Query
     }
 
     @Override
-    public boolean isOptimised() {
-        return optimised;
-    }
-
-    @Override
     public boolean isInternal() {
         return isInternal;
     }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java?rev=1715377&r1=1715376&r2=1715377&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java
 Fri Nov 20 15:35:40 2015
@@ -56,22 +56,12 @@ public class UnionQueryImpl implements Q
     private final QueryEngineSettings settings;
     private boolean isInternal;
     
-    /**
-     * whether the query is a result of optimisation or not
-     */
-    private boolean optimised;
-    
-    UnionQueryImpl(boolean unionAll, Query left, Query right, 
QueryEngineSettings settings) {
-        this(unionAll, left, right, settings, false);
-    }
-
     UnionQueryImpl(final boolean unionAll, final Query left, final Query right,
-                   final QueryEngineSettings settings, final boolean 
optimised) {
+                   final QueryEngineSettings settings) {
         this.unionAll = unionAll;
         this.left = left;
         this.right = right;
         this.settings = settings;
-        this.optimised = optimised;
     }
 
     @Override
@@ -370,7 +360,7 @@ public class UnionQueryImpl implements Q
     }
 
     @Override
-    public Query optimise() {
+    public Query buildAlternativeQuery() {
         return this;
     }
 
@@ -385,11 +375,6 @@ public class UnionQueryImpl implements Q
     }
 
     @Override
-    public boolean isOptimised() {
-        return optimised;
-    }
-
-    @Override
     public String getStatement() {
         return toString();
     }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AndImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AndImpl.java?rev=1715377&r1=1715376&r2=1715377&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AndImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AndImpl.java
 Fri Nov 20 15:35:40 2015
@@ -219,17 +219,17 @@ public class AndImpl extends ConstraintI
     }
 
     @Override
-    public Set<ConstraintImpl> simplifyForUnion() {
+    public Set<ConstraintImpl> convertToUnion() {
         Set<ConstraintImpl> union = Sets.newHashSet();
         Set<ConstraintImpl> result = Sets.newHashSet();
         Set<ConstraintImpl> nonUnion = Sets.newHashSet();
         
         for (ConstraintImpl c : constraints) {
-            Set<ConstraintImpl> ccc = c.simplifyForUnion();
-            if (ccc.isEmpty()) {
+            Set<ConstraintImpl> converted = c.convertToUnion();
+            if (converted.isEmpty()) {
                 nonUnion.add(c);
             } else {
-                union.addAll(ccc);
+                union.addAll(converted);
             }
         }
         if (!union.isEmpty() && nonUnion.size() == 1) {
@@ -240,7 +240,7 @@ public class AndImpl extends ConstraintI
                 result.add(new AndImpl(c, right));
             }
         } else {
-            // in this case prefer to be conservative and don't optimise. This 
could happen when for
+            // in this case prefer to be conservative and don't optimize. This 
could happen when for
             // example: WHERE (a OR b) AND (c OR d).
             // This should be translated into a AND c, a AND d, b AND c, b AND 
d.
         }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ConstraintImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ConstraintImpl.java?rev=1715377&r1=1715376&r2=1715377&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ConstraintImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ConstraintImpl.java
 Fri Nov 20 15:35:40 2015
@@ -161,23 +161,21 @@ public abstract class ConstraintImpl ext
     }
     
     /**
+     * Compute a set of sub-constraints that could be used for composing UNION
+     * statements. For example in case of "c=1 or c=2", it will return to the
+     * caller {@code [c=1, c=2]}. Those can be later on used for re-composing
+     * conditions.
      * <p>
-     * Compute a Set of sub-constraints that could be used for composing UNION 
statements. For
-     * example in case of {@code OR (c1, c2)} it will return to the caller 
{@code [c1, c2]}. Those
-     * can be later on used for re-composing conditions.
-     * </p>
+     * If it is not possible to convert to a union, it must return an empty 
set.
      * <p>
-     * If no union optimisations are possible it must return an empty set.
-     * </p>
-     * <p>
-     * Default implementation in {@link ConstraintImpl#simplifyForUnion()} 
always return an empty
-     * set.
-     * </p>
+     * The default implementation in {@link ConstraintImpl#convertToUnion()}
+     * always return an empty set.
      * 
-     * @return the set of constraints, if available
+     * @return the set of union constraints, if available, or an empty set if
+     *         conversion is not possible
      */
     @Nonnull
-    public Set<ConstraintImpl> simplifyForUnion() {
+    public Set<ConstraintImpl> convertToUnion() {
         return Collections.emptySet();
     }
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/OrImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/OrImpl.java?rev=1715377&r1=1715376&r2=1715377&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/OrImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/OrImpl.java
 Fri Nov 20 15:35:40 2015
@@ -358,17 +358,17 @@ public class OrImpl extends ConstraintIm
     }
 
     @Override
-    public Set<ConstraintImpl> simplifyForUnion() {
-        Set<ConstraintImpl> cc = Sets.newHashSet();
+    public Set<ConstraintImpl> convertToUnion() {
+        Set<ConstraintImpl> result = Sets.newHashSet();
         for (ConstraintImpl c : getConstraints()) {
-            Set<ConstraintImpl> ccc = c.simplifyForUnion(); 
-            if (ccc.isEmpty()) {
-                cc.add(c);
+            Set<ConstraintImpl> converted = c.convertToUnion(); 
+            if (converted.isEmpty()) {
+                result.add(c);
             } else {
-                cc.addAll(ccc);
+                result.addAll(converted);
             }
         }
-        return cc;
+        return result;
     }
 
     @Override

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/MultiPropertyOrTestOptimisation.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/MultiPropertyOrTestOptimisation.java?rev=1715377&r1=1715376&r2=1715377&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/MultiPropertyOrTestOptimisation.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/MultiPropertyOrTestOptimisation.java
 Fri Nov 20 15:35:40 2015
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.property;
 
-import static 
org.apache.jackrabbit.oak.query.QueryEngineImpl.ForceOptimised.OPTIMISED;
+import static 
org.apache.jackrabbit.oak.query.QueryEngineImpl.QuerySelectionMode.ALTERNATIVE;
 
 import org.junit.Before;
 
@@ -29,7 +29,7 @@ public class MultiPropertyOrTestOptimisa
     @Before
     public void before() throws Exception {
         super.before();
-        setForceOptimised(OPTIMISED);
+        setQuerySelectionMode(ALTERNATIVE);
         setTraversalEnabled(false);
     }    
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java?rev=1715377&r1=1715376&r2=1715377&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java
 Fri Nov 20 15:35:40 2015
@@ -56,7 +56,7 @@ import org.apache.jackrabbit.oak.json.Ty
 import org.apache.jackrabbit.oak.plugins.memory.BooleanPropertyState;
 import org.apache.jackrabbit.oak.plugins.memory.StringPropertyState;
 import org.apache.jackrabbit.oak.plugins.value.Conversions;
-import org.apache.jackrabbit.oak.query.QueryEngineImpl.ForceOptimised;
+import org.apache.jackrabbit.oak.query.QueryEngineImpl.QuerySelectionMode;
 import org.apache.jackrabbit.oak.query.xpath.XPathToSQL2Converter;
 import org.junit.Before;
 
@@ -329,8 +329,8 @@ public abstract class AbstractQueryTest
         ((QueryEngineImpl) qe).setTraversalEnabled(traversalEnabled);
     }
     
-    protected void setForceOptimised(@Nonnull ForceOptimised forceOptimised) {
-        ((QueryEngineImpl) qe).setForceOptimised(checkNotNull(forceOptimised));
+    protected void setQuerySelectionMode(@Nonnull QuerySelectionMode 
querySelectionMode) {
+        ((QueryEngineImpl) 
qe).setQuerySelectionMode(checkNotNull(querySelectionMode));
     }
 
     protected static String readRow(ResultRow row, boolean pathOnly) {

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/FilterTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/FilterTest.java?rev=1715377&r1=1715376&r2=1715377&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/FilterTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/FilterTest.java
 Fri Nov 20 15:35:40 2015
@@ -17,11 +17,11 @@
 
 package org.apache.jackrabbit.oak.query;
 
-import static junit.framework.Assert.assertFalse;
 import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
 import static 
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
 import static 
org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent.INITIAL_CONTENT;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 
 import java.text.ParseException;
 

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2OptimiseQueryTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2OptimiseQueryTest.java?rev=1715377&r1=1715376&r2=1715377&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2OptimiseQueryTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2OptimiseQueryTest.java
 Fri Nov 20 15:35:40 2015
@@ -24,9 +24,9 @@ import static org.apache.jackrabbit.JcrC
 import static org.apache.jackrabbit.oak.api.Type.NAME;
 import static 
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
 import static 
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.NT_OAK_UNSTRUCTURED;
-import static 
org.apache.jackrabbit.oak.query.QueryEngineImpl.ForceOptimised.CHEAPEST;
-import static 
org.apache.jackrabbit.oak.query.QueryEngineImpl.ForceOptimised.OPTIMISED;
-import static 
org.apache.jackrabbit.oak.query.QueryEngineImpl.ForceOptimised.ORIGINAL;
+import static 
org.apache.jackrabbit.oak.query.QueryEngineImpl.QuerySelectionMode.CHEAPEST;
+import static 
org.apache.jackrabbit.oak.query.QueryEngineImpl.QuerySelectionMode.ALTERNATIVE;
+import static 
org.apache.jackrabbit.oak.query.QueryEngineImpl.QuerySelectionMode.ORIGINAL;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNotSame;
@@ -97,11 +97,11 @@ public class SQL2OptimiseQueryTest exten
         statement = String.format("SELECT * FROM [%s] WHERE p = 'a' OR p = 
'b'",
             NT_OAK_UNSTRUCTURED);
         expected = of("/test/a", "/test/b", "/test2/a");
-        setForceOptimised(ORIGINAL);
+        setQuerySelectionMode(ORIGINAL);
         original = executeQuery(statement, JCR_SQL2, true);
-        setForceOptimised(OPTIMISED);
+        setQuerySelectionMode(ALTERNATIVE);
         optimised = executeQuery(statement, JCR_SQL2, true);
-        setForceOptimised(CHEAPEST);
+        setQuerySelectionMode(CHEAPEST);
         cheapest = executeQuery(statement, JCR_SQL2, true);
         assertOrToUnionResults(expected, original, optimised, cheapest);
         
@@ -109,11 +109,11 @@ public class SQL2OptimiseQueryTest exten
             "SELECT * FROM [%s] WHERE p = 'a' OR p = 'b' OR p = 'c' OR p = 'd' 
OR p = 'e' ",
             NT_OAK_UNSTRUCTURED);
         expected = of("/test/a", "/test/b", "/test/c", "/test/d", "/test/e", 
"/test2/a");
-        setForceOptimised(ORIGINAL);
+        setQuerySelectionMode(ORIGINAL);
         original = executeQuery(statement, JCR_SQL2, true);
-        setForceOptimised(OPTIMISED);
+        setQuerySelectionMode(ALTERNATIVE);
         optimised = executeQuery(statement, JCR_SQL2, true);
-        setForceOptimised(CHEAPEST);
+        setQuerySelectionMode(CHEAPEST);
         cheapest = executeQuery(statement, JCR_SQL2, true);
         assertOrToUnionResults(expected, original, optimised, cheapest);
 
@@ -121,11 +121,11 @@ public class SQL2OptimiseQueryTest exten
             "SELECT * FROM [%s] WHERE (p = 'a' OR p = 'b') AND (p1 = 'a1' OR 
p1 = 'b1')",
             NT_OAK_UNSTRUCTURED);
         expected = of("/test/a", "/test/b");
-        setForceOptimised(ORIGINAL);
+        setQuerySelectionMode(ORIGINAL);
         original = executeQuery(statement, JCR_SQL2, true);
-        setForceOptimised(OPTIMISED);
+        setQuerySelectionMode(ALTERNATIVE);
         optimised = executeQuery(statement, JCR_SQL2, true);
-        setForceOptimised(CHEAPEST);
+        setQuerySelectionMode(CHEAPEST);
         cheapest = executeQuery(statement, JCR_SQL2, true);
         assertOrToUnionResults(expected, original, optimised, cheapest);
 
@@ -133,11 +133,11 @@ public class SQL2OptimiseQueryTest exten
             "SELECT * FROM [%s] WHERE (p = 'a' AND p1 = 'a1') OR (p = 'b' AND 
p1 = 'b1')",
             NT_OAK_UNSTRUCTURED);
         expected = of("/test/a", "/test/b");
-        setForceOptimised(ORIGINAL);
+        setQuerySelectionMode(ORIGINAL);
         original = executeQuery(statement, JCR_SQL2, true);
-        setForceOptimised(OPTIMISED);
+        setQuerySelectionMode(ALTERNATIVE);
         optimised = executeQuery(statement, JCR_SQL2, true);
-        setForceOptimised(CHEAPEST);
+        setQuerySelectionMode(CHEAPEST);
         cheapest = executeQuery(statement, JCR_SQL2, true);
         assertOrToUnionResults(expected, original, optimised, cheapest);
         
@@ -148,11 +148,11 @@ public class SQL2OptimiseQueryTest exten
             + "AND ISDESCENDANTNODE(c, '/test') "
             + "ORDER BY added DESC";
         expected = of("/test/a", "/test/b", "/test/c");
-        setForceOptimised(ORIGINAL);
+        setQuerySelectionMode(ORIGINAL);
         original = executeQuery(statement, JCR_SQL2, true);
-        setForceOptimised(OPTIMISED);
+        setQuerySelectionMode(ALTERNATIVE);
         optimised = executeQuery(statement, JCR_SQL2, true);
-        setForceOptimised(CHEAPEST);
+        setQuerySelectionMode(CHEAPEST);
         cheapest = executeQuery(statement, JCR_SQL2, true);
         assertOrToUnionResults(expected, original, optimised, cheapest);
     }
@@ -197,7 +197,7 @@ public class SQL2OptimiseQueryTest exten
                 + "(c.[p1]='a' OR c.[p2]='b') ";
         original = parser.parse(statement, false);
         assertNotNull(original);
-        optimised = original.optimise();
+        optimised = original.buildAlternativeQuery();
         assertNotNull(optimised);
         assertNotSame(original, optimised);
         assertTrue(optimised instanceof UnionQueryImpl);
@@ -210,7 +210,7 @@ public class SQL2OptimiseQueryTest exten
                 + "ISDESCENDANTNODE(c, '/test') ";
         original = parser.parse(statement, false);
         assertNotNull(original);
-        optimised = original.optimise();
+        optimised = original.buildAlternativeQuery();
         assertNotNull(optimised);
         assertNotSame(original, optimised);
         
@@ -222,7 +222,7 @@ public class SQL2OptimiseQueryTest exten
                 + "ISDESCENDANTNODE(c, '/test') ";
         original = parser.parse(statement, false);
         assertNotNull(original);
-        optimised = original.optimise();
+        optimised = original.buildAlternativeQuery();
         assertNotNull(optimised);
         assertNotSame(original, optimised);
     }

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java?rev=1715377&r1=1715376&r2=1715377&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java
 Fri Nov 20 15:35:40 2015
@@ -16,10 +16,10 @@
  */
 package org.apache.jackrabbit.oak.query;
 
-import static junit.framework.Assert.assertTrue;
 import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
 import static 
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
 import static 
org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent.INITIAL_CONTENT;
+import static org.junit.Assert.assertTrue;
 
 import java.text.ParseException;
 

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/AndImplTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/AndImplTest.java?rev=1715377&r1=1715376&r2=1715377&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/AndImplTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/AndImplTest.java
 Fri Nov 20 15:35:40 2015
@@ -40,7 +40,7 @@ public class AndImplTest {
         op2 = mock(ComparisonImpl.class);
         and = new AndImpl(op1, op2);
         expected = emptySet();
-        assertThat(and.simplifyForUnion(), is(expected));
+        assertThat(and.convertToUnion(), is(expected));
 
         op1 = mockConstraint("op1", ComparisonImpl.class);
         op2 = mockConstraint("op2", ComparisonImpl.class);
@@ -50,7 +50,7 @@ public class AndImplTest {
             (ConstraintImpl) new AndImpl(op1, op3)
             , (ConstraintImpl) new AndImpl(op2, op3)
         );
-        assertThat(and.simplifyForUnion(), is(expected));
+        assertThat(and.convertToUnion(), is(expected));
 
         op1 = mockConstraint("op1", ComparisonImpl.class);
         op2 = mockConstraint("op2", ComparisonImpl.class);
@@ -62,7 +62,7 @@ public class AndImplTest {
             , (ConstraintImpl) new AndImpl(op2, op3)
             , (ConstraintImpl) new AndImpl(op4, op3)
         );
-        assertThat(and.simplifyForUnion(), is(expected));
+        assertThat(and.convertToUnion(), is(expected));
 }
     
     /**

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/OrImplTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/OrImplTest.java?rev=1715377&r1=1715376&r2=1715377&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/OrImplTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/ast/OrImplTest.java
 Fri Nov 20 15:35:40 2015
@@ -35,14 +35,14 @@ public class OrImplTest {
         op2 = mock(ComparisonImpl.class);
         or = new OrImpl(op1, op2);
         expected = of(op1, op2);
-        assertThat(or.simplifyForUnion(), is(expected));
+        assertThat(or.convertToUnion(), is(expected));
         
         op1 = mock(ComparisonImpl.class);
         op2 = mock(ComparisonImpl.class);
         op3 = mock(ComparisonImpl.class);
         or = new OrImpl(new OrImpl(op1, op2), op3);
         expected = of(op1, op2, op3);
-        assertThat(or.simplifyForUnion(), is(expected));
+        assertThat(or.convertToUnion(), is(expected));
 
         op1 = mock(ComparisonImpl.class);
         op2 = mock(ComparisonImpl.class);
@@ -50,6 +50,6 @@ public class OrImplTest {
         op4 = mock(ComparisonImpl.class);
         or = new OrImpl(new OrImpl(new OrImpl(op1, op4), op2), op3);
         expected = of(op1, op2, op3, op4);
-        assertThat(or.simplifyForUnion(), is(expected));
+        assertThat(or.convertToUnion(), is(expected));
     }
 }



Reply via email to