diff --git a/src/integration/java/org/springframework/data/couchbase/repository/SimpleCouchbaseRepositoryTests.java b/src/integration/java/org/springframework/data/couchbase/repository/SimpleCouchbaseRepositoryTests.java
index e547bdf6..7349eebb 100644
--- a/src/integration/java/org/springframework/data/couchbase/repository/SimpleCouchbaseRepositoryTests.java
+++ b/src/integration/java/org/springframework/data/couchbase/repository/SimpleCouchbaseRepositoryTests.java
@@ -18,10 +18,13 @@ package org.springframework.data.couchbase.repository;
import static org.junit.Assert.*;
+import java.util.Arrays;
+
import com.couchbase.client.java.Bucket;
import com.couchbase.client.java.view.Stale;
import com.couchbase.client.java.view.ViewQuery;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -101,6 +104,8 @@ public class SimpleCouchbaseRepositoryTests {
}
@Test
+ @Ignore("View based query with copy of params from a ViewQuery in the method parameter not implemented")
+ //TODO re-enable test once ViewQuery parameters other than designDoc/viewName can be copied
public void shouldFindCustom() {
Iterable users = repository.customViewQuery(ViewQuery.from("", "").limit(2).stale(Stale.FALSE));
int size = 0;
@@ -133,4 +138,12 @@ public class SimpleCouchbaseRepositoryTests {
}
}
+ @Test
+ public void shouldFindFromDeriveQueryWithRegexpAndIn() {
+ User user = repository.findByUsernameRegexAndUsernameIn("uname-[123]", Arrays.asList("uname-2", "uname-4"));
+ assertNotNull(user);
+ assertEquals("testuser-2", user.getKey());
+ assertEquals("uname-2", user.getUsername());
+ }
+
}
diff --git a/src/integration/java/org/springframework/data/couchbase/repository/UserRepository.java b/src/integration/java/org/springframework/data/couchbase/repository/UserRepository.java
index f2a39a39..48f2703c 100644
--- a/src/integration/java/org/springframework/data/couchbase/repository/UserRepository.java
+++ b/src/integration/java/org/springframework/data/couchbase/repository/UserRepository.java
@@ -16,6 +16,8 @@
package org.springframework.data.couchbase.repository;
+import java.util.List;
+
import com.couchbase.client.java.view.ViewQuery;
import org.springframework.data.couchbase.core.view.N1QL;
@@ -35,4 +37,7 @@ public interface UserRepository extends CouchbaseRepository {
@N1QL("SELECT * FROM $BUCKET$ WHERE username = $1")
User findByUsernameBadSelect(String username);
+ @N1QL
+ User findByUsernameRegexAndUsernameIn(String regex, List sample);
+
}
diff --git a/src/main/java/org/springframework/data/couchbase/config/CouchbaseNamespaceHandler.java b/src/main/java/org/springframework/data/couchbase/config/CouchbaseNamespaceHandler.java
index bebed47d..a83e5371 100644
--- a/src/main/java/org/springframework/data/couchbase/config/CouchbaseNamespaceHandler.java
+++ b/src/main/java/org/springframework/data/couchbase/config/CouchbaseNamespaceHandler.java
@@ -18,6 +18,8 @@ package org.springframework.data.couchbase.config;
import org.springframework.beans.factory.xml.NamespaceHandler;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
+import org.springframework.data.couchbase.repository.config.CouchbaseRepositoryConfigurationExtension;
+import org.springframework.data.repository.config.RepositoryBeanDefinitionParser;
/**
* {@link NamespaceHandler} for Couchbase configuration.
@@ -33,7 +35,8 @@ public class CouchbaseNamespaceHandler extends NamespaceHandlerSupport {
* Register bean definition parsers in the namespace handler.
*/
public final void init() {
- //TODO repositories (CouchbaseRepositoryConfigurationExtension and RepositoryBeanDefinitionParser)
+ CouchbaseRepositoryConfigurationExtension extension = new CouchbaseRepositoryConfigurationExtension();
+ registerBeanDefinitionParser("repositories", new RepositoryBeanDefinitionParser(extension));
registerBeanDefinitionParser("env", new CouchbaseEnvironmentParser());
registerBeanDefinitionParser("cluster", new CouchbaseClusterParser());
registerBeanDefinitionParser("bucket", new CouchbaseBucketParser());
diff --git a/src/main/java/org/springframework/data/couchbase/core/mapping/CouchbasePersistentProperty.java b/src/main/java/org/springframework/data/couchbase/core/mapping/CouchbasePersistentProperty.java
index dd2cce4d..04c29785 100644
--- a/src/main/java/org/springframework/data/couchbase/core/mapping/CouchbasePersistentProperty.java
+++ b/src/main/java/org/springframework/data/couchbase/core/mapping/CouchbasePersistentProperty.java
@@ -16,7 +16,9 @@
package org.springframework.data.couchbase.core.mapping;
+import org.springframework.core.convert.converter.Converter;
import org.springframework.data.mapping.PersistentProperty;
+import org.springframework.data.mapping.context.PersistentPropertyPath;
/**
* Represents a property part of an entity that needs to be persisted.
@@ -32,4 +34,16 @@ public interface CouchbasePersistentProperty extends PersistentProperty FIELD_NAME = new Converter() {
+ @Override
+ public String convert(CouchbasePersistentProperty source) {
+ return source.getFieldName();
+ }
+ };
+
+
}
diff --git a/src/main/java/org/springframework/data/couchbase/repository/query/AbstractN1qlBasedQuery.java b/src/main/java/org/springframework/data/couchbase/repository/query/AbstractN1qlBasedQuery.java
index 86e1d990..d092c1a7 100644
--- a/src/main/java/org/springframework/data/couchbase/repository/query/AbstractN1qlBasedQuery.java
+++ b/src/main/java/org/springframework/data/couchbase/repository/query/AbstractN1qlBasedQuery.java
@@ -16,13 +16,10 @@
package org.springframework.data.couchbase.repository.query;
-import java.util.Iterator;
import java.util.List;
import com.couchbase.client.java.document.json.JsonArray;
import com.couchbase.client.java.query.Query;
-import com.couchbase.client.java.query.QueryParams;
-import com.couchbase.client.java.query.QueryPlan;
import com.couchbase.client.java.query.Statement;
import org.springframework.data.couchbase.core.CouchbaseOperations;
@@ -38,7 +35,7 @@ import org.springframework.data.util.StreamUtils;
*/
public abstract class AbstractN1qlBasedQuery implements RepositoryQuery {
- private final CouchbaseQueryMethod queryMethod;
+ protected final CouchbaseQueryMethod queryMethod;
private final CouchbaseOperations couchbaseOperations;
protected AbstractN1qlBasedQuery(CouchbaseQueryMethod queryMethod, CouchbaseOperations couchbaseOperations) {
@@ -46,45 +43,28 @@ public abstract class AbstractN1qlBasedQuery implements RepositoryQuery {
this.couchbaseOperations = couchbaseOperations;
}
- protected abstract Statement getStatement();
+ protected abstract Statement getStatement(ParameterAccessor accessor);
+
+ protected abstract JsonArray getPlaceholderValues(ParameterAccessor accessor);
@Override
public Object execute(Object[] parameters) {
- Statement statement = getStatement();
+ ParameterAccessor accessor = new ParametersParameterAccessor(queryMethod.getParameters(), parameters);
+ Statement statement = getStatement(accessor);
+ JsonArray queryPlaceholderValues = getPlaceholderValues(accessor);
- ParameterAccessor parameterAccessor = new ParametersParameterAccessor(queryMethod.getParameters(), parameters);
- Query query = buildQuery(statement, parameterAccessor.iterator());
+ Query query = buildQuery(statement, queryPlaceholderValues);
return executeDependingOnType(query, queryMethod, queryMethod.isPageQuery(), queryMethod.isModifyingQuery(),
queryMethod.isSliceQuery());
}
- protected static Query buildQuery(Statement statement, Iterator
+ *
+ * @author Simon Baslé
+ */
+public class N1qlQueryCreator extends AbstractQueryCreator {
+
+ private final ParameterAccessor accessor;
+ private final WherePath selectFrom;
+ private final MappingContext extends CouchbasePersistentEntity>, CouchbasePersistentProperty> context;
+
+ public N1qlQueryCreator(PartTree tree, ParameterAccessor parameters, WherePath selectFrom,
+ CouchbaseConverter converter) {
+ super(tree, parameters);
+ this.accessor = parameters;
+ this.selectFrom = selectFrom;
+ this.context = converter.getMappingContext();
+ }
+
+ @Override
+ protected Expression create(Part part, Iterator