You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by th...@apache.org on 2013/07/15 11:06:27 UTC

svn commit: r1503145 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/query/ main/java/org/apache/jackrabbit/oak/query/ast/ test/resources/org/apache/jackrabbit/oak/query/

Author: thomasm
Date: Mon Jul 15 09:06:26 2013
New Revision: 1503145

URL: http://svn.apache.org/r1503145
Log:
OAK-899 Query: simplify duplicate conditions

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/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/resources/org/apache/jackrabbit/oak/query/sql2_index.txt

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=1503145&r1=1503144&r2=1503145&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 Mon Jul 15 09:06:26 2013
@@ -89,11 +89,11 @@ public class Query {
 
     final SourceImpl source;
     final String statement;
-    final ConstraintImpl constraint;
     final HashMap<String, PropertyValue> bindVariableMap = new HashMap<String, PropertyValue>();
     final HashMap<String, Integer> selectorIndexes = new HashMap<String, Integer>();
     final ArrayList<SelectorImpl> selectors = new ArrayList<SelectorImpl>();
-
+    ConstraintImpl constraint;
+    
     private QueryEngineImpl queryEngine;
     private final OrderingImpl[] orderings;
     private ColumnImpl[] columns;
@@ -291,6 +291,9 @@ public class Query {
             }
 
         }.visit(this);
+        if (constraint != null) {
+            constraint = constraint.simplify();
+        }
         source.setQueryConstraint(constraint);
         source.init(this);
         for (ColumnImpl column : columns) {

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=1503145&r1=1503144&r2=1503145&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 Mon Jul 15 09:06:26 2013
@@ -46,6 +46,14 @@ public class AndImpl extends ConstraintI
     public ConstraintImpl getConstraint2() {
         return constraint2;
     }
+
+    @Override
+    public ConstraintImpl simplify() {
+        if (constraint1.equals(constraint2)) {
+            return constraint1;
+        }
+        return this;
+    }
     
     @Override
     public Set<PropertyExistenceImpl> getPropertyExistenceConditions() {

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=1503145&r1=1503144&r2=1503145&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 Mon Jul 15 09:06:26 2013
@@ -25,6 +25,16 @@ import org.apache.jackrabbit.oak.query.i
  * The base class for constraints.
  */
 public abstract class ConstraintImpl extends AstElement {
+    
+    /**
+     * Simplify the expression if possible, for example by removing duplicate expressions.
+     * For example, "x=1 or x=1" should be simplified to "x=1".
+     * 
+     * @return the simplified constraint, or "this" if it is not possible to simplify
+     */
+    public ConstraintImpl simplify() {
+        return this;
+    }
 
     /**
      * Evaluate the result using the currently set values.
@@ -79,5 +89,20 @@ public abstract class ConstraintImpl ext
      * @param s the selector
      */
     public abstract void restrictPushDown(SelectorImpl s);
+    
+    @Override
+    public boolean equals(Object other) {
+        if (other == this) {
+            return true;
+        } else if (!(other instanceof ConstraintImpl)) {
+            return false;
+        }
+        return toString().equals(other.toString());
+    }
+
+    @Override
+    public int hashCode() {
+        return toString().hashCode();
+    }
 
 }

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=1503145&r1=1503144&r2=1503145&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 Mon Jul 15 09:06:26 2013
@@ -50,6 +50,14 @@ public class OrImpl extends ConstraintIm
     }
     
     @Override
+    public ConstraintImpl simplify() {
+        if (constraint1.equals(constraint2)) {
+            return constraint1;
+        }
+        return this;
+    }
+    
+    @Override
     public Set<PropertyExistenceImpl> getPropertyExistenceConditions() {
         // for the condition "x=1 or x=2", the existence condition
         // "x is not null" be be derived

Modified: jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt?rev=1503145&r1=1503144&r2=1503145&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt Mon Jul 15 09:06:26 2013
@@ -28,6 +28,9 @@
 explain select excerpt(.) from [nt:resource] where contains(*, 'jackrabbit')
 [nt:resource] as [nt:resource] /* traverse "*" where contains([nt:resource].[*], cast('jackrabbit' as string)) */
 
+explain select excerpt(.) from [nt:resource] where contains(*, 'jackrabbit') or contains(*, 'jackrabbit')
+[nt:resource] as [nt:resource] /* traverse "*" where contains([nt:resource].[*], cast('jackrabbit' as string)) */
+
 explain select * from [nt:base] where [jcr:uuid]=1 or [b]=2
 [nt:base] as [nt:base] /* traverse "*" */