/* * 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.dialect.impl.NodeLabel.ENTITY; import static org.hibernate.ogm.datastore.neo4j.query.parsing.cypherdsl.impl.CypherDSL.escapeIdentifier; import java.util.HashMap; import java.util.Map; import org.hibernate.ogm.model.key.spi.EntityKeyMetadata; import org.neo4j.graphdb.Result; /** * Provides common functionality required for query creation. * * @author Davide D'Alto * @author Gunnar Morling */ class BaseNeo4jQueries { protected static void appendLabel(EntityKeyMetadata entityKeyMetadata, StringBuilder queryBuilder) { escapeIdentifier( queryBuilder, entityKeyMetadata.getTable() ); } protected static void appendProperties(EntityKeyMetadata entityKeyMetadata, StringBuilder queryBuilder) { appendProperties( queryBuilder, entityKeyMetadata.getColumnNames(), 0 ); } protected static void appendProperties(StringBuilder queryBuilder, String[] columnNames, int offset) { if ( columnNames.length > 0 ) { queryBuilder.append( " {" ); for ( int i = 0; i < columnNames.length; i++ ) { escapeIdentifier( queryBuilder, columnNames[i] ); queryBuilder.append( ": {" ); queryBuilder.append( offset + i ); queryBuilder.append( "}" ); if ( i < columnNames.length - 1 ) { queryBuilder.append( ", " ); } } queryBuilder.append( "}" ); } } protected Map<String, Object> params(Object[] columnValues) { return params( columnValues, 0 ); } protected Map<String, Object> params(Object[] columnValues, int offset) { Map<String, Object> params = new HashMap<String, Object>( columnValues.length ); for ( int i = 0; i < columnValues.length; i++ ) { params.put( String.valueOf( offset + i ), columnValues[i] ); } return params; } /* * Example: * * MATCH (owner:ENTITY:table {id: {0}}) */ protected static void appendMatchOwnerEntityNode(StringBuilder queryBuilder, EntityKeyMetadata ownerEntityKeyMetadata) { queryBuilder.append( "MATCH " ); appendEntityNode( "owner", ownerEntityKeyMetadata, queryBuilder ); } /* * Example: * * (owner:ENTITY:table {id: {0}}) */ protected static void appendEntityNode(String alias, EntityKeyMetadata entityKeyMetadata, StringBuilder queryBuilder) { appendEntityNode( alias, entityKeyMetadata, queryBuilder, 0 ); } protected static void appendEntityNode(String alias, EntityKeyMetadata entityKeyMetadata, StringBuilder queryBuilder, int offset) { queryBuilder.append( "(" ); queryBuilder.append( alias ); queryBuilder.append( ":" ); queryBuilder.append( ENTITY ); queryBuilder.append( ":" ); appendLabel( entityKeyMetadata, queryBuilder ); appendProperties( queryBuilder, entityKeyMetadata.getColumnNames(), offset ); queryBuilder.append( ")" ); } protected static void appendRelationshipType(StringBuilder queryBuilder, String relationshipType) { escapeIdentifier( queryBuilder, relationshipType ); } @SuppressWarnings("unchecked") protected <T> T singleResult(Result result) { try { if ( result.hasNext() ) { return (T) result.next().values().iterator().next(); } return null; } finally { result.close(); } } }