public static SqlExpressionBuilder create(SqlJsonDB db, Filter filter, String path) { if( filter instanceof ChildFilter ) { ChildFilter childFilter = (ChildFilter) filter; return create(db, childFilter, path); } if( filter instanceof LogicalFilter) { LogicalFilter logicalFilter = (LogicalFilter) filter; return create(db, logicalFilter, path); } throw new JsonDBException("Unsupported filter: "+filter); }
public void build(StringBuilder sql, ArrayList<Consumer<Query<Map<String, Object>>>> binds) { build(sql, binds, new AtomicInteger()); }
public static SqlExpressionBuilder create(SqlJsonDB db, ChildFilter filter, String path) { String idx = path+"#"+filter.field(); if( !db.getIndexPaths().contains(idx) ) { throw new JsonDBException("You can only filter on fields that are indexed."); } PropertySqlExpressionBuilder left = new PropertySqlExpressionBuilder(idx); LiteralSqlExpressionBuilder right = new LiteralSqlExpressionBuilder(filter.value()); return new BinarySqlExpressionBuilder(db, left, toSqlOp(filter.op()), right); }
public static SqlExpressionBuilder create(SqlJsonDB db, LogicalFilter filter, String path) { List<SqlExpressionBuilder> children = filter.filters().stream() .map(x -> create(db, x, path)) .collect(Collectors.toList()); switch( filter.op() ) { case OR: return new LogicalSqlExpressionBuilder(" UNION ", children); case AND: return new LogicalSqlExpressionBuilder(" INTERSECT ", children); default: throw new JsonDBException("Unsupported op type."); } }
@Override public void build(StringBuilder sql, ArrayList<Consumer<Query<Map<String, Object>>>> binds, AtomicInteger bindCounter) { for (int i = 0; i < builders.size(); i++) { SqlExpressionBuilder builder = builders.get(i); if ( i!=0 ) { sql.append(op); } sql.append('('); builder.build(sql, binds, bindCounter); sql.append(')'); } } }
@Override public void build(StringBuilder sql, ArrayList<Consumer<Query<Map<String, Object>>>> binds, AtomicInteger bindCounter) { sql.append("SELECT "); if (db.getDatabaseKind() == H2) { sql.append("trim_suffix(path, split_part('#', idx, 2)||'/')"); } else { sql.append("trim(trailing split_part('#', idx, 2)||'/' from path)"); } sql.append("as match_path FROM jsondb WHERE ("); arg1.build(sql, binds, bindCounter); sql.append(op); arg2.build(sql, binds, bindCounter); sql.append(')'); } }