use of com.yahoo.prelude.query.Item in project vespa by vespa-engine.
the class YqlParser method instantiateWordItem.
@NonNull
private Item instantiateWordItem(String field, String rawWord, OperatorNode<ExpressionOperator> ast, Class<?> parent, SegmentWhen segmentPolicy, boolean exactMatch, Language language) {
String wordData = rawWord;
if (getAnnotation(ast, NFKC, Boolean.class, Boolean.FALSE, "setting for whether to NFKC normalize input data")) {
// NOTE: If this is set to FALSE (default), we will still NFKC normalize text data
// during tokenization/segmentation, as that is always turned on also on the indexing side.
wordData = normalizer.normalize(wordData);
}
boolean fromQuery = getAnnotation(ast, IMPLICIT_TRANSFORMS, Boolean.class, Boolean.TRUE, IMPLICIT_TRANSFORMS_DESCRIPTION);
boolean prefixMatch = getAnnotation(ast, PREFIX, Boolean.class, Boolean.FALSE, "setting for whether to use prefix match of input data");
boolean suffixMatch = getAnnotation(ast, SUFFIX, Boolean.class, Boolean.FALSE, "setting for whether to use suffix match of input data");
boolean substrMatch = getAnnotation(ast, SUBSTRING, Boolean.class, Boolean.FALSE, "setting for whether to use substring match of input data");
Preconditions.checkArgument((prefixMatch ? 1 : 0) + (substrMatch ? 1 : 0) + (suffixMatch ? 1 : 0) < 2, "Only one of prefix, substring and suffix can be set.");
@NonNull final TaggableItem wordItem;
if (exactMatch) {
wordItem = new ExactStringItem(wordData, fromQuery);
} else if (prefixMatch) {
wordItem = new PrefixItem(wordData, fromQuery);
} else if (suffixMatch) {
wordItem = new SuffixItem(wordData, fromQuery);
} else if (substrMatch) {
wordItem = new SubstringItem(wordData, fromQuery);
} else {
switch(segmentPolicy) {
case NEVER:
wordItem = new WordItem(wordData, fromQuery);
break;
case POSSIBLY:
if (shouldResegmentWord(field, fromQuery)) {
wordItem = resegment(field, ast, wordData, fromQuery, parent, language);
} else {
wordItem = new WordItem(wordData, fromQuery);
}
break;
case ALWAYS:
wordItem = resegment(field, ast, wordData, fromQuery, parent, language);
break;
default:
throw new IllegalArgumentException("Unexpected segmenting rule: " + segmentPolicy);
}
}
if (wordItem instanceof WordItem) {
prepareWord(field, ast, fromQuery, (WordItem) wordItem);
}
if (// mark the language used, unless it's the default
language != Language.ENGLISH)
((Item) wordItem).setLanguage(language);
return (Item) leafStyleSettings(ast, wordItem);
}
use of com.yahoo.prelude.query.Item in project vespa by vespa-engine.
the class YqlParser method buildTree.
@NonNull
private QueryTree buildTree(OperatorNode<?> filterPart) {
Preconditions.checkArgument(filterPart.getArguments().length == 2, "Expected 2 arguments to filter, got %s.", filterPart.getArguments().length);
populateYqlSources(filterPart.<OperatorNode<?>>getArgument(0));
OperatorNode<ExpressionOperator> filterExpression = filterPart.getArgument(1);
populateLinguisticsAnnotations(filterExpression);
Item root = convertExpression(filterExpression);
connectItems();
userQuery = null;
return new QueryTree(root);
}
use of com.yahoo.prelude.query.Item in project vespa by vespa-engine.
the class YqlParser method ensureNonEmpty.
private Item ensureNonEmpty(OperatorNode<ExpressionOperator> ast) {
List<OperatorNode<ExpressionOperator>> args = ast.getArgument(1);
Preconditions.checkArgument(args.size() == 1, "Expected 1 arguments, got %s.", args.size());
Item item = convertExpression(args.get(0));
ToolBox.visit(noEmptyTerms, item);
return item;
}
use of com.yahoo.prelude.query.Item in project vespa by vespa-engine.
the class QueryTestCase method testDeepCopy.
/**
* Check copy of query trees is a deep copy
*/
@Test
public void testDeepCopy() {
Item root1 = parseQuery("a and b and (c or d) and e rank f andnot g", null, Query.Type.ADVANCED);
Item root2 = root1.clone();
assertTrue("Item.clone() should be a deep copy.", nonIdenticalTrees(root1, root2));
}
use of com.yahoo.prelude.query.Item in project vespa by vespa-engine.
the class RangeQueryOptimizerTestCase method testRangeOptimizingCarriesOverItemAttributesWhenNotOptimized.
@Test
public void testRangeOptimizingCarriesOverItemAttributesWhenNotOptimized() {
Query query = new Query();
AndItem root = new AndItem();
query.getModel().getQueryTree().setRoot(root);
Item intItem = new IntItem(">" + 15, "s");
intItem.setWeight(500);
intItem.setFilter(true);
intItem.setRanked(false);
root.addItem(intItem);
assertOptimized("Not optimized", "AND |s:<15;]!500", query);
IntItem transformedIntItem = (IntItem) ((AndItem) query.getModel().getQueryTree().getRoot()).getItem(0);
assertTrue("Filter was carried over", transformedIntItem.isFilter());
assertFalse("Ranked was carried over", transformedIntItem.isRanked());
assertEquals("Weight was carried over", 500, transformedIntItem.getWeight());
}
Aggregations