Skip to content

Commit

Permalink
OGM-953 Passing typed values with grid types to executeBackendQuery()
Browse files Browse the repository at this point in the history
  • Loading branch information
gunnarmorling committed Jan 8, 2016
1 parent ef10bf5 commit 52d9bac
Show file tree
Hide file tree
Showing 11 changed files with 142 additions and 28 deletions.
Expand Up @@ -12,7 +12,6 @@

import org.hibernate.LockMode;
import org.hibernate.dialect.lock.LockingStrategy;
import org.hibernate.engine.spi.QueryParameters;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.ogm.dialect.batch.spi.BatchableGridDialect;
import org.hibernate.ogm.dialect.batch.spi.OperationsQueue;
Expand All @@ -22,6 +21,7 @@
import org.hibernate.ogm.dialect.query.spi.BackendQuery;
import org.hibernate.ogm.dialect.query.spi.ClosableIterator;
import org.hibernate.ogm.dialect.query.spi.ParameterMetadataBuilder;
import org.hibernate.ogm.dialect.query.spi.QueryParameters;
import org.hibernate.ogm.dialect.query.spi.QueryableGridDialect;
import org.hibernate.ogm.dialect.spi.AssociationContext;
import org.hibernate.ogm.dialect.spi.AssociationTypeContext;
Expand Down
Expand Up @@ -10,10 +10,10 @@
import java.util.Arrays;
import java.util.List;

import org.hibernate.engine.spi.QueryParameters;
import org.hibernate.ogm.dialect.batch.spi.OperationsQueue;
import org.hibernate.ogm.dialect.query.spi.BackendQuery;
import org.hibernate.ogm.dialect.query.spi.ClosableIterator;
import org.hibernate.ogm.dialect.query.spi.QueryParameters;
import org.hibernate.ogm.dialect.spi.AssociationContext;
import org.hibernate.ogm.dialect.spi.AssociationTypeContext;
import org.hibernate.ogm.dialect.spi.GridDialect;
Expand Down
@@ -0,0 +1,50 @@
/*
* 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.dialect.query.spi;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.hibernate.engine.spi.TypedValue;
import org.hibernate.ogm.type.spi.TypeTranslator;

/**
* Represents the parameters passed to a query. Modelled after {@code QueryParameters} in Hibernate ORM, providing only
* those values needed for OGM's purposes at this point.
*
* @author Gunnar Morling
*/
public class QueryParameters {

private final RowSelection rowSelection;
private final Map<String, TypedGridValue> namedParameters;

public QueryParameters(RowSelection rowSelection, Map<String, TypedGridValue> namedParameters) {
this.rowSelection = rowSelection;
this.namedParameters = namedParameters;
}

public static QueryParameters fromOrmQueryParameters(org.hibernate.engine.spi.QueryParameters parameters, TypeTranslator typeTranslator) {
RowSelection selection = RowSelection.fromOrmRowSelection( parameters.getRowSelection() );
Map<String, TypedGridValue> namedParameters = new HashMap<>();

for ( Entry<String, TypedValue> parameter : parameters.getNamedParameters().entrySet() ) {
namedParameters.put( parameter.getKey(), TypedGridValue.fromOrmTypedValue( parameter.getValue(), typeTranslator ) );
}

return new QueryParameters( selection, namedParameters );
}

public RowSelection getRowSelection() {
return rowSelection;
}

public Map<String, TypedGridValue> getNamedParameters() {
return namedParameters;
}
}
Expand Up @@ -8,7 +8,6 @@

import java.io.Serializable;

import org.hibernate.engine.spi.QueryParameters;
import org.hibernate.ogm.dialect.spi.GridDialect;
import org.hibernate.ogm.model.spi.Tuple;

Expand Down
@@ -0,0 +1,36 @@
/*
* 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.dialect.query.spi;

/**
* Represents the selection criteria of a query. Modelled after {@code RowSelection} in Hibernate ORM, providing only
* those values needed for OGM's purposes at this point.
*
* @author Gunnar Morling
*/
public class RowSelection {

private final Integer firstRow;
private final Integer maxRows;

public RowSelection(Integer firstRow, Integer maxRows) {
this.firstRow = firstRow;
this.maxRows = maxRows;
}

public static RowSelection fromOrmRowSelection(org.hibernate.engine.spi.RowSelection rowSelection) {
return new RowSelection( rowSelection.getFirstRow(), rowSelection.getMaxRows() );
}

public Integer getFirstRow() {
return firstRow;
}

public Integer getMaxRows() {
return maxRows;
}
}
@@ -0,0 +1,41 @@
/*
* 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.dialect.query.spi;

import org.hibernate.engine.spi.TypedValue;
import org.hibernate.ogm.type.spi.GridType;
import org.hibernate.ogm.type.spi.TypeTranslator;

/**
* Represents a value and its grid type.the selection criteria of a query. Modelled after {@code TypedValue} in
* Hibernate ORM.
*
* @author Gunnar Morling
*/
public class TypedGridValue {

private final GridType type;
private final Object value;

public TypedGridValue(GridType type, Object value) {
this.type = type;
this.value = value;
}

public static TypedGridValue fromOrmTypedValue(TypedValue typedValue, TypeTranslator typeTranslator) {
GridType gridType = typeTranslator.getType( typedValue.getType() );
return new TypedGridValue( gridType, typedValue.getValue() );
}

public GridType getType() {
return type;
}

public Object getValue() {
return value;
}
}
Expand Up @@ -14,7 +14,6 @@

