diff options
Diffstat (limited to 'src/main/java/com/amazon')
| -rw-r--r-- | src/main/java/com/amazon/carbonado/qe/FilteringScore.java | 83 | 
1 files changed, 83 insertions, 0 deletions
| diff --git a/src/main/java/com/amazon/carbonado/qe/FilteringScore.java b/src/main/java/com/amazon/carbonado/qe/FilteringScore.java index d3b3f35..ebbb189 100644 --- a/src/main/java/com/amazon/carbonado/qe/FilteringScore.java +++ b/src/main/java/com/amazon/carbonado/qe/FilteringScore.java @@ -206,6 +206,22 @@ public class FilteringScore<S extends Storable> {                  indexProperties[indexPropPos].getDirection() == Direction.DESCENDING;
          }
 +        List<PropertyFilter<S>> weakMatchFilters = null;
 +        if (!filterList.isEmpty()) {
 +            // Any remainder property which is provided by the index is a weak match.
 +            for (PropertyFilter<S> subFilter : filterList) {
 +                ChainedProperty<S> filterProp = subFilter.getChainedProperty();
 +                for (OrderedProperty<S> indexProp : indexProperties) {
 +                    if (indexProp.getChainedProperty().equals(filterProp)) {
 +                        if (weakMatchFilters == null) {
 +                            weakMatchFilters = new ArrayList<PropertyFilter<S>>();
 +                        }
 +                        weakMatchFilters.add(subFilter);
 +                    }
 +                }
 +            }
 +        }
 +
          return new FilteringScore<S>(clustered,
                                       unique,
                                       indexProperties.length,
 @@ -215,6 +231,7 @@ public class FilteringScore<S extends Storable> {                                       arrangementScore,
                                       preferenceScore,
                                       filterList,
 +                                     weakMatchFilters,
                                       shouldReverseRange);
      }
 @@ -275,11 +292,14 @@ public class FilteringScore<S extends Storable> {      private final BigInteger mPreferenceScore;
      private final List<PropertyFilter<S>> mRemainderFilters;
 +    private final List<PropertyFilter<S>> mWeakMatchFilters;
      private final boolean mShouldReverseRange;
      private transient Filter<S> mIdentityFilter;
      private transient Filter<S> mRemainderFilter;
 +    private transient Filter<S> mWeakMatchFilter;
 +    private transient Filter<S> mWeakMatchRemainderFilter;
      private FilteringScore(boolean indexClustered,
                             boolean indexUnique,
 @@ -290,6 +310,7 @@ public class FilteringScore<S extends Storable> {                             int arrangementScore,
                             BigInteger preferenceScore,
                             List<PropertyFilter<S>> remainderFilters,
 +                           List<PropertyFilter<S>> weakMatchFilters,
                             boolean shouldReverseRange)
      {
          mIndexClustered = indexClustered;
 @@ -301,6 +322,7 @@ public class FilteringScore<S extends Storable> {          mArrangementScore = arrangementScore;
          mPreferenceScore = preferenceScore;
          mRemainderFilters = prepareList(remainderFilters);
 +        mWeakMatchFilters = prepareList(weakMatchFilters);
          mShouldReverseRange = shouldReverseRange;
      }
 @@ -519,6 +541,59 @@ public class FilteringScore<S extends Storable> {      }
      /**
 +     * Returns number of property filters which are weakly supported by the
 +     * evaluated index. This count is no more than the remainder count.
 +     */
 +    public int getWeakMatchCount() {
 +        return mWeakMatchFilters.size();
 +    }
 +
 +    /**
 +     * Returns the filters which are weakly supported by the evaluated index,
 +     * which is a subset of the remainder filters.
 +     */
 +    public List<PropertyFilter<S>> getWeakMatchFilters() {
 +        return mWeakMatchFilters;
 +    }
 +
 +    /**
 +     * Returns the composite weak match filter supported by the evaluated
 +     * index, or null if no weak match.
 +     */
 +    public Filter<S> getWeakMatchFilter() {
 +        if (mWeakMatchFilter == null) {
 +            mWeakMatchFilter = buildCompositeFilter(getWeakMatchFilters());
 +        }
 +        return mWeakMatchFilter;
 +    }
 +
 +    /**
 +     * Returns the composite remainder filter without including the weak match
 +     * filter. Returns null if no remainder.
 +     */
 +    public Filter<S> getWeakMatchRemainderFilter() {
 +        if (mWeakMatchRemainderFilter == null) {
 +            List<PropertyFilter<S>> remainderFilters = mRemainderFilters;
 +            List<PropertyFilter<S>> weakMatchFilters = mWeakMatchFilters;
 +            if (weakMatchFilters.size() < remainderFilters.size()) {
 +                Filter<S> composite = null;
 +                for (int i=0; i<remainderFilters.size(); i++) {
 +                    Filter<S> subFilter = remainderFilters.get(i);
 +                    if (!weakMatchFilters.contains(subFilter)) {
 +                        if (composite == null) {
 +                            composite = subFilter;
 +                        } else {
 +                            composite = composite.and(subFilter);
 +                        }
 +                    }
 +                }
 +                mWeakMatchRemainderFilter = composite;
 +            }
 +        }
 +        return mWeakMatchRemainderFilter;
 +    }
 +
 +    /**
       * Returns true if evaluated index is unique and each of its properties has
       * an identity match. When index and filter are used in a query, expect at
       * most one result.
 @@ -589,6 +664,7 @@ public class FilteringScore<S extends Storable> {              ", hasRangeStart=" + hasRangeStart() +
              ", hasRangeEnd=" + hasRangeEnd() +
              ", remainderCount=" + getRemainderCount() +
 +            ", weakMatchCount=" + getWeakMatchCount() +
              '}';
      }
 @@ -712,6 +788,13 @@ public class FilteringScore<S extends Storable> {                  return 1;
              }
 +            // Favor index which contains more weak matches.
 +            if (first.getWeakMatchCount() > second.getWeakMatchCount()) {
 +                return -1;
 +            } else if (first.getWeakMatchCount() < second.getWeakMatchCount()) {
 +                return 1;
 +            }
 +
              // Favor index with fewer properties, under the assumption that fewer
              // properties means smaller sized records that need to be read in.
              if (first.getIndexPropertyCount() < second.getIndexPropertyCount()) {
 | 
