From 712468ee70e8d9f990fba639dd16ed4390364501 Mon Sep 17 00:00:00 2001 From: Mike Bryant Date: Fri, 25 Oct 2013 10:45:59 +0100 Subject: [PATCH] Quick hack to prevent metadata being zapped on item update. TODO: permenant fix --- .../project/core/impl/BasicGraphManager.java | 9 ++++-- .../core/impl/SingleIndexGraphManager.java | 9 ++++-- .../ehri/project/core/GraphManagerTest.java | 28 +++++++++++++++++++ 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/ehri-frames/src/main/java/eu/ehri/project/core/impl/BasicGraphManager.java b/ehri-frames/src/main/java/eu/ehri/project/core/impl/BasicGraphManager.java index e658f4472..693633e1b 100644 --- a/ehri-frames/src/main/java/eu/ehri/project/core/impl/BasicGraphManager.java +++ b/ehri-frames/src/main/java/eu/ehri/project/core/impl/BasicGraphManager.java @@ -27,6 +27,7 @@ public final class BasicGraphManager implements GraphManager { private static final String INDEX_NAME = "entities"; + private static final String METADATA_PREFIX = "_"; private final FramedGraph graph; @@ -250,9 +251,11 @@ private void replaceProperties(Index index, T item, // remove 'old' properties for (String key : item.getPropertyKeys()) { Object value = item.getProperty(key); - item.removeProperty(key); - if (keys == null || keys.contains(key)) { - index.remove(key, value, item); + if (!key.startsWith(METADATA_PREFIX)) { + item.removeProperty(key); + if (keys == null || keys.contains(key)) { + index.remove(key, value, item); + } } } diff --git a/ehri-frames/src/main/java/eu/ehri/project/core/impl/SingleIndexGraphManager.java b/ehri-frames/src/main/java/eu/ehri/project/core/impl/SingleIndexGraphManager.java index 15cbe8db6..99afb951d 100644 --- a/ehri-frames/src/main/java/eu/ehri/project/core/impl/SingleIndexGraphManager.java +++ b/ehri-frames/src/main/java/eu/ehri/project/core/impl/SingleIndexGraphManager.java @@ -34,6 +34,7 @@ public final class SingleIndexGraphManager implements GraphManager { private static final String INDEX_NAME = "entities"; + private static final String METADATA_PREFIX = "_"; private final FramedGraph graph; @@ -256,9 +257,11 @@ private void replaceProperties(Index index, T item, // remove 'old' properties for (String key : item.getPropertyKeys()) { Object value = item.getProperty(key); - item.removeProperty(key); - if (keys == null || keys.contains(key)) { - index.remove(key, value, item); + if (!key.startsWith(METADATA_PREFIX)) { + item.removeProperty(key); + if (keys == null || keys.contains(key)) { + index.remove(key, value, item); + } } } diff --git a/ehri-frames/src/test/java/eu/ehri/project/core/GraphManagerTest.java b/ehri-frames/src/test/java/eu/ehri/project/core/GraphManagerTest.java index 207e771ae..baaf1bd85 100644 --- a/ehri-frames/src/test/java/eu/ehri/project/core/GraphManagerTest.java +++ b/ehri-frames/src/test/java/eu/ehri/project/core/GraphManagerTest.java @@ -154,6 +154,34 @@ public void testUpdateVertex() throws Exception { assertEquals(null, vertex.getProperty(TEST_KEY)); } + @Test + public void testUpdateVertexWithMetadata() throws Exception { + @SuppressWarnings("serial") + Map data = new HashMap() { + { + put(TEST_KEY, TEST_VALUE); + } + }; + + Vertex vertex = manager.createVertex(TEST_ID1, TEST_TYPE, data); + + String testMetaKey = "_metakey"; + String testMetaValue = "test-value"; + vertex.setProperty(testMetaKey, testMetaValue); + + String NEW_TEST_KEY = "newTestKey"; + String NEW_TEST_VALUE = "newTestValue"; + + // change a value of existing key + data.put(TEST_KEY, NEW_TEST_VALUE); + manager.updateVertex(TEST_ID1, TEST_TYPE, data); + vertex = manager.getVertex(TEST_ID1); + assertEquals(NEW_TEST_VALUE, vertex.getProperty(TEST_KEY)); + + // Check the metadata remains unharmed + assertEquals(testMetaValue, vertex.getProperty(testMetaKey)); + } + // TODO copy and change the other tests @SuppressWarnings("serial")