aboutsummaryrefslogtreecommitdiffstats
path: root/predicate-search-core/src/main/java/com/yahoo/search/predicate/optimization/PredicateOptions.java
diff options
context:
space:
mode:
Diffstat (limited to 'predicate-search-core/src/main/java/com/yahoo/search/predicate/optimization/PredicateOptions.java')
-rw-r--r--predicate-search-core/src/main/java/com/yahoo/search/predicate/optimization/PredicateOptions.java87
1 files changed, 87 insertions, 0 deletions
diff --git a/predicate-search-core/src/main/java/com/yahoo/search/predicate/optimization/PredicateOptions.java b/predicate-search-core/src/main/java/com/yahoo/search/predicate/optimization/PredicateOptions.java
new file mode 100644
index 00000000000..134d52dd3ab
--- /dev/null
+++ b/predicate-search-core/src/main/java/com/yahoo/search/predicate/optimization/PredicateOptions.java
@@ -0,0 +1,87 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.search.predicate.optimization;
+
+import java.util.OptionalLong;
+
+/**
+ * This class contains the configured options for predicate indexes.
+ * The adjusted bounds are extended to the nearest power of the arity (-1)
+ * and are used to generate more efficient indexes.
+ *
+ * @author magnarn
+ * @author bjorncs
+ */
+public class PredicateOptions {
+ public static final long DEFAULT_LOWER_BOUND = 0x8000000000000000L;
+ public static final long DEFAULT_UPPER_BOUND = 0x7fffffffffffffffL;
+
+ private final int arity;
+ private final long lowerBound;
+ private final long upperBound;
+ private OptionalLong adjustedLowerBound;
+ private OptionalLong adjustedUpperBound;
+
+ public PredicateOptions(int arity, Long lowerBound, Long upperBound) {
+ this.arity = arity;
+ this.lowerBound = lowerBound == null? DEFAULT_LOWER_BOUND : lowerBound;
+ this.upperBound = upperBound == null? DEFAULT_UPPER_BOUND : upperBound;
+ this.adjustedLowerBound = OptionalLong.empty();
+ this.adjustedUpperBound = OptionalLong.empty();
+ }
+
+ public PredicateOptions(int arity) {
+ this(arity, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND);
+ }
+
+ public int getArity() {
+ return arity;
+ }
+
+ public long getLowerBound() {
+ return lowerBound;
+ }
+
+ public long getUpperBound() {
+ return upperBound;
+ }
+
+ public long getAdjustedLowerBound() {
+ if (!adjustedLowerBound.isPresent()) {
+ if (lowerBound == DEFAULT_LOWER_BOUND) {
+ adjustedLowerBound = OptionalLong.of(lowerBound);
+ } else if (lowerBound > 0) {
+ adjustedLowerBound = OptionalLong.of(0L);
+ } else {
+ adjustedLowerBound = OptionalLong.of(-adjustBound(arity, -lowerBound));
+ }
+ }
+ return adjustedLowerBound.getAsLong();
+ }
+
+ public long getAdjustedUpperBound() {
+ if (!adjustedUpperBound.isPresent()) {
+ if (upperBound == DEFAULT_UPPER_BOUND) {
+ adjustedUpperBound = OptionalLong.of(DEFAULT_UPPER_BOUND);
+ } else if (upperBound < 0) {
+ adjustedUpperBound = OptionalLong.of(-1L); // 0 belongs to the positive range.
+ } else {
+ adjustedUpperBound = OptionalLong.of(adjustBound(arity, upperBound));
+ }
+ }
+ return adjustedUpperBound.getAsLong();
+ }
+
+ private static long adjustBound(int arity, long bound) {
+ long adjusted = arity;
+ long value = bound;
+ long max = Long.MAX_VALUE / arity;
+ while ((value/=arity) > 0) {
+ if (adjusted > max) {
+ return bound;
+ }
+ adjusted *= arity;
+ }
+ return adjusted - 1;
+ }
+}
+