summaryrefslogtreecommitdiff
path: root/src/main/java/com/amazon
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/amazon')
-rw-r--r--src/main/java/com/amazon/carbonado/filter/AndFilter.java7
-rw-r--r--src/main/java/com/amazon/carbonado/filter/BinaryOpFilter.java3
-rw-r--r--src/main/java/com/amazon/carbonado/filter/ClosedFilter.java4
-rw-r--r--src/main/java/com/amazon/carbonado/filter/Filter.java9
-rw-r--r--src/main/java/com/amazon/carbonado/filter/OpenFilter.java4
-rw-r--r--src/main/java/com/amazon/carbonado/filter/OrFilter.java7
-rw-r--r--src/main/java/com/amazon/carbonado/filter/PropertyFilter.java8
-rw-r--r--src/main/java/com/amazon/carbonado/qe/IndexedQueryAnalyzer.java10
-rw-r--r--src/main/java/com/amazon/carbonado/qe/UnionQueryAnalyzer.java10
9 files changed, 56 insertions, 6 deletions
diff --git a/src/main/java/com/amazon/carbonado/filter/AndFilter.java b/src/main/java/com/amazon/carbonado/filter/AndFilter.java
index 92c3937..a5aa61e 100644
--- a/src/main/java/com/amazon/carbonado/filter/AndFilter.java
+++ b/src/main/java/com/amazon/carbonado/filter/AndFilter.java
@@ -53,6 +53,13 @@ public class AndFilter<S extends Storable> extends BinaryOpFilter<S> {
return visitor.visit(this, param);
}
+ public Filter<S> unbind() {
+ if (!isBound()) {
+ return this;
+ }
+ return mLeft.unbind().and(mRight.unbind());
+ }
+
Filter<S> buildDisjunctiveNormalForm() {
Filter<S> left = mLeft.reduce().dnf();
Filter<S> right = mRight.reduce().dnf();
diff --git a/src/main/java/com/amazon/carbonado/filter/BinaryOpFilter.java b/src/main/java/com/amazon/carbonado/filter/BinaryOpFilter.java
index c95f493..462acf4 100644
--- a/src/main/java/com/amazon/carbonado/filter/BinaryOpFilter.java
+++ b/src/main/java/com/amazon/carbonado/filter/BinaryOpFilter.java
@@ -49,6 +49,9 @@ public abstract class BinaryOpFilter<S extends Storable> extends Filter<S> {
}
mLeft = left;
mRight = right;
+ if (left.isBound() && right.isBound()) {
+ markBound();
+ }
}
public Filter<S> getLeftFilter() {
diff --git a/src/main/java/com/amazon/carbonado/filter/ClosedFilter.java b/src/main/java/com/amazon/carbonado/filter/ClosedFilter.java
index 4584109..7895a3d 100644
--- a/src/main/java/com/amazon/carbonado/filter/ClosedFilter.java
+++ b/src/main/java/com/amazon/carbonado/filter/ClosedFilter.java
@@ -66,6 +66,10 @@ public class ClosedFilter<S extends Storable> extends Filter<S> {
return true;
}
+ public Filter<S> unbind() {
+ return this;
+ }
+
void markBound() {
}
diff --git a/src/main/java/com/amazon/carbonado/filter/Filter.java b/src/main/java/com/amazon/carbonado/filter/Filter.java
index 9d55a99..338b768 100644
--- a/src/main/java/com/amazon/carbonado/filter/Filter.java
+++ b/src/main/java/com/amazon/carbonado/filter/Filter.java
@@ -416,6 +416,15 @@ public abstract class Filter<S extends Storable> implements Appender {
public abstract Filter<S> bind();
/**
+ * Undoes the effect of a bind operation. The returned filter might still
+ * report itself as bound if it doesn't make a distinction between these
+ * states.
+ *
+ * @return canonical Filter instance with unbound property filters
+ */
+ public abstract Filter<S> unbind();
+
+ /**
* Returns true if all property filters are known to be properly
* bound. This is a side effect of calling {@link #bind}, {@link
* #initialFilterValues}, {@link #disjunctiveNormalForm} or {@link
diff --git a/src/main/java/com/amazon/carbonado/filter/OpenFilter.java b/src/main/java/com/amazon/carbonado/filter/OpenFilter.java
index 407aed0..6f6e211 100644
--- a/src/main/java/com/amazon/carbonado/filter/OpenFilter.java
+++ b/src/main/java/com/amazon/carbonado/filter/OpenFilter.java
@@ -62,6 +62,10 @@ public class OpenFilter<S extends Storable> extends Filter<S> {
return this;
}
+ public Filter<S> unbind() {
+ return this;
+ }
+
public boolean isBound() {
return true;
}
diff --git a/src/main/java/com/amazon/carbonado/filter/OrFilter.java b/src/main/java/com/amazon/carbonado/filter/OrFilter.java
index 027ea21..1e7bf72 100644
--- a/src/main/java/com/amazon/carbonado/filter/OrFilter.java
+++ b/src/main/java/com/amazon/carbonado/filter/OrFilter.java
@@ -53,6 +53,13 @@ public class OrFilter<S extends Storable> extends BinaryOpFilter<S> {
return visitor.visit(this, param);
}
+ public Filter<S> unbind() {
+ if (!isBound()) {
+ return this;
+ }
+ return mLeft.unbind().or(mRight.unbind());
+ }
+
Filter<S> buildDisjunctiveNormalForm() {
return mLeft.dnf().or(mRight.dnf()).reduce();
}
diff --git a/src/main/java/com/amazon/carbonado/filter/PropertyFilter.java b/src/main/java/com/amazon/carbonado/filter/PropertyFilter.java
index 8fe03d6..824d1d1 100644
--- a/src/main/java/com/amazon/carbonado/filter/PropertyFilter.java
+++ b/src/main/java/com/amazon/carbonado/filter/PropertyFilter.java
@@ -160,6 +160,10 @@ public class PropertyFilter<S extends Storable> extends Filter<S> {
return mBindID == 0 ? getCanonical(this, 1) : this;
}
+ public Filter<S> unbind() {
+ return mBindID == 0 ? this : getCanonical(this, 0);
+ }
+
public boolean isBound() {
return mBindID != 0;
}
@@ -428,11 +432,9 @@ public class PropertyFilter<S extends Storable> extends Filter<S> {
app.append(String.valueOf(mConstant));
} else {
app.append('?');
- /* Uncomment for testing
- if (mBindID != 0) {
+ if (mBindID > 1) {
app.append('[').append(String.valueOf(mBindID)).append(']');
}
- */
}
}
diff --git a/src/main/java/com/amazon/carbonado/qe/IndexedQueryAnalyzer.java b/src/main/java/com/amazon/carbonado/qe/IndexedQueryAnalyzer.java
index 76fb5f5..d0bd63f 100644
--- a/src/main/java/com/amazon/carbonado/qe/IndexedQueryAnalyzer.java
+++ b/src/main/java/com/amazon/carbonado/qe/IndexedQueryAnalyzer.java
@@ -431,6 +431,16 @@ public class IndexedQueryAnalyzer<S extends Storable> {
return new Result(this, filter, getRemainderOrderings());
}
+ public String toString() {
+ return "IndexedQueryAnalyzer.Result {score="
+ + getCompositeScore() + ", localIndex="
+ + getLocalIndex() + ", foreignIndex="
+ + getForeignIndex() + ", foreignProperty="
+ + getForeignProperty() + ", remainderFilter="
+ + getRemainderFilter() + ", remainderOrderings="
+ + getRemainderOrderings() + '}';
+ }
+
private boolean equals(Object a, Object b) {
return a == null ? (b == null) : (a.equals(b));
}
diff --git a/src/main/java/com/amazon/carbonado/qe/UnionQueryAnalyzer.java b/src/main/java/com/amazon/carbonado/qe/UnionQueryAnalyzer.java
index 9ed94fd..5648d21 100644
--- a/src/main/java/com/amazon/carbonado/qe/UnionQueryAnalyzer.java
+++ b/src/main/java/com/amazon/carbonado/qe/UnionQueryAnalyzer.java
@@ -77,9 +77,13 @@ public class UnionQueryAnalyzer<S extends Storable> {
throw new IllegalArgumentException("Filter must be bound");
}
+ if (orderings == null) {
+ orderings = Collections.emptyList();
+ }
+
List<IndexedQueryAnalyzer<S>.Result> subResults = splitIntoSubResults(filter, orderings);
- if (subResults.size() < 1) {
+ if (subResults.size() <= 1) {
// Total ordering not required.
return new Result(subResults);
}
@@ -112,7 +116,7 @@ public class UnionQueryAnalyzer<S extends Storable> {
// since one simple change might alter the query plan.
subResults = splitIntoSubResults(filter, orderings);
- if (subResults.size() < 1) {
+ if (subResults.size() <= 1) {
// Total ordering no longer required.
return new Result(subResults);
}
@@ -183,7 +187,7 @@ public class UnionQueryAnalyzer<S extends Storable> {
orderings.add(OrderedProperty.get(bestProperty, best.getBestDirection()));
subResults = splitIntoSubResults(filter, orderings);
- if (subResults.size() < 1) {
+ if (subResults.size() <= 1) {
// Total ordering no longer required.
break;
}