@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; }
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); }
private List<Expression<?>> transformList(Expression<?> expr, List<Expression<?>> elements) { if (expr instanceof Operation<?> && ((Operation<?>) expr).getOperator() == Ops.LIST) { Operation<?> list = (Operation<?>) expr; transformList(list.getArg(0), elements); elements.add(list.getArg(1)); } else { elements.add(expr); } return elements; }
private Predicate<Bindings> createBoundPredicate(final Operation<?> expr, final Operator<?> op) { final String key = getKey(expr.getArg(0)); return new Predicate<Bindings>() { @Override public boolean apply(Bindings bindings) { boolean rv = bindings.get(key) != null; return op == Ops.IS_NOT_NULL ? rv : !rv; } }; }
protected boolean isReference(Operation<?> expr, int exprIndex) { Expression<?> arg = expr.getArg(exprIndex); if (arg instanceof Path) { return isReference((Path<?>) arg); } else { return false; } }
@Override public boolean apply(Bindings bindings) { NODE lhs = (NODE) expr.getArg(0).accept(QueryRDFVisitor.this, bindings); NODE rhs = (NODE) expr.getArg(1).accept(QueryRDFVisitor.this, bindings); int rv = nodeComparator.compare(lhs, rhs); if (rv < 0) { return op == Ops.LT || op == Ops.LOE; } else if (rv == 0) { return op == Ops.LOE || op == Ops.GOE; } else { return op == Ops.GT || op == Ops.GOE; } } };
@Override public boolean apply(Bindings bindings) { NODE lhs = (NODE) expr.getArg(0).accept(QueryRDFVisitor.this, bindings); NODE rhs = (NODE) expr.getArg(1).accept(QueryRDFVisitor.this, bindings); if (lhs != null && rhs != null) { return lhs.getValue().equalsIgnoreCase(rhs.getValue()); } else { return lhs == rhs; } } };
@Override public boolean apply(Bindings bindings) { NODE lhs = (NODE) expr.getArg(0).accept(QueryRDFVisitor.this, bindings); return lhs != null ? lhs.getValue().isEmpty() : false; } };
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"); }
@Override public BooleanExpression exists() { if (queryMixin.getMetadata().getJoins().isEmpty()) { throw new IllegalArgumentException("No sources given"); } Expression<?> expr = queryMixin.getMetadata().getJoins().get(0).getTarget(); if (expr instanceof Operation && ((Operation)expr).getOperator() == Ops.ALIAS) { expr = ((Operation)expr).getArg(1); } return unique(expr).exists(); }
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; }
protected Query in(Operation<?> operation, QueryMetadata metadata, boolean ignoreCase) { Path<?> path = getPath(operation.getArg(0)); String field = toField(path); Collection<?> values = (Collection<?>) ((Constant<?>) operation.getArg(1)).getConstant(); BooleanQuery bq = new BooleanQuery(); for (Object value : values) { String[] str = convert(path, value); bq.add(eq(field, str, ignoreCase), Occur.SHOULD); } return bq; }
@SuppressWarnings("unchecked") @Override public NumberSubQuery<Long> count() { Expression<?> target = queryMixin.getMetadata().getJoins().get(0).getTarget(); if (target instanceof Operation && ((Operation)target).getOperator() == Ops.ALIAS) { target = ((Operation)target).getArg(1); } return unique(NumberOperation.create(Long.class, Ops.AggOps.COUNT_AGG, target)); }