From 7ba363b2bf12af492eadf9c34cf712b998aa02cd Mon Sep 17 00:00:00 2001 From: Marvin Froeder Date: Mon, 9 Nov 2015 18:59:41 +1300 Subject: [PATCH] My failed attemp to fix supportsRemoveVertices() --- .../gremlin/orientdb/ODBFeatures.java | 4 -- .../gremlin/orientdb/OrientEdge.java | 23 +++++--- .../gremlin/orientdb/OrientVertex.java | 1 + .../orientdb/RemovedOIdentifiable.java | 59 +++++++++++++++++++ 4 files changed, 75 insertions(+), 12 deletions(-) create mode 100755 driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/RemovedOIdentifiable.java diff --git a/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/ODBFeatures.java b/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/ODBFeatures.java index 7e7c83c6..c23fcf9f 100644 --- a/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/ODBFeatures.java +++ b/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/ODBFeatures.java @@ -86,10 +86,6 @@ public static class OrientVertexFeatures extends OrientElementFeatures implement private OrientVertexFeatures() { } - public boolean supportsRemoveVertices() { - return false; - } - @Override public boolean supportsMultiProperties() { return false; diff --git a/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientEdge.java b/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientEdge.java index f9d6afb8..39d4f794 100644 --- a/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientEdge.java +++ b/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientEdge.java @@ -3,6 +3,7 @@ import com.orientechnologies.orient.core.db.record.OIdentifiable; import com.orientechnologies.orient.core.db.record.ORecordElement; import com.orientechnologies.orient.core.db.record.ridbag.ORidBag; +import com.orientechnologies.orient.core.id.ORID; import com.orientechnologies.orient.core.record.impl.ODocument; import org.apache.tinkerpop.gremlin.structure.Direction; @@ -92,19 +93,25 @@ else if (direction.equals(Direction.IN)) public void remove() { ODocument doc = getRawDocument(); - if (doc.getInternalStatus() == ORecordElement.STATUS.NOT_LOADED) { + if (doc.getInternalStatus() == ORecordElement.STATUS.NOT_LOADED) doc.load(); - } - removeLink(Direction.IN); - removeLink(Direction.OUT); - doc.getDatabase().delete(doc.getIdentity()); + removeLink(Direction.IN, vIn); + removeLink(Direction.OUT, vOut); + ORID id = id(); + doc.getDatabase().delete(id); + rawElement = new RemovedOIdentifiable(id); } @SuppressWarnings("unchecked") - private void removeLink( Direction direction) { + private void removeLink( Direction direction, OIdentifiable rawVertex ) { final String fieldName = OrientVertex.getConnectionFieldName(direction, this.label()); - ODocument doc = this.getVertex(direction).getRawDocument(); + ODocument doc; + if (rawVertex instanceof ODocument) { + doc = (ODocument) rawVertex; + } else { + doc = this.getVertex(direction).getRawDocument(); + } Object found = doc.field(fieldName); if(found instanceof ORidBag) { ORidBag bag = (ORidBag)found; @@ -113,7 +120,7 @@ private void removeLink( Direction direction) { } else if (found instanceof Collection) { ((Collection) found).remove(this.getRawElement()); - if(((Collection) found).size() == 0) doc.removeField(fieldName); + if(((Collection) found).isEmpty()) doc.removeField(fieldName); } else throw new IllegalStateException("Relationship content is invalid on field " + fieldName + ". Found: " + found); doc.save(); diff --git a/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientVertex.java b/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientVertex.java index a17581c7..e1cc3c8c 100644 --- a/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientVertex.java +++ b/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientVertex.java @@ -216,6 +216,7 @@ public void remove() { } doc.getDatabase().delete(doc.getIdentity()); + rawElement = new RemovedOIdentifiable(id()); } diff --git a/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/RemovedOIdentifiable.java b/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/RemovedOIdentifiable.java new file mode 100755 index 00000000..29f7544d --- /dev/null +++ b/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/RemovedOIdentifiable.java @@ -0,0 +1,59 @@ +package org.apache.tinkerpop.gremlin.orientdb; + +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Element; + +import com.orientechnologies.orient.core.db.record.OIdentifiable; +import com.orientechnologies.orient.core.id.ORID; +import com.orientechnologies.orient.core.record.ORecord; +import com.orientechnologies.orient.core.storage.OStorage.LOCKING_STRATEGY; + +public final class RemovedOIdentifiable implements OIdentifiable { + + private final ORID id; + + public RemovedOIdentifiable(ORID id) { + this.id = id; + } + + @Override + public int compareTo(OIdentifiable o) { + throw Element.Exceptions.elementAlreadyRemoved(Edge.class, id); + } + + @Override + public int compare(OIdentifiable o1, OIdentifiable o2) { + throw Element.Exceptions.elementAlreadyRemoved(Edge.class, id); + } + + @Override + public ORID getIdentity() { + throw Element.Exceptions.elementAlreadyRemoved(Edge.class, id); + } + + @Override + public T getRecord() { + throw Element.Exceptions.elementAlreadyRemoved(Edge.class, id); + } + + @Override + public void lock(boolean iExclusive) { + throw Element.Exceptions.elementAlreadyRemoved(Edge.class, id); + } + + @Override + public boolean isLocked() { + throw Element.Exceptions.elementAlreadyRemoved(Edge.class, id); + } + + @Override + public LOCKING_STRATEGY lockingStrategy() { + throw Element.Exceptions.elementAlreadyRemoved(Edge.class, id); + } + + @Override + public void unlock() { + throw Element.Exceptions.elementAlreadyRemoved(Edge.class, id); + } + +}