@Override IntItem newTermItem(String word) { return new IntItem(word); }
private Number getOr(Number defaultValue, int valueIndex, String[] values) { if (valueIndex >= values.length) return defaultValue; if (values[valueIndex] == null) return defaultValue; if (values[valueIndex].isEmpty()) return defaultValue; return asNumber(values[valueIndex]); }
public Item toItem(String fieldName) { return IntItem.from(fieldName, from, to, 0); }
public Range(IntItem range) { from = range.getFromLimit(); to = range.getToLimit(); }
public boolean isCompatibleWith(IntItem item) { if ( ! indexName.equals(item.getIndexName())) return false; if (creator != item.getCreator()) return false; if (ranked != item.isRanked()) return false; if (weight != item.getWeight()) return false; return true; }
private IndexedItem convertIntToWord(Item orig) { IntItem o = (IntItem) orig; return new WordItem(o.stringValue(), o.getIndexName(), o.isFromQuery()); }
private IntItem numberSmaller() { int position = tokens.getPosition(); IntItem item = null; try { Token initial = tokens.next(); if (initial.kind != SMALLER) return null; boolean negative = tokens.skipNoIgnore(MINUS); if ( ! tokens.currentIs(NUMBER)) return null; item = new IntItem("<" + (negative ? "-" : "") + tokens.next() + decimalPart(), true); item.setOrigin(new Substring(initial.substring.start, tokens.currentNoIgnore().substring.start, initial.getSubstring().getSuperstring())); // XXX: Unsafe end? return item; } finally { if (item == null) { tokens.setPosition(position); } } }
private boolean optimizeAnd(AndItem and, IndexFacts.Session indexFacts) { // Find consolidated ranges by collecting a list of compatible ranges List<FieldRange> fieldRanges = null; for (Iterator<Item> i = and.getItemIterator(); i.hasNext(); ) { Item item = i.next(); if ( ! (item instanceof IntItem)) continue; IntItem intItem = (IntItem)item; if (intItem.getHitLimit() != 0) continue; // each such op gets a different partial set: Cannot be optimized if (intItem.getFromLimit().equals(intItem.getToLimit())) continue; // don't optimize searches for single numbers if (indexFacts.getIndex(intItem.getIndexName()).isMultivalue()) continue; // May match different values in each range if (fieldRanges == null) fieldRanges = new ArrayList<>(); Optional<FieldRange> compatibleRange = findCompatibleRange(intItem, fieldRanges); if (compatibleRange.isPresent()) compatibleRange.get().addRange(intItem); else fieldRanges.add(new FieldRange(intItem)); i.remove(); } // Add consolidated ranges if (fieldRanges == null) return false; boolean optimized = false; for (FieldRange fieldRange : fieldRanges) { and.addItem(fieldRange.toItem()); optimized |= fieldRange.isOptimization(); } return optimized; }
@Override boolean serialize(StringBuilder destination, Item item) { IntItem intItem = (IntItem) item; if (intItem.getFromLimit().number().equals(intItem.getToLimit().number())) { destination.append(normalizeIndexName(intItem.getIndexName())).append(" = "); annotatedNumberImage(intItem, intItem.getFromLimit().number().toString(), destination); } else if (intItem.getFromLimit().isInfinite()) { destination.append(normalizeIndexName(intItem.getIndexName())); destination.append(intItem.getToLimit().isInclusive() ? " <= " : " < "); annotatedNumberImage(intItem, intItem.getToLimit().number().toString(), destination); } else if (intItem.getToLimit().isInfinite()) { destination.append(normalizeIndexName(intItem.getIndexName())); destination.append(intItem.getFromLimit().isInclusive() ? " >= " : " > "); annotatedNumberImage(intItem, intItem.getFromLimit().number().toString(), destination); } else { serializeAsRange(destination, intItem); } return false; }
@Override public boolean equals(Object object) { if ( ! super.equals(object)) return false; IntItem other = (IntItem) object; // Ensured by superclass if ( ! getFromLimit().equals(other.getFromLimit())) return false; if ( ! getToLimit().equals(other.getToLimit())) return false; if ( getHitLimit() != other.getHitLimit()) return false; return true; }
private void parseAndAssignLimits(String e) { if (e.startsWith("<") && ! e.contains(";")) { from = Limit.NEGATIVE_INFINITY; to = new Limit(asNumber(e.substring(1)), false); } else if (e.startsWith(">")) { from = new Limit(asNumber(e.substring(1)), false); to = Limit.POSITIVE_INFINITY; } else if (e.startsWith("[") || e.startsWith("<")) { if ( ! (e.endsWith("]") || e.endsWith(">"))) throw new IllegalArgumentException("No closing bracket"); boolean inclusiveStart = e.startsWith("["); boolean inclusiveEnd = e.startsWith("["); String[] limits = e.substring(1, e.length()-1).split(";"); if (limits.length < 1 || limits.length > 3) throw new IllegalArgumentException("Unexpected bracket content"); Limit from = new Limit(getOr(Double.NEGATIVE_INFINITY, 0, limits), inclusiveStart); Limit to = new Limit(getOr(Double.POSITIVE_INFINITY, 1, limits), inclusiveEnd); setLimits(from, to); hitLimit = getOr(0, 2, limits).intValue(); } else { to = from = new Limit(asNumber(e), true); } }
firstWord = new WordItem(asInt.stringValue(), asInt.getIndexName(), true, asInt.getOrigin()); firstWord = new WordItem(asInt.stringValue(), asInt.getIndexName(), true, asInt.getOrigin());
@Override protected void encodeThis(ByteBuffer buffer) { super.encodeThis(buffer); // takes care of index bytes putString(getEncodedInt(), buffer); }
@Override protected String getValue(TermItem item) { return ((IntItem)item).getNumber(); } }
/** Returns the number for encoding; the number expression as-is. */ protected String getEncodedInt() { return getIndexedString(); }
int hitLimit = ((IntItem) item).getHitLimit(); if (hitLimit != 0) { comma(annotation, initLen);
private IntItem numberGreater() { int position = tokens.getPosition(); IntItem item = null; try { Token initial = tokens.next(); if (initial.kind != GREATER) return null; boolean negative = tokens.skipNoIgnore(MINUS); if ( ! tokens.currentIs(NUMBER)) return null; item = new IntItem(">" + (negative ? "-" : "") + tokens.next() + decimalPart(), true); item.setOrigin(new Substring(initial.substring.start, tokens.currentNoIgnore().substring.start, initial.getSubstring().getSuperstring())); // XXX: Unsafe end? return item; } finally { if (item == null) { tokens.setPosition(position); } } }
public FieldRange(IntItem item) { this.indexName = item.getIndexName(); this.creator = item.getCreator(); this.ranked = item.isRanked(); this.weight = item.getWeight(); addRange(item); }
private void serializeAsRange(StringBuilder destination, IntItem intItem) { String annotations = leafAnnotations(intItem); boolean leftOpen = !intItem.getFromLimit().isInclusive(); boolean rightOpen = !intItem.getToLimit().isInclusive(); String boundsAnnotation = ""; int initLen; .append(normalizeIndexName(intItem.getIndexName())) .append(", ").append(intItem.getFromLimit().number()) .append(", ").append(intItem.getToLimit().number()) .append(")");
@Override public String getRawWord() { return getNumber(); }