statement.setSet(paramIndex, (Set) codecRegistry.codecFor(setType).parse(paramValue)); return; } else if (DataType.Name.LIST.toString().equalsIgnoreCase(mainTypeString)) {
@Override public <T> QueryBinder<ENTITY> setSet(int i, Set<T> v) { for (BoundStatement statement : statements.values()) { statement.setSet(i, v); } return this; }
@Test(groups = "short") public void should_use_collection_codecs_with_prepared_statements_2() { session() .execute( session() .prepare(insertQuery) .bind() .setInt(0, n_int) .setList(1, l_int) .setList(2, l_bigint, Long.class) // variant with element type explicitly set .setSet(3, s_float) .setSet( 4, s_double, TypeToken.of(Double.class)) // variant with element type explicitly set .setMap(5, m_varint) .setMap( 6, m_decimal, Integer.class, BigDecimal.class) // variant with element type explicitly set ); PreparedStatement ps = session().prepare(selectQuery); ResultSet rows = session().execute(ps.bind().setInt(0, n_int)); Row row = rows.one(); assertRow(row); }
session() .execute( ins.bind().setList(0, null).setSet(1, null).setMap(2, null).setTupleValue(3, null));
@Override public <T> QueryBinder<ENTITY> setSet(String name, Set<T> v) { for (BoundStatement statement : statements.values()) { if (statement.preparedStatement().getVariables().contains(name)) { statement.setSet(name, v); } } return this; }
@Override protected ResultSetFuture newFuture() { return factory.session.executeAsync( factory.preparedStatement.bind().setSet("trace_id", trace_id).setInt("limit_", limit_)); }
@Override protected ResultSetFuture newFuture() { return factory.session.executeAsync( factory.preparedStatement.bind().setSet("trace_id", trace_id).setInt("limit_", limit_)); }
/** * Sets the value for (all occurrences of) variable {@code name} to the * provided set. * <p> * Please note that {@code null} values are not supported inside collection by CQL. * * @param <T> the type of the elements of the set to set. * @param name the name of the variable to set; if multiple variables * {@code name} are prepared, all of them are set. * @param v the value to set. * @return this BoundStatement. * * @throws IllegalArgumentException if {@code name} is not a prepared * variable, that is, if {@code !this.preparedStatement().variables().names().contains(name)}. * @throws InvalidTypeException if (any occurrence of) {@code name} is * not a map type or if the elements of {@code v} are not of the type of * the elements of column {@code name}. * @throws NullPointerException if {@code v} contains null values. Nulls are not supported in collections * by CQL. */ public <T> BoundStatement setSet(String name, Set<T> v) { int[] indexes = metadata().getAllIdx(name); for (int i = 0; i < indexes.length; i++) setSet(indexes[i], v); return this; }
.setSet("trace_id", traceIds) .setInt("limit_", limit);
public void setString(int parameterIndex, String value) throws SQLException { checkNotClosed(); checkIndex(parameterIndex); try{ this.statement.setString(parameterIndex-1, value); }catch(CodecNotFoundException e){ // Big ugly hack in order to parse string representations of collections // Yes, I'm ashamed... if(e.getMessage().contains("set<")){ String itemType = e.getMessage().substring(e.getMessage().indexOf("<")+1, e.getMessage().indexOf(">")); this.statement.setSet(parameterIndex-1, Utils.parseSet(itemType, value)); }else if(e.getMessage().contains("list<")){ String itemType = e.getMessage().substring(e.getMessage().indexOf("<")+1, e.getMessage().indexOf(">")); this.statement.setList(parameterIndex-1, Utils.parseList(itemType, value)); }else if(e.getMessage().contains("map<")){ String[] kvTypes = e.getMessage().substring(e.getMessage().indexOf("<")+1, e.getMessage().indexOf(">")).replace(" ", "").split(","); this.statement.setMap(parameterIndex-1, Utils.parseMap(kvTypes[0],kvTypes[1], value)); } } }
ListenableFuture<Map<Long, Long>> getTraceIdsByServiceNames(List<String> serviceNames, long endTs, long lookback, int limit) { if (serviceNames.isEmpty()) return immediateFuture(Collections.<Long, Long>emptyMap()); long startTs = Math.max(endTs - lookback, 0); // >= 1970 try { // This guards use of "in" query to give people a little more time to move off Cassandra 2.1 // Note that it will still fail when serviceNames.size() > 1 BoundStatement bound = serviceNames.size() == 1 ? CassandraUtil.bindWithName(selectTraceIdsByServiceName, "select-trace-ids-by-service-name") .setString("service_name", serviceNames.get(0)) .setSet("bucket", buckets) .setBytesUnsafe("start_ts", timestampCodec.serialize(startTs)) .setBytesUnsafe("end_ts", timestampCodec.serialize(endTs)) .setInt("limit_", limit) : CassandraUtil.bindWithName(selectTraceIdsByServiceNames, "select-trace-ids-by-service-names") .setList("service_name", serviceNames) .setSet("bucket", buckets) .setBytesUnsafe("start_ts", timestampCodec.serialize(startTs)) .setBytesUnsafe("end_ts", timestampCodec.serialize(endTs)) .setInt("limit_", limit); bound.setFetchSize(Integer.MAX_VALUE); return transform(session.executeAsync(bound), traceIdToTimestamp); } catch (RuntimeException ex) { return immediateFailedFuture(ex); } }
ListenableFuture<Map<Long, Long>> getTraceIdsByAnnotation(String annotationKey, long endTs, long lookback, int limit) { long startTs = Math.max(endTs - lookback, 0); // >= 1970 try { BoundStatement bound = CassandraUtil.bindWithName(selectTraceIdsByAnnotation, "select-trace-ids-by-annotation") .setBytes("annotation", CassandraUtil.toByteBuffer(annotationKey)) .setSet("bucket", buckets) .setBytesUnsafe("start_ts", timestampCodec.serialize(startTs)) .setBytesUnsafe("end_ts", timestampCodec.serialize(endTs)) .setInt("limit_", limit); bound.setFetchSize(Integer.MAX_VALUE); return transform(session.executeAsync(bound), new Function<ResultSet, Map<Long, Long>>() { @Override public Map<Long, Long> apply(@Nullable ResultSet input) { Map<Long, Long> traceIdsToTimestamps = new LinkedHashMap<>(); for (Row row : input) { traceIdsToTimestamps.put(row.getLong("trace_id"), timestampCodec.deserialize(row, "ts")); } return traceIdsToTimestamps; } } ); } catch (CharacterCodingException | RuntimeException ex) { return immediateFailedFuture(ex); } } }
private String updateSimple(String key) { Map<String, UDTValue> billing_addresses = new HashMap<>(); HashSet<String> phones = new HashSet<>(); for (int i = 0; i < this.dataGenerator.getRandomInteger()%6+1; i++) { phones.add(RandomStringUtils.randomAlphanumeric(10)); } UDTValue address = cassAddressType.newValue(); address.setString("street", RandomStringUtils.randomAlphanumeric(30)); address.setString("city", RandomStringUtils.randomAlphanumeric(20)); address.setInt("zip_code", this.dataGenerator.getRandomInteger()); address.setSet("phones", phones); billing_addresses.put(RandomStringUtils.randomAlphanumeric(8),address); HashSet<UDTValue> emails = new HashSet<>(); for (int i = 0; i < this.dataGenerator.getRandomInteger()%5+1; i++) { UDTValue email = cassEmailType.newValue(); email.setString("fp",RandomStringUtils.randomAlphanumeric(15)); email.setString("domain",RandomStringUtils.randomAlphanumeric(10)); emails.add(email); } BoundStatement bStmt = updatePstmt1.bind(); bStmt.setMap("billing_addresses", billing_addresses); bStmt.setSet("emails", emails); bStmt.setString("id", key); bStmt.setConsistencyLevel(ConsistencyLevel.valueOf(config.getWriteConsistencyLevel())); ResultSet rs = session.execute(bStmt); if (rs !=null) return ResultOK; return ResutlFailed; }
private String updateSimple(String key) { Map<String, UDTValue> billing_addresses = new HashMap<>(); HashSet<String> phones = new HashSet<>(); for (int i = 0; i < this.dataGenerator.getRandomInteger()%6+1; i++) { phones.add(RandomStringUtils.randomAlphanumeric(10)); } UDTValue address = cassAddressType.newValue(); address.setString("street", RandomStringUtils.randomAlphanumeric(30)); address.setString("city", RandomStringUtils.randomAlphanumeric(20)); address.setInt("zip_code", this.dataGenerator.getRandomInteger()); address.setSet("phones", phones); billing_addresses.put(RandomStringUtils.randomAlphanumeric(8),address); HashSet<UDTValue> emails = new HashSet<>(); for (int i = 0; i < this.dataGenerator.getRandomInteger()%5+1; i++) { UDTValue email = cassEmailType.newValue(); email.setString("fp",RandomStringUtils.randomAlphanumeric(15)); email.setString("domain",RandomStringUtils.randomAlphanumeric(10)); emails.add(email); } BoundStatement bStmt = updatePstmt1.bind(); bStmt.setMap("billing_addresses", billing_addresses); bStmt.setSet("emails", emails); bStmt.setString("id", key); bStmt.setConsistencyLevel(ConsistencyLevel.valueOf(config.getWriteConsistencyLevel())); ResultSet rs = session.execute(bStmt); if (rs !=null) return ResultOK; return ResutlFailed; }
@Test(groups = "short") public void should_use_collection_codecs_with_prepared_statements_2() { session() .execute( session() .prepare(insertQuery) .bind() .setInt(0, n_int) .setList(1, l_int) .setList(2, l_bigint, Long.class) // variant with element type explicitly set .setSet(3, s_float) .setSet( 4, s_double, TypeToken.of(Double.class)) // variant with element type explicitly set .setMap(5, m_varint) .setMap( 6, m_decimal, Integer.class, BigDecimal.class) // variant with element type explicitly set ); PreparedStatement ps = session().prepare(selectQuery); ResultSet rows = session().execute(ps.bind().setInt(0, n_int)); Row row = rows.one(); assertRow(row); }
public CompletableFuture<Void> updateMetadata(ComposedMessageIdWithMetaData composedMessageIdWithMetaData) { ComposedMessageId composedMessageId = composedMessageIdWithMetaData.getComposedMessageId(); Flags flags = composedMessageIdWithMetaData.getFlags(); return cassandraAsyncExecutor.executeVoid(update.bind() .setLong(MOD_SEQ, composedMessageIdWithMetaData.getModSeq()) .setBool(ANSWERED, flags.contains(Flag.ANSWERED)) .setBool(DELETED, flags.contains(Flag.DELETED)) .setBool(DRAFT, flags.contains(Flag.DRAFT)) .setBool(FLAGGED, flags.contains(Flag.FLAGGED)) .setBool(RECENT, flags.contains(Flag.RECENT)) .setBool(SEEN, flags.contains(Flag.SEEN)) .setBool(USER, flags.contains(Flag.USER)) .setSet(USER_FLAGS, ImmutableSet.copyOf(flags.getUserFlags())) .setUUID(MAILBOX_ID, ((CassandraId) composedMessageId.getMailboxId()).asUuid()) .setLong(IMAP_UID, composedMessageId.getUid().asLong())); }
public CompletableFuture<Void> insert(ComposedMessageIdWithMetaData composedMessageIdWithMetaData) { ComposedMessageId composedMessageId = composedMessageIdWithMetaData.getComposedMessageId(); Flags flags = composedMessageIdWithMetaData.getFlags(); return cassandraAsyncExecutor.executeVoid(insert.bind() .setUUID(MAILBOX_ID, ((CassandraId) composedMessageId.getMailboxId()).asUuid()) .setLong(IMAP_UID, composedMessageId.getUid().asLong()) .setUUID(MESSAGE_ID, ((CassandraMessageId) composedMessageId.getMessageId()).get()) .setLong(MOD_SEQ, composedMessageIdWithMetaData.getModSeq()) .setBool(ANSWERED, flags.contains(Flag.ANSWERED)) .setBool(DELETED, flags.contains(Flag.DELETED)) .setBool(DRAFT, flags.contains(Flag.DRAFT)) .setBool(FLAGGED, flags.contains(Flag.FLAGGED)) .setBool(RECENT, flags.contains(Flag.RECENT)) .setBool(SEEN, flags.contains(Flag.SEEN)) .setBool(USER, flags.contains(Flag.USER)) .setSet(USER_FLAGS, ImmutableSet.copyOf(flags.getUserFlags()))); }
public CompletableFuture<Void> insert(ComposedMessageIdWithMetaData composedMessageIdWithMetaData) { ComposedMessageId composedMessageId = composedMessageIdWithMetaData.getComposedMessageId(); Flags flags = composedMessageIdWithMetaData.getFlags(); return cassandraAsyncExecutor.executeVoid(insert.bind() .setUUID(MESSAGE_ID, ((CassandraMessageId) composedMessageId.getMessageId()).get()) .setUUID(MAILBOX_ID, ((CassandraId) composedMessageId.getMailboxId()).asUuid()) .setLong(IMAP_UID, composedMessageId.getUid().asLong()) .setLong(MOD_SEQ, composedMessageIdWithMetaData.getModSeq()) .setBool(ANSWERED, flags.contains(Flag.ANSWERED)) .setBool(DELETED, flags.contains(Flag.DELETED)) .setBool(DRAFT, flags.contains(Flag.DRAFT)) .setBool(FLAGGED, flags.contains(Flag.FLAGGED)) .setBool(RECENT, flags.contains(Flag.RECENT)) .setBool(SEEN, flags.contains(Flag.SEEN)) .setBool(USER, flags.contains(Flag.USER)) .setSet(USER_FLAGS, ImmutableSet.copyOf(flags.getUserFlags()))); }
public CompletableFuture<Boolean> updateMetadata(ComposedMessageIdWithMetaData composedMessageIdWithMetaData, long oldModSeq) { ComposedMessageId composedMessageId = composedMessageIdWithMetaData.getComposedMessageId(); Flags flags = composedMessageIdWithMetaData.getFlags(); return cassandraAsyncExecutor.executeReturnApplied(update.bind() .setLong(MOD_SEQ, composedMessageIdWithMetaData.getModSeq()) .setBool(ANSWERED, flags.contains(Flag.ANSWERED)) .setBool(DELETED, flags.contains(Flag.DELETED)) .setBool(DRAFT, flags.contains(Flag.DRAFT)) .setBool(FLAGGED, flags.contains(Flag.FLAGGED)) .setBool(RECENT, flags.contains(Flag.RECENT)) .setBool(SEEN, flags.contains(Flag.SEEN)) .setBool(USER, flags.contains(Flag.USER)) .setSet(USER_FLAGS, ImmutableSet.copyOf(flags.getUserFlags())) .setUUID(MESSAGE_ID, ((CassandraMessageId) composedMessageId.getMessageId()).get()) .setUUID(MAILBOX_ID, ((CassandraId) composedMessageId.getMailboxId()).asUuid()) .setLong(IMAP_UID, composedMessageId.getUid().asLong()) .setLong(MOD_SEQ_CONDITION, oldModSeq)); }