Aadi
Aadi

Reputation: 174

How to give ttl in Cassandra when inserting data in batches?

Hello I am using Cassandra to save user data . I want to store data of a user for only 24 hours so I am giving a ttl for 24 hours. For each user there are multiple entries. So I want to batch insert data for each user instead of multiple calls to data base . I am using Cassandra operations to give ttl . I am able to give ttl for single record . How to provide ttl when inserting data in batches

public class CustomizedUserFeedRepositoryImpl<T> implements CustomizedUserFeedRepository<T> {


private CassandraOperations cassandraOperations;

@Autowired
CustomizedUserFeedRepositoryImpl(CassandraOperations cassandraOperations){
    this.cassandraOperations = cassandraOperations;

}

@Override
public <S extends T> S save(S entity, int ttl){
    InsertOptions insertOptions;
    if(ttl == 0) {
        insertOptions =  InsertOptions.builder().ttl(Duration.ofHours(24)).build();
    } else {
        insertOptions = InsertOptions.builder().ttl(ttl).build();
    }
    cassandraOperations.insert(entity,insertOptions);
    return entity;
}

@Override
public void saveAllWithTtl(java.lang.Iterable<T> entities, int ttl){
    entities.forEach(entity->{
        save(entity,ttl);
    });
}

}

As you can see I have to iterate over the list make and make database calls for each record . The batch operation cassandraOperations.batchOps().insert() only takes list of objects . How to set ttl for each record when using batchops() fucntion ?

Upvotes: 0

Views: 1749

Answers (1)

erolkaya84
erolkaya84

Reputation: 1849

   /**
     * Add a collection of inserts with given {@link WriteOptions} to the batch.
     *
     * @param entities the entities to insert; must not be {@literal null}.
     * @param options the WriteOptions to apply; must not be {@literal null}.
     * @return {@code this} {@link CassandraBatchOperations}.
     * @throws IllegalStateException if the batch was already executed.
     * @since 2.0
     */
    CassandraBatchOperations insert(Iterable<?> entities, WriteOptions options);

You can use insert(Iterable<?> entities, WriteOptions options) method

@EqualsAndHashCode(callSuper = true)
public class WriteOptions extends QueryOptions {

private static final WriteOptions EMPTY = new WriteOptionsBuilder().build();

private final Duration ttl;
private final @Nullable Long timestamp;

batchOperations.insert(entity, WriteOptions.builder().ttl(20).build());

Upvotes: 2

Related Questions