/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.ogm.datastore.neo4j.dialect.impl;
import static org.hibernate.ogm.datastore.neo4j.query.parsing.cypherdsl.impl.CypherDSL.escapeIdentifier;
import java.util.HashMap;
import java.util.Map;
import org.hibernate.boot.model.relational.Sequence;
import org.hibernate.ogm.dialect.spi.NextValueRequest;
import org.hibernate.ogm.model.key.spi.IdSourceKey;
import org.hibernate.ogm.model.key.spi.IdSourceKeyMetadata.IdSourceType;
/**
* @author Davide D'Alto
*/
public abstract class BaseNeo4jSequenceGenerator {
protected static final String INITIAL_VALUE_QUERY_PARAM = "initialValue";
protected static final String SEQUENCE_NAME_QUERY_PARAM = "sequenceName";
/**
* Name of the property of SEQUENCE nodes which holds the sequence name. ORM's default for emulated sequences,
* "sequence_name", is used.
*/
protected static final String SEQUENCE_NAME_PROPERTY = "sequence_name";
/**
* Name of the property of SEQUENCE nodes which holds the next value. ORM's default for emulated sequences,
* "next_val", is used.
*/
protected static final String SEQUENCE_VALUE_PROPERTY = "next_val";
protected String createUniqueConstraintQuery(String propertyName, String label) {
StringBuilder query = new StringBuilder( "CREATE CONSTRAINT ON (n:" );
query.append( label );
query.append( ") ASSERT n." );
escapeIdentifier( query, propertyName );
query.append( " IS UNIQUE" );
return query.toString();
}
protected String key(NextValueRequest request) {
return request.getKey().getTable() + ":" + request.getInitialValue() + ":" + request.getIncrement();
}
protected String sequenceName(IdSourceKey key) {
return key.getMetadata().getType() == IdSourceType.SEQUENCE ? key.getMetadata().getName() : key.getColumnValue();
}
protected Map<String, Object> params(NextValueRequest request) {
return params( sequenceName( request.getKey() ), request.getInitialValue() );
}
protected Map<String, Object> params(Sequence sequence) {
return params( sequence.getName().render(), sequence.getInitialValue() );
}
private Map<String, Object> params(String sequenceName, int initialValue) {
Map<String, Object> params = new HashMap<String, Object>( 3 );
params.put( INITIAL_VALUE_QUERY_PARAM, initialValue );
params.put( SEQUENCE_NAME_QUERY_PARAM, sequenceName );
return params;
}
protected String labels(String... labels) {
StringBuilder builder = new StringBuilder();
for ( String label : labels ) {
builder.append( ":`" );
builder.append( label );
builder.append( "`" );
}
return builder.toString();
}
public abstract Long nextValue(NextValueRequest request);
}