import org.hibernate.HibernateException;
import org.hibernate.LockOptions;
import org.hibernate.engine.spi.QueryParameters;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.loader.custom.CustomLoader;
Expand All @@ -24,6 +23,7 @@
import org.hibernate.loader.custom.ScalarReturn;
import org.hibernate.ogm.dialect.query.spi.BackendQuery;
import org.hibernate.ogm.dialect.query.spi.ClosableIterator;
import org.hibernate.ogm.dialect.query.spi.QueryParameters;
import org.hibernate.ogm.dialect.query.spi.QueryableGridDialect;
import org.hibernate.ogm.loader.impl.OgmLoader;
import org.hibernate.ogm.loader.impl.OgmLoadingContext;
Expand Down Expand Up @@ -82,8 +82,8 @@ private boolean isEntityQuery() {
}

@Override
protected List<?> list(SessionImplementor session, QueryParameters queryParameters, Set querySpaces, Type[] resultTypes) throws HibernateException {
ClosableIterator<Tuple> tuples = loaderContext.executeQuery( queryParameters );
protected List<?> list(SessionImplementor session, org.hibernate.engine.spi.QueryParameters queryParameters, Set querySpaces, Type[] resultTypes) throws HibernateException {
ClosableIterator<Tuple> tuples = loaderContext.executeQuery( QueryParameters.fromOrmQueryParameters( queryParameters, typeTranslator ) );
try {
if ( isEntityQuery() ) {
return listOfEntities( session, resultTypes, tuples );
Expand Down
Expand Up @@ -14,14 +14,14 @@

import org.hibernate.HibernateException;
import org.hibernate.LockOptions;
import org.hibernate.engine.spi.QueryParameters;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.hql.internal.ast.QueryTranslatorImpl;
import org.hibernate.hql.internal.ast.tree.SelectClause;
import org.hibernate.loader.hql.QueryLoader;
import org.hibernate.ogm.dialect.query.spi.BackendQuery;
import org.hibernate.ogm.dialect.query.spi.ClosableIterator;
import org.hibernate.ogm.dialect.query.spi.QueryParameters;
import org.hibernate.ogm.dialect.query.spi.QueryableGridDialect;
import org.hibernate.ogm.loader.impl.OgmLoader;
import org.hibernate.ogm.loader.impl.OgmLoadingContext;
Expand Down Expand Up @@ -64,10 +64,10 @@ private static <T extends Serializable> OgmQueryLoaderContext<T> getLoaderContex
}

@Override
protected List<?> list(SessionImplementor session, QueryParameters queryParameters, Set<Serializable> querySpaces, Type[] resultTypes)
protected List<?> list(SessionImplementor session, org.hibernate.engine.spi.QueryParameters queryParameters, Set<Serializable> querySpaces, Type[] resultTypes)
throws HibernateException {

ClosableIterator<Tuple> tuples = loaderContext.executeQuery( queryParameters );
ClosableIterator<Tuple> tuples = loaderContext.executeQuery( QueryParameters.fromOrmQueryParameters( queryParameters, typeTranslator ) );
try {
if ( hasScalars ) {
return listOfArrays( session, tuples );
Expand Down
Expand Up @@ -18,7 +18,6 @@
import java.util.Iterator;
import java.util.List;

import org.hibernate.engine.spi.QueryParameters;
import org.hibernate.ogm.datastore.spi.DatastoreProvider;
import org.hibernate.ogm.dialect.batch.spi.InsertOrUpdateAssociationOperation;
import org.hibernate.ogm.dialect.batch.spi.InsertOrUpdateTupleOperation;
Expand All @@ -29,6 +28,7 @@
import org.hibernate.ogm.dialect.impl.ForwardingGridDialect;
import org.hibernate.ogm.dialect.query.spi.BackendQuery;
import org.hibernate.ogm.dialect.query.spi.ClosableIterator;
import org.hibernate.ogm.dialect.query.spi.QueryParameters;
import org.hibernate.ogm.dialect.spi.AssociationContext;
import org.hibernate.ogm.dialect.spi.GridDialect;
import org.hibernate.ogm.dialect.spi.TupleContext;
Expand Down
Expand Up @@ -24,7 +24,6 @@
import org.bson.types.ObjectId;
import org.hibernate.HibernateException;
import org.hibernate.annotations.common.AssertionFailure;
import org.hibernate.engine.spi.QueryParameters;
import org.hibernate.ogm.datastore.document.association.spi.impl.DocumentHelpers;
import org.hibernate.ogm.datastore.document.cfg.DocumentStoreProperties;
import org.hibernate.ogm.datastore.document.impl.DotPatternMapHelpers;
Expand Down Expand Up @@ -67,6 +66,7 @@
import org.hibernate.ogm.dialect.query.spi.ClosableIterator;
import org.hibernate.ogm.dialect.query.spi.NoOpParameterMetadataBuilder;
import org.hibernate.ogm.dialect.query.spi.ParameterMetadataBuilder;
import org.hibernate.ogm.dialect.query.spi.QueryParameters;
import org.hibernate.ogm.dialect.query.spi.QueryableGridDialect;
import org.hibernate.ogm.dialect.spi.AssociationContext;
import org.hibernate.ogm.dialect.spi.AssociationTypeContext;
Expand Down
Expand Up @@ -24,9 +24,7 @@
import java.util.Set;

import org.hibernate.AssertionFailure;
import org.hibernate.engine.spi.QueryParameters;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.TypedValue;
import org.hibernate.ogm.datastore.impl.EmptyTupleSnapshot;
import org.hibernate.ogm.datastore.neo4j.dialect.impl.MapsTupleIterator;
import org.hibernate.ogm.datastore.neo4j.dialect.impl.Neo4jAssociationQueries;
Expand All @@ -46,7 +44,9 @@
import org.hibernate.ogm.dialect.query.spi.BackendQuery;
import org.hibernate.ogm.dialect.query.spi.ClosableIterator;
import org.hibernate.ogm.dialect.query.spi.ParameterMetadataBuilder;
import org.hibernate.ogm.dialect.query.spi.QueryParameters;
import org.hibernate.ogm.dialect.query.spi.QueryableGridDialect;
import org.hibernate.ogm.dialect.query.spi.TypedGridValue;
import org.hibernate.ogm.dialect.spi.AssociationContext;
import org.hibernate.ogm.dialect.spi.AssociationTypeContext;
import org.hibernate.ogm.dialect.spi.BaseGridDialect;
Expand All @@ -69,12 +69,9 @@
import org.hibernate.ogm.persister.impl.OgmCollectionPersister;
import org.hibernate.ogm.persister.impl.OgmEntityPersister;
import org.hibernate.ogm.type.spi.GridType;
import org.hibernate.ogm.type.spi.TypeTranslator;
import org.hibernate.ogm.util.impl.ArrayHelper;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.service.spi.ServiceRegistryAwareService;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.type.Type;
import org.neo4j.graphdb.ConstraintViolationException;
import org.neo4j.graphdb.Direction;
Expand All @@ -98,7 +95,7 @@
*
* @author Davide D'Alto &lt;davide@hibernate.org&gt;
*/
public class Neo4jDialect extends BaseGridDialect implements MultigetGridDialect, QueryableGridDialect<String>, ServiceRegistryAwareService, SessionFactoryLifecycleAwareDialect {
public class Neo4jDialect extends BaseGridDialect implements MultigetGridDialect, QueryableGridDialect<String>, SessionFactoryLifecycleAwareDialect {

public static final String CONSTRAINT_VIOLATION_CODE = "Neo.ClientError.Schema.ConstraintViolation";

Expand All @@ -108,8 +105,6 @@ public class Neo4jDialect extends BaseGridDialect implements MultigetGridDialect

private final GraphDatabaseService dataBase;

private ServiceRegistryImplementor serviceRegistry;

private Map<EntityKeyMetadata, Neo4jEntityQueries> entityQueries;

private Map<AssociationKeyMetadata, Neo4jAssociationQueries> associationQueries;
Expand All @@ -120,11 +115,6 @@ public Neo4jDialect(Neo4jDatastoreProvider provider) {
this.neo4jSequenceGenerator = provider.getSequenceGenerator();
}

@Override
public void injectServices(ServiceRegistryImplementor serviceRegistry) {
this.serviceRegistry = serviceRegistry;
}

@Override
public void sessionFactoryCreated(SessionFactoryImplementor sessionFactoryImplementor) {
this.associationQueries = Collections.unmodifiableMap( initializeAssociationQueries( sessionFactoryImplementor ) );
Expand Down Expand Up @@ -669,11 +659,9 @@ private void applyMaxRows(QueryParameters queryParameters, StringBuilder nativeQ
private Map<String, Object> getNamedParameterValuesConvertedByGridType(QueryParameters queryParameters) {
Map<String, Object> parameterValues = new HashMap<String, Object>( queryParameters.getNamedParameters().size() );
Tuple dummy = new Tuple();
TypeTranslator typeTranslator = serviceRegistry.getService( TypeTranslator.class );

for ( Entry<String, TypedValue> parameter : queryParameters.getNamedParameters().entrySet() ) {
GridType gridType = typeTranslator.getType( parameter.getValue().getType() );
gridType.nullSafeSet( dummy, parameter.getValue().getValue(), new String[]{ parameter.getKey() }, null );
for ( Entry<String, TypedGridValue> parameter : queryParameters.getNamedParameters().entrySet() ) {
parameter.getValue().getType().nullSafeSet( dummy, parameter.getValue().getValue(), new String[]{ parameter.getKey() }, null );
parameterValues.put( parameter.getKey(), dummy.get( parameter.getKey() ) );
}

Expand Down

0 comments on commit 52d9bac

Please sign in to comment.