use of com.vaticle.typedb.core.graph.vertex.TypeVertex in project grakn by graknlabs.
the class EncodingTest method encoded_keys_are_correct.
@Test
public void encoded_keys_are_correct() {
try (CoreTransaction transaction = session.transaction(WRITE)) {
Storage.Data storage = transaction.traversal().graph().data().storage();
assertEquals(0, vertexElements(storage).size());
assertEquals(0, variableStartEdgeElements(storage).size());
assertEquals(0, fixedStartEdgeElements(storage).size());
assertEquals(0, optimisationEdgeElements(storage).size());
transaction.query().insert(TypeQL.parseQuery("insert " + "$p isa person, has name 'Alice';" + "$c isa company, has company-id 10;" + "(employer: $c, employee: $p) isa employment;").asInsert());
transaction.commit();
}
try (CoreTransaction transaction = session.transaction(WRITE)) {
GraphManager graph = transaction.traversal().graph();
Storage.Data storage = graph.data().storage();
List<KeyValue<RawKey, ByteArray>> vertexKVs = vertexElements(storage);
assertTrue(iterate(vertexKVs).allMatch(kv -> kv.value().isEmpty()));
List<ByteArray> vertices = iterate(vertexKVs).map(kv -> kv.key().bytes()).toList();
// we must have exactly the expected set of vertex bytes
assertEquals(7, vertices.size());
ByteArray personIID = expectedIID(graph, Label.of("person"), 0);
assertTrue(vertices.contains(personIID));
ByteArray companyIID = expectedIID(graph, Label.of("company"), 0);
assertTrue(vertices.contains(companyIID));
ByteArray employmentIID = expectedIID(graph, Label.of("employment"), 0);
assertTrue(vertices.contains(employmentIID));
ByteArray employeeRoleIID = expectedIID(graph, Label.of("employee", "employment"), 0);
assertTrue(vertices.contains(employeeRoleIID));
ByteArray employerRoleIID = expectedIID(graph, Label.of("employer", "employment"), 0);
assertTrue(vertices.contains(employerRoleIID));
ByteArray nameAliceIID = expectedAttributeIID(graph, Label.of("name"), "Alice");
assertTrue(vertices.contains(nameAliceIID));
ByteArray companyId10IID = expectedAttributeIID(graph, Label.of("company-id"), 10);
assertTrue(vertices.contains(companyId10IID));
// we must have exactly the right set of fixed length edges: relates, plays, and forward has
List<KeyValue<RawKey, ByteArray>> fixedKVs = fixedStartEdgeElements(storage);
assertTrue(iterate(fixedKVs).allMatch(kv -> kv.value().isEmpty()));
List<ByteArray> fixed = iterate(fixedKVs).map(kv -> kv.key().bytes()).toList();
assertEquals(10, fixed.size());
assertTrue(fixed.contains(join(personIID, HAS.forward().bytes(), nameAliceIID)));
assertTrue(fixed.contains(join(personIID, PLAYING.forward().bytes(), employeeRoleIID)));
assertTrue(fixed.contains(join(employeeRoleIID, PLAYING.backward().bytes(), personIID)));
assertTrue(fixed.contains(join(employeeRoleIID, RELATING.backward().bytes(), employmentIID)));
assertTrue(fixed.contains(join(employmentIID, RELATING.forward().bytes(), employeeRoleIID)));
assertTrue(fixed.contains(join(employmentIID, RELATING.forward().bytes(), employerRoleIID)));
assertTrue(fixed.contains(join(employerRoleIID, RELATING.backward().bytes(), employmentIID)));
assertTrue(fixed.contains(join(employerRoleIID, PLAYING.backward().bytes(), companyIID)));
assertTrue(fixed.contains(join(companyIID, PLAYING.forward().bytes(), employerRoleIID)));
assertTrue(fixed.contains(join(companyIID, HAS.forward().bytes(), companyId10IID)));
// we must have exactly the right set of variable length edges: backward has
List<KeyValue<RawKey, ByteArray>> variableKVs = variableStartEdgeElements(storage);
assertTrue(iterate(variableKVs).allMatch(kv -> kv.value().isEmpty()));
List<ByteArray> variable = iterate(variableKVs).map(kv -> kv.key().bytes()).toList();
assertEquals(2, variable.size());
assertTrue(variable.contains(join(nameAliceIID, HAS.backward().bytes(), personIID)));
assertTrue(variable.contains(join(companyId10IID, HAS.backward().bytes(), companyIID)));
// we must have exactly the right set of optimisation edges: role player
List<KeyValue<RawKey, ByteArray>> optimisationKVs = optimisationEdgeElements(storage);
assertTrue(iterate(optimisationKVs).allMatch(kv -> kv.value().isEmpty()));
List<ByteArray> optimisation = iterate(optimisationKVs).map(kv -> kv.key().bytes()).toList();
assertEquals(4, optimisation.size());
TypeVertex employerRoleType = graph.schema().getType(Label.of("employer", "employment"));
TypeVertex employeeRoleType = graph.schema().getType(Label.of("employee", "employment"));
assertTrue(optimisation.contains(join(personIID, ROLEPLAYER.backward().bytes(), employeeRoleType.iid().bytes(), employmentIID, employeeRoleIID.view(1 + employeeRoleType.iid().bytes().length()))));
assertTrue(optimisation.contains(join(employmentIID, ROLEPLAYER.forward().bytes(), employeeRoleType.iid().bytes(), personIID, employeeRoleIID.view(1 + employeeRoleType.iid().bytes().length()))));
assertTrue(optimisation.contains(join(companyIID, ROLEPLAYER.backward().bytes(), employerRoleType.iid().bytes(), employmentIID, employerRoleIID.view(1 + employerRoleType.iid().bytes().length()))));
assertTrue(optimisation.contains(join(employmentIID, ROLEPLAYER.forward().bytes(), employerRoleType.iid().bytes(), companyIID, employerRoleIID.view(1 + employerRoleType.iid().bytes().length()))));
}
}
use of com.vaticle.typedb.core.graph.vertex.TypeVertex in project grakn by graknlabs.
the class TypeGraph method getType.
public TypeVertex getType(String label, @Nullable String scope) {
assert storage.isOpen();
String scopedLabel = scopedLabel(label, scope);
try {
if (!isReadOnly) {
multiLabelLock.readLock().lock();
singleLabelLocks.computeIfAbsent(scopedLabel, x -> newReadWriteLock()).readLock().lock();
}
TypeVertex vertex = typesByLabel.get(scopedLabel);
if (vertex != null)
return vertex;
IndexIID.Type index = IndexIID.Type.Label.of(label, scope);
ByteArray iid = storage.get(index);
if (iid != null) {
vertex = typesByIID.computeIfAbsent(VertexIID.Type.of(iid), i -> new TypeVertexImpl.Persisted(this, i, label, scope));
typesByLabel.putIfAbsent(scopedLabel, vertex);
}
return vertex;
} finally {
if (!isReadOnly) {
singleLabelLocks.get(scopedLabel).readLock().unlock();
multiLabelLock.readLock().unlock();
}
}
}
use of com.vaticle.typedb.core.graph.vertex.TypeVertex in project grakn by graknlabs.
the class TypeGraph method create.
public TypeVertex create(Encoding.Vertex.Type encoding, String label, @Nullable String scope) {
assert storage.isOpen();
if (isReadOnly)
throw TypeDBException.of(TRANSACTION_SCHEMA_READ_VIOLATION);
String scopedLabel = scopedLabel(label, scope);
try {
// we intentionally use READ on multiLabelLock, as put() only concerns one label
multiLabelLock.readLock().lock();
singleLabelLocks.computeIfAbsent(scopedLabel, x -> newReadWriteLock()).writeLock().lock();
TypeVertex typeVertex = typesByLabel.computeIfAbsent(scopedLabel, i -> new TypeVertexImpl.Buffered(this, VertexIID.Type.generate(keyGenerator, encoding), label, scope));
typesByIID.put(typeVertex.iid(), typeVertex);
cache.clear();
return typeVertex;
} finally {
singleLabelLocks.get(scopedLabel).writeLock().unlock();
multiLabelLock.readLock().unlock();
rules().conclusions().outdated(true);
}
}
use of com.vaticle.typedb.core.graph.vertex.TypeVertex in project grakn by graknlabs.
the class ThingTypeImpl method ownsKey.
private void ownsKey(AttributeTypeImpl attributeType) {
validateIsNotDeleted();
TypeVertex attVertex = attributeType.vertex;
TypeEdge ownsEdge, ownsKeyEdge;
if (vertex.outs().edge(OWNS_KEY, attVertex) != null)
return;
if (!attributeType.isKeyable()) {
throw exception(TypeDBException.of(OWNS_KEY_VALUE_TYPE, attributeType.getLabel(), attributeType.getValueType().name()));
} else if (link(getSupertype().getOwns(attributeType.getValueType(), true), getSupertype().overriddenOwns(false, true)).anyMatch(a -> a.equals(attributeType))) {
throw exception(TypeDBException.of(OWNS_KEY_NOT_AVAILABLE, attributeType.getLabel()));
}
if ((ownsEdge = vertex.outs().edge(OWNS, attVertex)) != null) {
// TODO: These ownership and uniqueness checks should be parallelised to scale better
getInstances().forEachRemaining(thing -> {
FunctionalIterator<? extends Attribute> attrs = thing.getHas(attributeType);
if (!attrs.hasNext())
throw exception(TypeDBException.of(OWS_KEY_PRECONDITION_OWNERSHIP_KEY_TOO_MANY, vertex.label(), attVertex.label()));
Attribute attr = attrs.next();
if (attrs.hasNext())
throw exception(TypeDBException.of(OWS_KEY_PRECONDITION_OWNERSHIP_KEY_MISSING, vertex.label(), attVertex.label()));
else if (compareSize(attr.getOwners(this), 1) != 0) {
throw exception(TypeDBException.of(OWNS_KEY_PRECONDITION_UNIQUENESS, attVertex.label(), vertex.label()));
}
});
ownsEdge.delete();
} else if (getInstances().first().isPresent()) {
throw exception(TypeDBException.of(OWNS_KEY_PRECONDITION_NO_INSTANCES, vertex.label(), attVertex.label()));
}
ownsKeyEdge = vertex.outs().put(OWNS_KEY, attVertex);
if (getSupertype().declaredOwns(false).findFirst(attributeType).isPresent())
ownsKeyEdge.overridden(attVertex);
}
use of com.vaticle.typedb.core.graph.vertex.TypeVertex in project grakn by graknlabs.
the class ThingTypeImpl method getOwnsOverridden.
@Override
public AttributeType getOwnsOverridden(AttributeType attributeType) {
TypeVertex attrVertex = graphMgr.schema().getType(attributeType.getLabel());
if (attrVertex != null) {
TypeEdge ownsEdge = vertex.outs().edge(OWNS_KEY, attrVertex);
if (ownsEdge != null && ownsEdge.overridden().isPresent()) {
return AttributeTypeImpl.of(graphMgr, ownsEdge.overridden().get());
}
ownsEdge = vertex.outs().edge(OWNS, attrVertex);
if (ownsEdge != null && ownsEdge.overridden().isPresent()) {
return AttributeTypeImpl.of(graphMgr, ownsEdge.overridden().get());
}
}
return null;
}
Aggregations