@Override public String toString() { try { if (forceNoValues) return getQueryString(); // 1) try first with all values inlined (will not work if some values require custom codecs, // or if the required codecs are registered in a different CodecRegistry instance than the // default one) return maybeAddSemicolon(buildQueryString(null, CodecRegistry.DEFAULT_INSTANCE)).toString(); } catch (RuntimeException e1) { // 2) try next with bind markers for all values to avoid usage of custom codecs try { return maybeAddSemicolon( buildQueryString(new ArrayList<Object>(), CodecRegistry.DEFAULT_INSTANCE)) .toString(); } catch (RuntimeException e2) { // Ugly but we have absolutely no context to get the registry from return String.format( "built query (could not generate with default codec registry: %s)", e2.getMessage()); } } }
@Override public String toString() { return statement.toString(); } }
@Override public ByteBuffer getRoutingKey(ProtocolVersion protocolVersion, CodecRegistry codecRegistry) { return statement.getRoutingKey(protocolVersion, codecRegistry); }
private void maybeRebuildCache(CodecRegistry codecRegistry) { if (!dirty && cache != null) return; StringBuilder sb; values = null; if (hasBindMarkers || forceNoValues) { sb = buildQueryString(null, codecRegistry); } else { values = new ArrayList<Object>(); sb = buildQueryString(values, codecRegistry); if (values.size() > 65535) throw new IllegalArgumentException( "Too many values for built statement, the maximum allowed is 65535"); if (values.isEmpty()) values = null; } maybeAddSemicolon(sb); cache = sb.toString(); dirty = false; }
@Test(groups = "unit") public void should_not_attempt_to_serialize_function_calls_in_collections() { BuiltStatement query = insertInto("foo").value("v", Sets.newHashSet(fcall("func", 1))); assertThat(query.getQueryString()).isEqualTo("INSERT INTO foo (v) VALUES ({func(1)});"); assertThat(query.getValues(ProtocolVersion.NEWEST_SUPPORTED, CodecRegistry.DEFAULT_INSTANCE)) .isNullOrEmpty(); }
/** * Creates a new {@link SimpleCQLStatementMapperBuilder} instance. * @param builtStatement a query built statements */ public SimpleCQLStatementMapperBuilder(BuiltStatement builtStatement) { this.queryString = builtStatement.getQueryString(); }
@Test(groups = "unit") public void should_serialize_collections_of_serializable_elements() { Set<UUID> set = Sets.newHashSet(UUID.randomUUID()); List<Date> list = Lists.newArrayList(new Date()); Map<BigInteger, String> map = ImmutableMap.of(new BigInteger("1"), "foo"); BuiltStatement query = insertInto("foo").value("v", set); assertThat(query.getQueryString()).isEqualTo("INSERT INTO foo (v) VALUES (?);"); assertThat(query.getObject(0)).isEqualTo(set); query = insertInto("foo").value("v", list); assertThat(query.getQueryString()).isEqualTo("INSERT INTO foo (v) VALUES (?);"); assertThat(query.getObject(0)).isEqualTo(list); query = insertInto("foo").value("v", map); assertThat(query.getQueryString()).isEqualTo("INSERT INTO foo (v) VALUES (?);"); assertThat(query.getObject(0)).isEqualTo(map); }
@Test(groups = "unit") public void should_not_attempt_to_serialize_collections_containing_numbers() { BuiltStatement query; // lists List<Integer> list = Lists.newArrayList(1, 2, 3); query = insertInto("foo").value("v", list); assertThat(query.getQueryString()).isEqualTo("INSERT INTO foo (v) VALUES ([1,2,3]);"); assertThat(query.hasValues()).isFalse(); // sets Set<Integer> set = Sets.newHashSet(1, 2, 3); query = insertInto("foo").value("v", set); assertThat(query.getQueryString()).isEqualTo("INSERT INTO foo (v) VALUES ({1,2,3});"); assertThat(query.hasValues()).isFalse(); // maps Map<Integer, Float> map = ImmutableMap.of(1, 12.34f); query = insertInto("foo").value("v", map); assertThat(query.getQueryString()).isEqualTo("INSERT INTO foo (v) VALUES ({1:12.34});"); assertThat(query.hasValues()).isFalse(); }
@Override public ByteBuffer[] getValues(ProtocolVersion protocolVersion, CodecRegistry codecRegistry) { return statement.getValues(protocolVersion, codecRegistry); }
.add(insertInto(table).values(new String[] {"k", "a"}, new Object[] {42, 1})) .add(update(table).using(ttl(400))); assertEquals(batch.getRoutingKey(protocolVersion, codecRegistry), bb); assertEquals(batch.toString(), batch_query); batch_query += "APPLY BATCH;"; batch = batch(query); assertEquals(batch.getRoutingKey(protocolVersion, codecRegistry), bb); assertEquals(batch.toString(), batch_query); batch_query += "APPLY BATCH;"; batch = batch().add(select().from("foo").where(eq("k", 42))); assertEquals(batch.getRoutingKey(protocolVersion, codecRegistry), null); assertEquals(batch.toString(), batch_query); batch_query += "APPLY BATCH;"; batch = batch().using(timestamp(42)).add(insertInto("foo", "bar").value("a", 123)); assertEquals(batch.getRoutingKey(protocolVersion, codecRegistry), null); assertEquals(batch.toString(), batch_query);
.where(eq("k", 1))) .using(timestamp(42)); assertEquals(batch.toString(), query); assertThat(batch.getKeyspace()) .isEqualTo("baz"); // batch returns first statements keyspace if present. batch.setKeyspace("bar"); // can still explicitly set keyspace assertThat(batch.getKeyspace()).isEqualTo("bar"); assertThat(batch.toString()).isEqualTo(query); // but does not alter query string. query += "APPLY BATCH;"; batch = batch(delete().listElt("a", 3).from("foo").where(eq("k", 1))); assertEquals(batch.toString(), query);
@Test(groups = "unit") public void should_infer_for_built_statement() { for (BuiltStatement statement : idempotentBuiltStatements()) assertThat(statement.isIdempotent()).as(statement.getQueryString()).isTrue(); for (BuiltStatement statement : nonIdempotentBuiltStatements()) assertThat(statement.isIdempotent()).as(statement.getQueryString()).isFalse(); }
@Override void checkForBindMarkers(Utils.Appendeable value) { statement.checkForBindMarkers(value); }
@Override public String getKeyspace() { return statement.getKeyspace(); }
@Override StringBuilder buildQueryString(List<Object> values, CodecRegistry codecRegistry) { return statement.buildQueryString(values, codecRegistry); }
@Override public boolean hasValues() { return statement.hasValues(); }
/** * Returns the {@code i}th value as the Java type matching its CQL type. * * <p>This method calls {@link #getObject(int, CodecRegistry)} with {@link * CodecRegistry#DEFAULT_INSTANCE}. It's safe to use if you don't use any custom codecs, or if * your custom codecs are in the default registry; otherwise, use the other method and provide the * registry that contains your codecs. * * @param i the index to retrieve. * @return the value of the {@code i}th value of this statement. * @throws IllegalStateException if this statement does not have values. * @throws IndexOutOfBoundsException if {@code i} is not a valid index for this object. */ public Object getObject(int i) { return getObject(i, CodecRegistry.DEFAULT_INSTANCE); }
@Override public Statement disableTracing() { statement.disableTracing(); return this; }
@Test(groups = "unit") public void should_not_attempt_to_serialize_raw_values_in_collections() { BuiltStatement query = insertInto("foo").value("v", ImmutableMap.of(1, raw("x"))); assertThat(query.getQueryString()).isEqualTo("INSERT INTO foo (v) VALUES ({1:x});"); assertThat(query.getValues(ProtocolVersion.NEWEST_SUPPORTED, CodecRegistry.DEFAULT_INSTANCE)) .isNullOrEmpty(); }
@Override public String getQueryString(CodecRegistry codecRegistry) { return statement.getQueryString(codecRegistry); }