diff --git a/pom.xml b/pom.xml
index e7a34016e..180442e31 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,7 +38,7 @@
1.7
1.7
- 2.1.4
+ 2.1.5
0.13-neo4j-2.1.4
2.0.1
diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/IndexTests.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/IndexTests.java
index c54ef0e96..91432b771 100644
--- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/IndexTests.java
+++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/IndexTests.java
@@ -52,10 +52,10 @@ import static org.springframework.data.neo4j.aspects.Person.persistedPerson;
public class IndexTests extends EntityTestBase {
- private static final String NAME = "name";
- private static final String NAME_VALUE = "aName";
- private static final String NAME_VALUE2 = "aSecondName";
- private static final String NAME_VALUE3 = "aThirdName";
+ protected static final String NAME = "name";
+ protected static final String NAME_VALUE = "aName";
+ protected static final String NAME_VALUE2 = "aSecondName";
+ protected static final String NAME_VALUE3 = "aThirdName";
@Test
@Transactional
diff --git a/spring-data-neo4j-examples/cineasts-rest/src/test/resources/movies-test-context.xml b/spring-data-neo4j-examples/cineasts-rest/src/test/resources/movies-test-context.xml
index 78df40693..a65e8fc59 100644
--- a/spring-data-neo4j-examples/cineasts-rest/src/test/resources/movies-test-context.xml
+++ b/spring-data-neo4j-examples/cineasts-rest/src/test/resources/movies-test-context.xml
@@ -16,7 +16,7 @@
-
+
@@ -26,4 +26,4 @@
-
\ No newline at end of file
+
diff --git a/spring-data-neo4j-rest/pom.xml b/spring-data-neo4j-rest/pom.xml
index b13bd73ed..2a1996cb0 100644
--- a/spring-data-neo4j-rest/pom.xml
+++ b/spring-data-neo4j-rest/pom.xml
@@ -18,8 +18,7 @@
1.0.0.GA
1.9
- 2.1.4
- 2.0.1
+ 2.1.5
diff --git a/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/CypherRestGraphDatabase.java b/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/CypherRestGraphDatabase.java
index 6ea295d97..fa03d38c4 100644
--- a/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/CypherRestGraphDatabase.java
+++ b/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/CypherRestGraphDatabase.java
@@ -38,7 +38,7 @@ import java.util.Map;
import java.util.Set;
-public class CypherRestGraphDatabase extends AbstractRemoteDatabase {
+public class CypherRestGraphDatabase extends AbstractRemoteDatabase implements RestAPIProvider {
private RestAPICypherImpl restAPI;
public CypherRestGraphDatabase(RestAPI restAPI){
@@ -121,7 +121,7 @@ public class CypherRestGraphDatabase extends AbstractRemoteDatabase {
public void shutdown() {
try {
getTxManager().rollback();
- } catch (SystemException e) {
+ } catch (SystemException|IllegalStateException e) {
// ignore
}
restAPI.close();
diff --git a/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/RestAPICypherImpl.java b/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/RestAPICypherImpl.java
index 5f7632dce..a5e524abf 100644
--- a/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/RestAPICypherImpl.java
+++ b/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/RestAPICypherImpl.java
@@ -19,9 +19,9 @@
*/
package org.neo4j.rest.graphdb;
+import org.apache.lucene.search.Query;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.index.IndexHits;
-import org.neo4j.helpers.Pair;
import org.neo4j.helpers.collection.IterableWrapper;
import org.neo4j.helpers.collection.IteratorUtil;
import org.neo4j.helpers.collection.MapUtil;
@@ -40,7 +40,6 @@ import org.neo4j.rest.graphdb.util.QueryResult;
import org.neo4j.rest.graphdb.util.QueryResultBuilder;
import org.neo4j.rest.graphdb.util.ResultConverter;
-import javax.ws.rs.core.Response.Status;
import java.util.*;
import static java.util.Arrays.asList;
@@ -51,8 +50,8 @@ import static org.neo4j.rest.graphdb.query.CypherTransaction.Statement;
public class RestAPICypherImpl implements RestAPI {
- public static final String _QUERY_RETURN_NODE = " RETURN id(n) as id, labels(n) as labels, n as data";
- public static final String _QUERY_RETURN_REL = " RETURN id(r) as id, type(r) as type, r as data, id(startNode(r)) as start, id(endNode(r)) as end";
+ public static final String _QUERY_RETURN_NODE = " RETURN id(n) as id, labels(n) as labels, n as properties";
+ public static final String _QUERY_RETURN_REL = " RETURN id(r) as id, type(r) as type, r as properties, id(startNode(r)) as start, id(endNode(r)) as end";
public static String MATCH_NODE_QUERY(String name) {
return " MATCH (" + name + ") WHERE id(" + name + ") = {id_" + name + "} ";
@@ -65,6 +64,9 @@ public class RestAPICypherImpl implements RestAPI {
public static final String GET_REL_TYPES_QUERY = _MATCH_NODE_QUERY + " MATCH (n)-[r]-() RETURN distinct type(r) as relType";
+ private RestIndexManager restIndex = new RestIndexManager(this);
+ private RestIndexManager restIndexOld;
+
private String createNodeQuery(Collection labels) {
String labelString = toLabelString(labels);
return "CREATE (n" + labelString + " {props}) " + _QUERY_RETURN_NODE;
@@ -96,6 +98,7 @@ public class RestAPICypherImpl implements RestAPI {
protected RestAPICypherImpl(RestAPI restAPI) {
this.restAPI = restAPI;
+ restIndexOld = new RestIndexManager(restAPI);
}
@Override
@@ -105,7 +108,7 @@ public class RestAPICypherImpl implements RestAPI {
if (restNode != null) return restNode;
}
if (force == Load.FromCache) return new RestNode(RestNode.nodeUri(this, id), this);
- Iterator> result = query(GET_NODE_QUERY, map("id", id)).getData().iterator();
+ Iterator> result = runQuery(GET_NODE_QUERY, map("id", id)).getRows().iterator();
if (!result.hasNext()) {
throw new NotFoundException("Node not found " + id);
}
@@ -146,7 +149,7 @@ public class RestAPICypherImpl implements RestAPI {
@Override
public RestRelationship getRelationshipById(long id) {
try {
- Iterator> result = query(GET_REL_QUERY, map("id", id)).getData().iterator();
+ Iterator> result = runQuery(GET_REL_QUERY, map("id", id)).getRows().iterator();
if (!result.hasNext()) {
throw new NotFoundException("Relationship not found " + id);
}
@@ -170,7 +173,7 @@ public class RestAPICypherImpl implements RestAPI {
@Override
public RestNode createNode(Map props, Collection labels) {
- Iterator> result = query(createNodeQuery(labels), map("props", props(props))).getData().iterator();
+ Iterator> result = runQuery(createNodeQuery(labels), map("props", props(props))).getRows().iterator();
if (result.hasNext()) {
return addToCache(toNode(result.next()));
}
@@ -184,7 +187,7 @@ public class RestAPICypherImpl implements RestAPI {
nodeProperties = props(nodeProperties);
Map props = nodeProperties.containsKey(key) ? nodeProperties : MapUtil.copyAndPut(nodeProperties, key, value);
Map params = map("props", props, "value", value);
- Iterator> result = query(mergeQuery(labelName, key, labels), params).getData().iterator();
+ Iterator> result = runQuery(mergeQuery(labelName, key, labels), params).getRows().iterator();
if (!result.hasNext())
throw new RuntimeException("Error merging node with labels: " + labelName + " key " + key + " value " + value + " labels " + labels + " and props: " + props + " no data returned");
@@ -291,11 +294,10 @@ public class RestAPICypherImpl implements RestAPI {
@Override
public void addLabels(RestNode node, Collection labels) {
String statement = _MATCH_NODE_QUERY + " SET n" + toLabelString(labels) + _QUERY_RETURN_NODE;
- runQuery(statement, map("id", node.getId()));
- RequestResult response = getRestRequest().with(node.getUri()).post("labels", labels);
+ CypherTransaction.Result result = runQuery(statement, map("id", node.getId()));
- if (response.statusOtherThan(Status.NO_CONTENT)) {
- throw new IllegalStateException("error adding labels, received " + response);
+ if (!result.hasData()) {
+ throw new RuntimeException("Error adding labels " + labels + " to node " + node);
}
}
@@ -314,6 +316,7 @@ public class RestAPICypherImpl implements RestAPI {
@Override
public IndexHits getIndex(Class entityType, String indexName, String key, Object value) {
+ if (value instanceof Query) return restAPI.getIndex(entityType, indexName, key, value);
String index = key == null ? ":`" + indexName + "`({query})" : ":`" + indexName + "`(`" + key + "`={query})";
if (Node.class.isAssignableFrom(entityType)) {
String statement = "start n=node" + index + _QUERY_RETURN_NODE;
@@ -330,7 +333,9 @@ public class RestAPICypherImpl implements RestAPI {
@Override
public IndexHits queryIndex(Class entityType, String indexName, String key, Object value) {
+ if (value instanceof Query) return restAPI.queryIndex(entityType,indexName,key,value);
String index = ":`" + indexName + "`({query})";
+ if (key != null && !key.isEmpty() && !value.toString().contains(":")) value = key + ":"+value;
if (Node.class.isAssignableFrom(entityType)) {
String statement = "start n=node" + index + _QUERY_RETURN_NODE;
CypherTransaction.Result result = runQuery(statement, map("query", value));
@@ -368,7 +373,7 @@ public class RestAPICypherImpl implements RestAPI {
@Override
public RestIndexManager index() {
- return restAPI.index();
+ return restIndex;
}
@@ -423,7 +428,7 @@ public class RestAPICypherImpl implements RestAPI {
}
public CypherResult query(String statement, Map params) {
- return new CypherTxResult(runQuery(statement, params));
+ return new CypherTxResult(runQuery(statement, params,true));
}
private List runQueries(Collection statements) {
@@ -438,11 +443,14 @@ public class RestAPICypherImpl implements RestAPI {
}
}
- private CypherTransaction.Result runQuery(String statement, Map params) {
+ private CypherTransaction.Result runQuery(String statement, Map params, boolean replace) {
if (!txManager.isActive()) {
- return newCypherTransaction().commit(statement, params);
+ return newCypherTransaction().commit(statement, params, replace);
}
- return txManager.getCypherTransaction().send(statement, params);
+ return txManager.getCypherTransaction().send(statement, params, replace);
+ }
+ private CypherTransaction.Result runQuery(String statement, Map params) {
+ return runQuery(statement,params,false);
}
public CypherTransaction newCypherTransaction() {
@@ -450,8 +458,53 @@ public class RestAPICypherImpl implements RestAPI {
}
public QueryResult