DATAJPA-628 - Use a shared SpelParser instead of recreating it.

We now use a shared SpelExpressionParser and propagate this through the String-based JpaRepositoryQuery implementations to avoid reinstantiations.

Cleaned up ParameterBinder inheritance hierarchy by merging (and removing) ExpressionAwareParameterBinder into SpelExpressionStringQueryParameterBinder.

Original pull request: #121.
This commit is contained in:
Thomas Darimont
2014-11-14 11:25:43 +01:00
committed by Oliver Gierke
parent 5c906ce73c
commit 0184c95a4b
11 changed files with 146 additions and 180 deletions

View File

@@ -23,6 +23,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.expression.spel.standard.SpelExpressionParser;
/**
* Unit tests for {@link ExpressionBasedStringQuery}.
@@ -35,6 +36,8 @@ public class ExpressionBasedStringQueryUnitTests {
@Mock JpaEntityMetadata<?> metadata;
static final SpelExpressionParser SPEL_PARSER = new SpelExpressionParser();
/**
* @see DATAJPA-170
*/
@@ -44,7 +47,7 @@ public class ExpressionBasedStringQueryUnitTests {
when(metadata.getEntityName()).thenReturn("User");
String source = "select from #{#entityName} u where u.firstname like :firstname";
StringQuery query = new ExpressionBasedStringQuery(source, metadata);
StringQuery query = new ExpressionBasedStringQuery(source, metadata, SPEL_PARSER);
assertThat(query.getQueryString(), is("select from User u where u.firstname like :firstname"));
}
@@ -56,7 +59,7 @@ public class ExpressionBasedStringQueryUnitTests {
when(metadata.getEntityName()).thenReturn("User");
StringQuery query = new ExpressionBasedStringQuery("select u from #{#entityName} u", metadata);
StringQuery query = new ExpressionBasedStringQuery("select u from #{#entityName} u", metadata, SPEL_PARSER);
assertThat(query.getAlias(), is("u"));
assertThat(query.getQueryString(), is("select u from User u"));
}

View File

