public void createSequence(IdSourceKeyMetadata metadata, CassandraDatastoreProvider datastoreProvider) { List<String> primaryKeyName = new ArrayList<String>( 1 ); primaryKeyName.add( metadata.getKeyColumnName() ); List<String> columnNames = new ArrayList<String>( 2 ); columnNames.add( metadata.getKeyColumnName() ); columnNames.add( metadata.getValueColumnName() ); List<String> columnTypes = new ArrayList<String>( 2 ); columnTypes.add( "varchar" ); columnTypes.add( "bigint" ); datastoreProvider.createColumnFamilyIfNeeded( metadata.getName(), primaryKeyName, columnNames, columnTypes ); }
protected String increaseQuery(NextValueRequest request) { StringBuilder queryBuilder = new StringBuilder(); IdSourceKeyMetadata metadata = request.getKey().getMetadata(); queryBuilder.append( " MATCH (n " ); queryBuilder.append( labels( metadata.getName(), NodeLabel.TABLE_BASED_SEQUENCE.name() ) ); queryBuilder.append( " { " ); queryBuilder.append( metadata.getKeyColumnName() ); queryBuilder.append( ": {" ); queryBuilder.append( SEQUENCE_NAME_QUERY_PARAM ); queryBuilder.append( "}} )" ); queryBuilder.append( " SET n." ); queryBuilder.append( metadata.getValueColumnName() ); queryBuilder.append( " = n." ); queryBuilder.append( metadata.getValueColumnName() ); queryBuilder.append( " + " ); queryBuilder.append( request.getIncrement() ); queryBuilder.append( " REMOVE n.__locked RETURN n." ); queryBuilder.append( metadata.getValueColumnName() ); String query = queryBuilder.toString(); return query; }
protected String acquireLockQuery(NextValueRequest request) { StringBuilder queryBuilder = new StringBuilder(); IdSourceKeyMetadata metadata = request.getKey().getMetadata(); queryBuilder.append( "MERGE (n" ); queryBuilder.append( labels( metadata.getName(), NodeLabel.TABLE_BASED_SEQUENCE.name() ) ); queryBuilder.append( " { " ); queryBuilder.append( metadata.getKeyColumnName() ); queryBuilder.append( ": {" ); queryBuilder.append( SEQUENCE_NAME_QUERY_PARAM ); queryBuilder.append( "}} ) " ); queryBuilder.append( " ON MATCH SET n.__locked=true " ); queryBuilder.append( " ON CREATE SET n.__locked=true, n." ); queryBuilder.append( metadata.getValueColumnName() ); queryBuilder.append( " = " ); queryBuilder.append( request.getInitialValue() ); queryBuilder.append( " RETURN n." ); queryBuilder.append( metadata.getValueColumnName() ); String query = queryBuilder.toString(); return query; }
private Long updateSequenceValue(IdSourceKey idSourceKey, Node sequence, int increment) { String valueProperty = idSourceKey.getMetadata().getType() == IdSourceType.TABLE ? idSourceKey.getMetadata().getValueColumnName() : SEQUENCE_VALUE_PROPERTY; Number currentValue = (Number) sequence.getProperty( valueProperty ); long updatedValue = currentValue.longValue() + increment; sequence.setProperty( valueProperty, updatedValue ); return currentValue.longValue(); } }
public SequenceTableDefinition(IdSourceKeyMetadata idSourceKeyMetadata, String protobufPackageName) { this.protobufPackageName = protobufPackageName; this.messageName = inferMessageName( idSourceKeyMetadata ); this.idMessageName = SanitationUtils.toProtobufIdName( messageName ); this.keyColumnName = SanitationUtils.convertNameSafely( idSourceKeyMetadata.getKeyColumnName() ); this.valueColumnName = SanitationUtils.convertNameSafely( idSourceKeyMetadata.getValueColumnName() ); this.sequenceNameEncoder = new StringProtofieldAccessor( 1, keyColumnName, false, idSourceKeyMetadata.getKeyColumnName() ); this.valueEncoder = new LongProtofieldAccessor( 2, valueColumnName, false, idSourceKeyMetadata.getValueColumnName() ); }
private SequenceDocument getSequence(IdSourceKey key, int initialValue) { Response response = null; try { String id = createId( key ); response = databaseClient.getKeyValueById( id ); if ( response.getStatus() == Response.Status.OK.getStatusCode() ) { return response.readEntity( SequenceDocument.class ); } else if ( response.getStatus() == Response.Status.NOT_FOUND.getStatusCode() ) { SequenceDocument identifier = new SequenceDocument( key.getMetadata().getValueColumnName(), initialValue ); identifier.setId( id ); return identifier; } else { GenericResponse responseEntity = response.readEntity( GenericResponse.class ); throw logger.errorRetrievingKeyValue( response.getStatus(), responseEntity.getError(), responseEntity.getReason() ); } } catch (ResteasyClientException e) { throw logger.couchDBConnectionProblem( e ); } finally { if ( response != null ) { response.close(); } } } }
/** * Ex.: * <pre> * MERGE (n:hibernate_sequences:TABLE_BASED_SEQUENCE {sequence_name: {sequenceName}}) ON CREATE SET n.current_value = {initialValue} RETURN n * </pre> */ private void addTableSequence(NextValueRequest request) { IdSourceKeyMetadata idSourceKeyMetadata = request.getKey().getMetadata(); String query = "MERGE (n" + labels( idSourceKeyMetadata.getName(), NodeLabel.TABLE_BASED_SEQUENCE.name() ) + " { " + idSourceKeyMetadata.getKeyColumnName() + ": {" + SEQUENCE_NAME_QUERY_PARAM + "}} ) ON CREATE SET n." + idSourceKeyMetadata.getValueColumnName() + " = {" + INITIAL_VALUE_QUERY_PARAM + "} RETURN n"; neo4jDb.execute( query, params( request ) ); }
private boolean nextValueUpdate(IdSourceKeyMetadata metadata, String sequenceName, Long oldValue, Long newValue) { Statement update = QueryBuilder.update( quote( metadata.getName() ) ) .with( set( quote( metadata.getValueColumnName() ), QueryBuilder.bindMarker( "sequence_value_new" ) ) ) .where( eq( quote( metadata.getKeyColumnName() ), QueryBuilder.bindMarker( "sequence_name" ) ) ) .onlyIf( eq( quote( metadata.getValueColumnName() ), QueryBuilder.bindMarker( "sequence_value_old" ) ) ); PreparedStatement preparedStatement = provider.getSession().prepare( update.toString() ); BoundStatement boundStatement = preparedStatement.bind(); boundStatement.setString( "sequence_name", sequenceName ); boundStatement.setLong( "sequence_value_new", newValue ); boundStatement.setLong( "sequence_value_old", oldValue ); ResultSet resultSet; try { resultSet = provider.getSession().execute( boundStatement ); } catch (DriverException e) { throw e; } return resultSet.one().getBool( 0 ); }
private Long nextValueSelect(IdSourceKeyMetadata metadata, String sequenceName) { Statement select = QueryBuilder.select().column( quote( metadata.getValueColumnName() ) ) .from( quote( metadata.getName() ) ) .where( eq( metadata.getKeyColumnName(), QueryBuilder.bindMarker() ) ); PreparedStatement preparedStatement = provider.getSession().prepare( select.toString() ); BoundStatement boundStatement = preparedStatement.bind( sequenceName ); ResultSet resultSet; try { resultSet = provider.getSession().execute( boundStatement ); } catch (DriverException e) { throw e; } if ( resultSet.isExhausted() ) { return null; } else { return resultSet.one().getLong( 0 ); } }
@Override public Number nextValue(NextValueRequest request) { String valueColumnName = request.getKey().getMetadata().getValueColumnName(); MongoCollection<Document> sequenceCollection = getCollection( request.getKey().getTable(), null ); Document sequenceId = prepareIdObject( request.getKey() ); Document setInitialValueOnInsert = new Document(); addSubQuery( "$setOnInsert", setInitialValueOnInsert, valueColumnName, request.getInitialValue() + request.getIncrement() ); // I don't trust to make this a constant because the object is not immutable FindOneAndUpdateOptions enableUpsert = new FindOneAndUpdateOptions().upsert( true ); Document originalDocument = sequenceCollection.findOneAndUpdate( sequenceId, setInitialValueOnInsert, enableUpsert ); Object nextValue = null; if ( originalDocument == null ) { return request.getInitialValue(); // first time we ask this value } else { // all columns should match to find the value Document incrementUpdate = new Document(); addSubQuery( "$inc", incrementUpdate, valueColumnName, request.getIncrement() ); Document beforeUpdateDoc = sequenceCollection.findOneAndUpdate( sequenceId, incrementUpdate, new FindOneAndUpdateOptions().upsert( true ) ); nextValue = beforeUpdateDoc.get( valueColumnName ); } return (Number) nextValue; }
@Override public Number nextValue(NextValueRequest request) { String valueColumnName = request.getKey().getMetadata().getValueColumnName(); MongoCollection<Document> sequenceCollection = getCollection( request.getKey().getTable(), null ); Document sequenceId = prepareIdObject( request.getKey() ); Document setInitialValueOnInsert = new Document(); addSubQuery( "$setOnInsert", setInitialValueOnInsert, valueColumnName, request.getInitialValue() + request.getIncrement() ); // I don't trust to make this a constant because the object is not immutable FindOneAndUpdateOptions enableUpsert = new FindOneAndUpdateOptions().upsert( true ); Document originalDocument = sequenceCollection.findOneAndUpdate( sequenceId, setInitialValueOnInsert, enableUpsert ); Object nextValue = null; if ( originalDocument == null ) { return request.getInitialValue(); // first time we ask this value } else { // all columns should match to find the value Document incrementUpdate = new Document(); addSubQuery( "$inc", incrementUpdate, valueColumnName, request.getIncrement() ); Document beforeUpdateDoc = sequenceCollection.findOneAndUpdate( sequenceId, incrementUpdate, new FindOneAndUpdateOptions().upsert( true ) ); nextValue = beforeUpdateDoc.get( valueColumnName ); } return (Number) nextValue; }
private Long nextValueInsert(IdSourceKeyMetadata metadata, String sequenceName, Long value) { Insert insert = QueryBuilder.insertInto( quote( metadata.getName() ) ) .value( quote( metadata.getKeyColumnName() ), QueryBuilder.bindMarker( "sequence_name" ) ) .value( quote( metadata.getValueColumnName() ), QueryBuilder.bindMarker( "sequence_value" ) ) .ifNotExists(); PreparedStatement preparedStatement = provider.getSession().prepare( insert.toString() ); BoundStatement boundStatement = preparedStatement.bind(); boundStatement.setString( "sequence_name", sequenceName ); boundStatement.setLong( "sequence_value", value ); try { provider.getSession().execute( boundStatement ); } catch (DriverException e) { throw e; } return nextValueSelect( metadata, sequenceName ); }