private static String toSqlOp(ChildFilter.Op op) { switch(op) { case EQ: return " = "; case NEQ: return " <> "; case LT: return " < "; case GT: return " > "; case LTE: return " <= "; case GTE: return " >= "; default: throw new JsonDBException("Invalid filter comparison operation."); } }
@Test public void testInvalidKeys() throws IOException { for (String s : Arrays.asList("[", "]", ".", "%", "$", "#", "\n")) { try { jsondb.set("/test"+s, mapper.writeValueAsString(map( "key", "Hiram Chirino" ))); fail("Excpected JsonDBException"); } catch (JsonDBException e) { assertThat(e.getMessage()).startsWith("Invalid key."); } } for (String s : Arrays.asList("[", "]", ".", "%", "$", "#", "/", "\n")) { try { jsondb.set("/test", mapper.writeValueAsString(map( "bad"+s+"key", "Hiram Chirino" ))); fail("Excpected JsonDBException"); } catch (JsonDBException e) { assertThat(e.getMessage()).startsWith("Invalid key."); } } }
@Test public void testInvalidKeys() throws IOException { for (String s : Arrays.asList("[", "]", ".", "%", "$", "#", "\n")) { try { jsondb.set("/test"+s, mapper.writeValueAsString(map( "key", "Hiram Chirino" ))); fail("Excpected JsonDBException"); } catch (JsonDBException e) { assertThat(e.getMessage()).startsWith("Invalid key."); } } for (String s : Arrays.asList("[", "]", ".", "%", "$", "#", "/", "\n")) { try { jsondb.set("/test", mapper.writeValueAsString(map( "bad"+s+"key", "Hiram Chirino" ))); fail("Excpected JsonDBException"); } catch (JsonDBException e) { assertThat(e.getMessage()).startsWith("Invalid key."); } } }
@Override public String toString() { try { return mapper.writeValueAsString(this); } catch (JsonProcessingException e) { throw new JsonDBException(e); } } };
@Override public String toString() { try { return mapper.writeValueAsString(this); } catch (JsonProcessingException e) { throw new JsonDBException(e); } } };
public static String validateKey(String key) { if( key.chars().anyMatch(x -> { switch(x){ case '.': case '%': case '$': case '#': case '[': case ']': case '/': case 127: return true; default: if( 0 < x && x < 32) { return true; } return false; }})) { throw new JsonDBException("Invalid key. Cannot contain ., %, $, #, [, ], /, or ASCII control characters 0-31 or 127. Key: "+key); } if( key.length() > 768 ) { throw new JsonDBException("Invalid key. Key cannot ben longer than 768 characters. Key: "+key); } return key; }
public static String validateKey(String key) { if( key.chars().anyMatch(x -> { switch(x){ case '.': case '%': case '$': case '#': case '[': case ']': case '/': case 127: return true; default: if( 0 < x && x < 32) { return true; } return false; }})) { throw new JsonDBException("Invalid key. Cannot contain ., %, $, #, [, ], /, or ASCII control characters 0-31 or 127. Key: "+key); } if( key.length() > 768 ) { throw new JsonDBException("Invalid key. Key cannot ben longer than 768 characters. Key: "+key); } return key; }
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 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."); } }
throw new JsonDBException(e);
throw new JsonDBException(e);
JsonRecordSupport.jsonStreamToRecords(indexes, jp, baseDBPath, mb.createSetConsumer()); } catch (IOException e) { throw new JsonDBException(e); throw new JsonDBException(e);
JsonRecordSupport.jsonStreamToRecords(indexPaths, jp, baseDBPath, mb.createSetConsumer()); } catch (IOException e) { throw new JsonDBException(e); throw new JsonDBException(e);
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 CloseableJsonDB create(Collection<Index> indexes) { JdbcDataSource ds = new JdbcDataSource(); DBI dbi = new DBI(ds); ds.setURL("jdbc:h2:mem:"+ KeyGenerator.createKey()+";MODE=PostgreSQL"); try { Connection keepsDBOpen = ds.getConnection(); ClosableSqlJsonDB result = new ClosableSqlJsonDB(keepsDBOpen, dbi, indexes); result.createTables(); return result; } catch (SQLException e) { throw new JsonDBException(e); } } }
throw new JsonDBException(e); } finally { iterator.close();
throw new JsonDBException(e); } finally { iterator.close();
@Override public void set(String path, InputStream body) { withTransaction(dbi -> { BatchManager mb = new BatchManager(dbi); String baseDBPath = JsonRecordSupport.convertToDBPath(path); mb.deleteRecordsForSet(baseDBPath); try { JsonRecordSupport.jsonStreamToRecords(indexPaths, baseDBPath, body, mb.createSetConsumer()); } catch (IOException e) { throw new JsonDBException(e); } mb.flush(); }); if( bus!=null ) { bus.broadcast("jsondb-updated", prefix(trimSuffix(path, "/"), "/")); } }
@Override public void set(String path, InputStream body) { withTransaction(dbi -> { BatchManager mb = new BatchManager(dbi); String baseDBPath = JsonRecordSupport.convertToDBPath(path); mb.deleteRecordsForSet(baseDBPath); try { JsonRecordSupport.jsonStreamToRecords(indexes, baseDBPath, body, mb.createSetConsumer()); } catch (IOException e) { throw new JsonDBException(e); } mb.flush(); }); if( bus!=null ) { bus.broadcast("jsondb-updated", prefix(trimSuffix(path, "/"), "/")); } }