private static ImmutableMap<Expression<?>, Integer> createBindings(List<Expression<?>> exprs) { Map<Expression<?>, Integer> map = Maps.newHashMap(); for (int i = 0; i < exprs.size(); i++) { Expression<?> e = exprs.get(i); if (e instanceof Operation && ((Operation<?>) e).getOperator() == Ops.ALIAS) { map.put(((Operation<?>) e).getArg(1), i); } map.put(e, i); } return ImmutableMap.copyOf(map); }
@Override public Set<Expression<?>> visit(Operation<?> expr, Set<Expression<?>> known) { if (expr.getOperator() == Ops.ALIAS) { known = add(known, expr.getArg(1)); } for (Expression<?> arg : expr.getArgs()) { known = arg.accept(this, known); } return known; }
protected Query eq(Operation<?> operation, QueryMetadata metadata, boolean ignoreCase) { verifyArguments(operation); Path<?> path = getPath(operation.getArg(0)); String field = toField(path); if (Number.class.isAssignableFrom(operation.getArg(1).getType())) { @SuppressWarnings("unchecked") //guarded by previous check Constant<? extends Number> rightArg = (Constant<? extends Number>) operation.getArg(1); return new TermQuery(new Term(field, convertNumber(rightArg.getConstant()))); } return eq(field, convert(path, operation.getArg(1), metadata), ignoreCase); }
private Path<?> getPath(Expression<?> leftHandSide) { if (leftHandSide instanceof Path<?>) { return (Path<?>) leftHandSide; } else if (leftHandSide instanceof Operation<?>) { Operation<?> operation = (Operation<?>) leftHandSide; if (operation.getOperator() == Ops.LOWER || operation.getOperator() == Ops.UPPER) { return (Path<?>) operation.getArg(0); } } throw new IllegalArgumentException("Unable to transform " + leftHandSide + " to path"); }
private Path<?> getPath(Expression<?> leftHandSide) { if (leftHandSide instanceof Path<?>) { return (Path<?>) leftHandSide; } else if (leftHandSide instanceof Operation<?>) { Operation<?> operation = (Operation<?>) leftHandSide; if (operation.getOperator() == Ops.LOWER || operation.getOperator() == Ops.UPPER) { return (Path<?>) operation.getArg(0); } } throw new IllegalArgumentException("Unable to transform " + leftHandSide + " to path"); }
protected Query eq(Operation<?> operation, QueryMetadata metadata, boolean ignoreCase) { verifyArguments(operation); Path<?> path = getPath(operation.getArg(0)); String field = toField(path); if (Number.class.isAssignableFrom(operation.getArg(1).getType())) { @SuppressWarnings("unchecked") //guarded by previous check Constant<? extends Number> rightArg = (Constant<? extends Number>) operation.getArg(1); return new TermQuery(new Term(field, convertNumber(rightArg.getConstant()))); } return eq(field, convert(path, operation.getArg(1), metadata), ignoreCase); }
private static Expression<?> unwrap(Expression<?> expr) { expr = ExpressionUtils.extract(expr); if (expr instanceof Operation && ((Operation<?>) expr).getOperator() == Ops.ALIAS) { return ((Operation<?>) expr).getArg(0); } return expr; }
private Query toTwoHandSidedQuery(Operation<?> operation, Occur occur, QueryMetadata metadata) { Query lhs = toQuery(operation.getArg(0), metadata); Query rhs = toQuery(operation.getArg(1), metadata); BooleanQuery bq = new BooleanQuery(); bq.add(createBooleanClause(lhs, occur)); bq.add(createBooleanClause(rhs, occur)); return bq; }
private Query toTwoHandSidedQuery(Operation<?> operation, Occur occur, QueryMetadata metadata) { Query lhs = toQuery(operation.getArg(0), metadata); Query rhs = toQuery(operation.getArg(1), metadata); BooleanQuery bq = new BooleanQuery(); bq.add(createBooleanClause(lhs, occur)); bq.add(createBooleanClause(rhs, occur)); return bq; }
@SuppressWarnings("unchecked") @Test public void bytePath_notIn() { Operation<?> operation = (Operation<?>) bytePath.notIn(1, 2, 3); Constant<List<Byte>> rightArg = (Constant<List<Byte>>) operation.getArg(1); List<Byte> numbers = rightArg.getConstant(); assertEquals(Byte.valueOf((byte) 1), numbers.get(0)); assertEquals(Byte.valueOf((byte) 2), numbers.get(1)); assertEquals(Byte.valueOf((byte) 3), numbers.get(2)); } }
@SuppressWarnings("unchecked") @Test public void bytePath_in() { Operation<?> operation = (Operation<?>) bytePath.in(1, 2, 3); Constant<List<Byte>> rightArg = (Constant<List<Byte>>) operation.getArg(1); List<Byte> numbers = rightArg.getConstant(); assertEquals(Byte.valueOf((byte) 1), numbers.get(0)); assertEquals(Byte.valueOf((byte) 2), numbers.get(1)); assertEquals(Byte.valueOf((byte) 3), numbers.get(2)); }