@Override public <T> void setProperty(final PropertyKey<T> key, final T value) throws FrameworkException { // check for read-only properties // if (StructrApp.getConfiguration().isReadOnlyProperty(type, key) || // (StructrApp.getConfiguration().isWriteOnceProperty(type, key) && (dbRelationship != null) && // dbRelationship.hasProperty(key.name()))) { if (key.isReadOnly() || (key.isWriteOnce() && (dbRelationship != null) && dbRelationship.hasProperty(key.dbName()))) { if (readOnlyPropertiesUnlocked || securityContext.isSuperUser()) { // permit write operation once and // lock read-only properties again readOnlyPropertiesUnlocked = false; } else { throw new FrameworkException(getClass().getSimpleName(), new ReadOnlyPropertyToken(key)); } } key.setProperty(securityContext, this, value); }
@Test public void testAddProperty() { String key3 = "key3"; Node node1 = getGraphDb().getNodeById(node1Id); Node node2 = getGraphDb().getNodeById(node2Id); Relationship rel = node1.getSingleRelationship(MyRelTypes.TEST, Direction.BOTH); // add new property node2.setProperty(key3, int1); rel.setProperty(key3, int2); assertTrue(node1.hasProperty(key1)); assertTrue(node2.hasProperty(key1)); assertTrue(node1.hasProperty(key2)); assertTrue(node2.hasProperty(key2)); assertTrue(node1.hasProperty(arrayKey)); assertTrue(node2.hasProperty(arrayKey)); assertTrue(rel.hasProperty(arrayKey)); assertTrue(!node1.hasProperty(key3)); assertTrue(node2.hasProperty(key3)); assertEquals(int1, node1.getProperty(key1)); assertEquals(int2, node2.getProperty(key1)); assertEquals(string1, node1.getProperty(key2)); assertEquals(string2, node2.getProperty(key2)); assertEquals(int1, rel.getProperty(key1)); assertEquals(string1, rel.getProperty(key2)); assertEquals(int2, rel.getProperty(key3)); }
@Test public void testRelMultiRemoveProperty() { Node node1 = getGraphDb().createNode(); Node node2 = getGraphDb().createNode(); Relationship rel = node1.createRelationshipTo(node2, MyRelTypes.TEST); rel.setProperty("key0", "0"); rel.setProperty("key1", "1"); rel.setProperty("key2", "2"); rel.setProperty("key3", "3"); rel.setProperty("key4", "4"); newTransaction(); rel.removeProperty("key3"); rel.removeProperty("key2"); rel.removeProperty("key3"); newTransaction(); getNodeManager().clearCache(); assertEquals("0", rel.getProperty("key0")); assertEquals("1", rel.getProperty("key1")); assertEquals("4", rel.getProperty("key4")); assertTrue(!rel.hasProperty("key2")); assertTrue(!rel.hasProperty("key3")); rel.delete(); node1.delete(); node2.delete(); }
// ----- protected methods ----- protected boolean hasPropertyValue( Relationship rel, PropertyKey propertyKey, Object propertyValue) { if (rel != null && rel.hasProperty(propertyKey.dbName())) { Object value = rel.getProperty(propertyKey.dbName()); return value.equals(propertyValue); } return false; }
@Test public void testRelationshipAddProperty() { Node node1 = getGraphDb().createNode(); Node node2 = getGraphDb().createNode(); Relationship rel1 = node1.createRelationshipTo(node2, MyRelTypes.TEST); Relationship rel2 = node2.createRelationshipTo(node1, MyRelTypes.TEST); try { rel1.setProperty(null, null); fail("Null argument should result in exception."); } catch (IllegalArgumentException e) { } Integer int1 = new Integer(1); Integer int2 = new Integer(2); String string1 = new String("1"); String string2 = new String("2"); // add property rel1.setProperty(key1, int1); rel2.setProperty(key1, string1); rel1.setProperty(key2, string2); rel2.setProperty(key2, int2); assertTrue(rel1.hasProperty(key1)); assertTrue(rel2.hasProperty(key1)); assertTrue(rel1.hasProperty(key2)); assertTrue(rel2.hasProperty(key2)); assertTrue(!rel1.hasProperty(key3)); assertTrue(!rel2.hasProperty(key3)); assertEquals(int1, rel1.getProperty(key1)); assertEquals(string1, rel2.getProperty(key1)); assertEquals(string2, rel1.getProperty(key2)); assertEquals(int2, rel2.getProperty(key2)); getTransaction().failure(); }
@Test public void testRelGetProperties() { Integer int1 = new Integer(1); Integer int2 = new Integer(2); String string = new String("3"); Node node1 = getGraphDb().createNode(); Node node2 = getGraphDb().createNode(); Relationship rel1 = node1.createRelationshipTo(node2, MyRelTypes.TEST); try { rel1.getProperty(key1); fail("get non existing property din't throw exception"); } catch (NotFoundException e) { } try { rel1.getProperty(null); fail("get of null key din't throw exception"); } catch (IllegalArgumentException e) { } assertTrue(!rel1.hasProperty(key1)); assertTrue(!rel1.hasProperty(null)); rel1.setProperty(key1, int1); rel1.setProperty(key2, int2); rel1.setProperty(key3, string); assertTrue(rel1.hasProperty(key1)); assertTrue(rel1.hasProperty(key2)); assertTrue(rel1.hasProperty(key3)); try { rel1.removeProperty(key3); } catch (NotFoundException e) { fail("Remove of property failed."); } assertTrue(!rel1.hasProperty(key3)); assertTrue(!rel1.hasProperty(null)); rel1.delete(); node2.delete(); node1.delete(); }
/** Compare the specified source property of the two provided relationships. */ @Override public int compare(Relationship rel1, Relationship rel2) { Object v1 = null; Object v2 = null; if (rel1.hasProperty("source") == false || rel2.hasProperty("source") == false) { if (VERBOSE) { System.out.println("Ack!!! A relationship has no source!"); System.out.println( "rel1 source = " + rel1.getProperty("source") + "; rel2 source = " + rel2.getProperty("source")); } return 0; } IndexHits<Node> h1 = metadataNodeIndex.get("source", rel1.getProperty("source")); IndexHits<Node> h2 = metadataNodeIndex.get("source", rel2.getProperty("source")); if (h1.size() == 0 || h2.size() == 0) { if (VERBOSE) { System.out.println("Dorf!!! A relationship has no metaDataNode!"); System.out.println( "rel1 MDN = " + metadataNodeIndex.get("source", rel1.getProperty("source")) + "; rel2 MDN = " + metadataNodeIndex.get("source", rel1.getProperty("source"))); } return 0; } Node m1 = h1.next(); Node m2 = h2.next(); h1.close(); h2.close(); if (m1.hasProperty(property.propertyName)) { v1 = m1.getProperty(property.propertyName); } if (m2.hasProperty(property.propertyName)) { v2 = m2.getProperty(property.propertyName); } if (v1 == null && v2 == null) { return 0; } else if (v2 == NOTRANKED) { return -1; } else if (v1 == NOTRANKED) { return 1; } Integer rank1 = NOTRANKED; Integer rank2 = NOTRANKED; if (property.type == String.class) { if (priorityMapString.containsKey(v1)) { rank1 = priorityMapString.get(v1); } if (priorityMapString.containsKey(v2)) { rank2 = priorityMapString.get(v2); } } else if (property.type == Long.class || property.type == Integer.class) { if (priorityMapString.containsKey(v1)) { rank1 = priorityMapLong.get(v1); } if (priorityMapString.containsKey(v2)) { rank2 = priorityMapLong.get(v2); } } else if (property.type == Double.class) { if (priorityMapString.containsKey(v1)) { rank1 = priorityMapDouble.get(v1); } if (priorityMapString.containsKey(v2)) { rank2 = priorityMapDouble.get(v2); } } else { throw new java.lang.UnsupportedOperationException( "the source property datatype " + String.valueOf(property.type) + " is unrecognized"); } Integer retval = null; if (rank1 == NOTRANKED && rank2 == NOTRANKED) { retval = 0; if (VERBOSE) { System.out.println("Glarg!!! Both relationships are unranked"); } } else if (rank2 == NOTRANKED) { retval = -1; nRankableRelsCompared++; if (VERBOSE) { System.out.println( "rel 2 (relid " + rel2.getId() + "; source " + rel2.getProperty("source") + ") property " + v2 + " is not in priority list; preferring rel 1 (relid " + rel1.getId() + "; source " + rel1.getProperty("source") + ") property " + v1 + ")"); } } else if (rank1 == NOTRANKED) { retval = 1; nRankableRelsCompared++; if (VERBOSE) { System.out.println( "rel 1 (relid " + rel1.getId() + "; name " + rel1.getProperty("source") + ") property " + v1 + " is not in priority list; preferring rel 2 (relid " + rel2.getId() + "; source " + rel2.getProperty("source") + ") property " + v2 + ")"); } } else { retval = rank1.compareTo(rank2); nRankableRelsCompared += 2; if (VERBOSE) { System.out.println( "rel 1 (relid " + rel1.getId() + "; name " + rel1.getProperty("source") + ") property " + v1 + " || rel 2 (relid " + rel2.getId() + "; source " + rel2.getProperty("source") + ") property " + v2 + ")"); System.out.println("\t" + retval); } } // priority is indicated by proximity to the beginning of the list, so we sort in REVERSE! // return retval * -1; return retval; }