@@ -41,8 +41,9 @@ import org.springframework.data.repository.Repository;
import org.springframework.data.repository.core.NamedQueries;
import org.springframework.data.repository.core.RepositoryMetadata;
import org.springframework.data.repository.core.support.DefaultRepositoryMetadata;
import org.springframework.data.repository.query.QueryLookupStrategy;
import org.springframework.data.repository.query.DefaultEvaluationContextProvider;
import org.springframework.data.repository.query.EvaluationContextProvider;
import org.springframework.data.repository.query.QueryLookupStrategy;
import org.springframework.data.repository.query.QueryLookupStrategy.Key;
/**
@@ -54,6 +55,7 @@ import org.springframework.data.repository.query.QueryLookupStrategy.Key;
@RunWith(MockitoJUnitRunner.class)
public class JpaQueryLookupStrategyUnitTests {
private static final EvaluationContextProvider EVALUATION_CONTEXT_PROVIDER = DefaultEvaluationContextProvider.INSTANCE;
@Mock EntityManager em;
@Mock EntityManagerFactory emf;
@Mock QueryExtractor extractor;
@@ -75,7 +77,7 @@ public class JpaQueryLookupStrategyUnitTests {
public void invalidAnnotatedQueryCausesException() throws Exception {
QueryLookupStrategy strategy = JpaQueryLookupStrategy.create(em, Key.CREATE_IF_NOT_FOUND, extractor,
DefaultEvaluationContextProvider.INSTANCE);
EVALUATION_CONTEXT_PROVIDER);
Method method = UserRepository.class.getMethod("findByFoo", String.class);
RepositoryMetadata metadata = new DefaultRepositoryMetadata(UserRepository.class);
@@ -97,7 +99,7 @@ public class JpaQueryLookupStrategyUnitTests {
public void sholdThrowMorePreciseExceptionIfTryingToUsePaginationInNativeQueries() throws Exception {
QueryLookupStrategy strategy = JpaQueryLookupStrategy.create(em, Key.CREATE_IF_NOT_FOUND, extractor,
DefaultEvaluationContextProvider.INSTANCE);
EVALUATION_CONTEXT_PROVIDER);
Method method = UserRepository.class.getMethod("findByInvalidNativeQuery", String.class, Pageable.class);
RepositoryMetadata metadata = new DefaultRepositoryMetadata(UserRepository.class);

View File

@@ -44,8 +44,10 @@ import org.springframework.data.jpa.provider.QueryExtractor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.sample.UserRepository;
import org.springframework.data.repository.core.RepositoryMetadata;
import org.springframework.data.repository.query.RepositoryQuery;
import org.springframework.data.repository.query.DefaultEvaluationContextProvider;
import org.springframework.data.repository.query.EvaluationContextProvider;
import org.springframework.data.repository.query.RepositoryQuery;
import org.springframework.expression.spel.standard.SpelExpressionParser;
/**
* Unit test for {@link SimpleJpaQuery}.
@@ -57,6 +59,8 @@ import org.springframework.data.repository.query.DefaultEvaluationContextProvide
public class SimpleJpaQueryUnitTests {
static final String USER_QUERY = "select u from User u";
static final SpelExpressionParser PARSER = new SpelExpressionParser();
private static final EvaluationContextProvider EVALUATION_CONTEXT_PROVIDER = DefaultEvaluationContextProvider.INSTANCE;
JpaQueryMethod method;
@@ -95,8 +99,8 @@ public class SimpleJpaQueryUnitTests {
when(method.getEntityInformation()).thenReturn((JpaEntityMetadata) new DefaultJpaEntityMetadata<User>(User.class));
when(em.createQuery("foo", Long.class)).thenReturn(query);
SimpleJpaQuery jpaQuery = new SimpleJpaQuery(method, em, "select u from User u",
DefaultEvaluationContextProvider.INSTANCE);
SimpleJpaQuery jpaQuery = new SimpleJpaQuery(method, em, "select u from User u", EVALUATION_CONTEXT_PROVIDER,
PARSER);
assertThat(jpaQuery.createCountQuery(new Object[] {}), is(query));
}
@@ -113,7 +117,7 @@ public class SimpleJpaQueryUnitTests {
JpaQueryMethod queryMethod = new JpaQueryMethod(method, metadata, extractor);
AbstractJpaQuery jpaQuery = new SimpleJpaQuery(queryMethod, em, "select u from User u",
DefaultEvaluationContextProvider.INSTANCE);
EVALUATION_CONTEXT_PROVIDER, PARSER);
jpaQuery.createCountQuery(new Object[] { new PageRequest(1, 10) });
verify(query, times(0)).setFirstResult(anyInt());
@@ -127,7 +131,7 @@ public class SimpleJpaQueryUnitTests {
Method method = SampleRepository.class.getMethod("findNativeByLastname", String.class);
JpaQueryMethod queryMethod = new JpaQueryMethod(method, metadata, extractor);
AbstractJpaQuery jpaQuery = JpaQueryFactory.INSTANCE.fromQueryAnnotation(queryMethod, em,
DefaultEvaluationContextProvider.INSTANCE);
EVALUATION_CONTEXT_PROVIDER);
assertThat(jpaQuery instanceof NativeJpaQuery, is(true));
@@ -208,8 +212,7 @@ public class SimpleJpaQueryUnitTests {
private RepositoryQuery createJpaQuery(Method method) {
JpaQueryMethod queryMethod = new JpaQueryMethod(method, metadata, extractor);
return JpaQueryFactory.INSTANCE.fromQueryAnnotation(queryMethod, em,
DefaultEvaluationContextProvider.INSTANCE);
return JpaQueryFactory.INSTANCE.fromQueryAnnotation(queryMethod, em, EVALUATION_CONTEXT_PROVIDER);
}
interface SampleRepository {