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 ); }
private boolean hasIdGeneration(Set<IdSourceKeyMetadata> idSourceKeys) { for ( IdSourceKeyMetadata idSourceKeyMetadata : idSourceKeys ) { if ( idSourceKeyMetadata.getType() == IdSourceType.TABLE ) { return true; } } return false; }
/** * Adds a unique constraint to make sure that each node of the same "sequence table" is unique. */ private void addUniqueConstraintForTableBasedSequence(List<Statement> statements, IdSourceKeyMetadata generatorKeyMetadata) { Statement statement = createUniqueConstraintStatement( generatorKeyMetadata.getKeyColumnName(), generatorKeyMetadata.getName() ); statements.add( statement ); }
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() ); }
/** * Get the table name if this is a table-based generator, the sequence name otherwise. * * @return the table or the sequence name */ public String getTable() { return metadata.getName(); }
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(); } }
private void validateGenerators(Iterable<IdSourceKeyMetadata> allIdSourceKeyMetadata) { for ( IdSourceKeyMetadata idSourceKeyMetadata : allIdSourceKeyMetadata ) { String keyColumn = idSourceKeyMetadata.getKeyColumnName(); if ( !keyColumn.equals( MongoDBDialect.ID_FIELDNAME ) ) { log.cannotUseGivenPrimaryKeyColumnName( keyColumn, MongoDBDialect.ID_FIELDNAME ); } } }
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(); } } } }
@Override public Cache<PersistentIdSourceKey, Object> getIdSourceCache(IdSourceKeyMetadata keyMetadata) { return idSourceCaches.get( keyMetadata.getName() ); }
/** * Adds a unique constraint to make sure that each node of the same "sequence table" is unique. */ private void addUniqueConstraintForTableBasedSequence(Statements statements, IdSourceKeyMetadata generatorKeyMetadata) { Statement statement = createUniqueConstraintStatement( generatorKeyMetadata.getKeyColumnName(), generatorKeyMetadata.getName() ); statements.addStatement( statement ); }
private void initializeIdSources(SchemaDefinitionContext context, IgniteDatastoreProvider igniteDatastoreProvider) { if ( idSourceKeyMetadata.getType() == IdSourceKeyMetadata.IdSourceType.TABLE ) { try { try { throw log.unableToInitializeCache( idSourceKeyMetadata.getName(), ex ); if ( idSourceKeyMetadata.getType() == IdSourceKeyMetadata.IdSourceType.SEQUENCE ) { if ( idSourceKeyMetadata.getName() != null && !generatedSequences.contains( idSourceKeyMetadata.getName() ) ) { igniteDatastoreProvider.atomicSequence( idSourceKeyMetadata.getName(), 1, true );
private void validateGenerators(Iterable<IdSourceKeyMetadata> allIdSourceKeyMetadata) { for ( IdSourceKeyMetadata idSourceKeyMetadata : allIdSourceKeyMetadata ) { String keyColumn = idSourceKeyMetadata.getKeyColumnName(); if ( !keyColumn.equals( MongoDBDialect.ID_FIELDNAME ) ) { log.cannotUseGivenPrimaryKeyColumnName( keyColumn, MongoDBDialect.ID_FIELDNAME ); } } }
@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; }
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; }
@Override public Cache<PerTableSerializableIdSourceKey> getIdSourceCache(IdSourceKeyMetadata keyMetadata) { return idSourceCaches.get( keyMetadata.getName() ); }
/** * Adds a unique constraint to make sure that each node of the same "sequence table" is unique. */ private void addUniqueConstraintForTableBasedSequence(IdSourceKeyMetadata generatorKeyMetadata) { Label generatorKeyLabel = Label.label( generatorKeyMetadata.getName() ); if ( isMissingUniqueConstraint( generatorKeyLabel ) ) { neo4jDb.schema().constraintFor( generatorKeyLabel ).assertPropertyIsUnique( generatorKeyMetadata.getKeyColumnName() ).create(); } }
@Override public Number nextValue(NextValueRequest request) { Long result = null; switch ( request.getKey().getMetadata().getType() ) { case TABLE: IgniteCache<String, Long> cache = provider.getIdSourceCache( request.getKey().getMetadata() ); IgniteAtomicSequence seq = provider.atomicSequence( request.getKey().getMetadata().getName(), request.getInitialValue(), false ); result = seq.getAndAdd( request.getIncrement() ); break;
private boolean hasIdGeneration(Set<IdSourceKeyMetadata> idSourceKeys) { for ( IdSourceKeyMetadata idSourceKeyMetadata : idSourceKeys ) { if ( idSourceKeyMetadata.getType() == IdSourceType.TABLE ) { return true; } } return false; }
private IdSourceKey(IdSourceKeyMetadata metadata, String columnValue) { this.metadata = metadata; this.columnName = metadata.getKeyColumnName(); this.columnValue = columnValue; this.hashCode = calculateHashCode(); }