use of com.vaticle.typedb.core.pattern.constraint.type.LabelConstraint in project grakn by graknlabs.
the class TypeVariable method label.
public LabelConstraint label(Label label) {
LabelConstraint labelConstraint = new LabelConstraint(this, label);
constrain(labelConstraint);
return labelConstraint;
}
use of com.vaticle.typedb.core.pattern.constraint.type.LabelConstraint in project grakn by graknlabs.
the class Definer method definePlays.
private void definePlays(ThingType thingType, Set<PlaysConstraint> playsConstraints) {
try (ThreadTrace ignored = traceOnThread(TRACE_PREFIX + "define_plays")) {
playsConstraints.forEach(plays -> {
define(plays.relation().get());
LabelConstraint roleTypeLabel = plays.role().label().get();
RoleType roleType = getRoleType(roleTypeLabel).asRoleType();
if (plays.overridden().isPresent()) {
String overriddenLabelName = plays.overridden().get().label().get().properLabel().name();
Optional<? extends RoleType> overriddenType = roleType.getSupertypes().filter(rt -> rt.getLabel().name().equals(overriddenLabelName)).first();
if (overriddenType.isPresent()) {
thingType.setPlays(roleType, overriddenType.get());
} else {
throw TypeDBException.of(OVERRIDDEN_NOT_SUPERTYPE, roleTypeLabel.scopedLabel(), overriddenLabelName);
}
} else {
thingType.setPlays(roleType);
}
});
}
}
use of com.vaticle.typedb.core.pattern.constraint.type.LabelConstraint in project grakn by graknlabs.
the class Definer method define.
private ThingType define(TypeVariable variable) {
try (ThreadTrace ignored = traceOnThread(TRACE_PREFIX + "define")) {
assert variable.label().isPresent();
LabelConstraint labelConstraint = variable.label().get();
if (labelConstraint.scope().isPresent() && variable.constraints().size() > 1) {
throw TypeDBException.of(ROLE_DEFINED_OUTSIDE_OF_RELATION, labelConstraint.scopedLabel());
} else if (!variable.is().isEmpty()) {
throw TypeDBException.of(TYPE_CONSTRAINT_UNACCEPTED, IS);
} else if (// do nothing
labelConstraint.scope().isPresent())
// do nothing
return null;
else if (defined.contains(variable))
return conceptMgr.getThingType(labelConstraint.scopedLabel());
ThingType type = getThingType(labelConstraint);
if (variable.sub().isPresent()) {
type = defineSub(type, variable.sub().get(), variable);
} else if (variable.valueType().isPresent()) {
// && variable.sub().size() == 0
String valueType = variable.valueType().get().valueType().name();
throw TypeDBException.of(ATTRIBUTE_VALUE_TYPE_MODIFIED, valueType, labelConstraint.label());
} else if (type == null) {
throw TypeDBException.of(TYPE_NOT_FOUND, labelConstraint.label());
}
if (variable.valueType().isPresent() && !(type.isAttributeType())) {
throw TypeDBException.of(ATTRIBUTE_VALUE_TYPE_DEFINED_NOT_ON_ATTRIBUTE_TYPE, labelConstraint.label());
}
defined.add(variable);
if (variable.abstractConstraint().isPresent())
defineAbstract(type);
if (variable.regex().isPresent())
defineRegex(type.asAttributeType().asString(), variable.regex().get());
if (!variable.relates().isEmpty())
defineRelates(type.asRelationType(), variable.relates());
if (!variable.owns().isEmpty())
defineOwns(type, variable.owns());
if (!variable.plays().isEmpty())
definePlays(type, variable.plays());
return type;
}
}
use of com.vaticle.typedb.core.pattern.constraint.type.LabelConstraint in project grakn by graknlabs.
the class Definer method defineSub.
private ThingType defineSub(ThingType thingType, SubConstraint subConstraint, TypeVariable var) {
try (ThreadTrace ignored = traceOnThread(TRACE_PREFIX + "define_sub")) {
LabelConstraint labelConstraint = var.label().get();
ThingType supertype = define(subConstraint.type()).asThingType();
if (supertype.isEntityType()) {
if (thingType == null)
thingType = conceptMgr.putEntityType(labelConstraint.label());
thingType.asEntityType().setSupertype(supertype.asEntityType());
} else if (supertype.isRelationType()) {
if (thingType == null)
thingType = conceptMgr.putRelationType(labelConstraint.label());
thingType.asRelationType().setSupertype(supertype.asRelationType());
} else if (supertype.isAttributeType()) {
ValueType valueType;
if (var.valueType().isPresent())
valueType = ValueType.of(var.valueType().get().valueType());
else if (!supertype.isRoot())
valueType = supertype.asAttributeType().getValueType();
else
throw TypeDBException.of(ATTRIBUTE_VALUE_TYPE_MISSING, labelConstraint.label());
if (thingType == null)
thingType = conceptMgr.putAttributeType(labelConstraint.label(), valueType);
thingType.asAttributeType().setSupertype(supertype.asAttributeType());
} else {
throw TypeDBException.of(INVALID_DEFINE_SUB, labelConstraint.scopedLabel(), supertype.getLabel());
}
return thingType;
}
}
use of com.vaticle.typedb.core.pattern.constraint.type.LabelConstraint in project grakn by graknlabs.
the class Undefiner method undefine.
private void undefine(TypeVariable variable) {
try (ThreadTrace ignored = traceOnThread(TRACE_PREFIX + "undefine")) {
assert variable.label().isPresent();
LabelConstraint labelConstraint = variable.label().get();
if (labelConstraint.scope().isPresent() && variable.constraints().size() > 1) {
throw TypeDBException.of(ROLE_DEFINED_OUTSIDE_OF_RELATION, labelConstraint.scopedLabel());
} else if (!variable.is().isEmpty()) {
throw TypeDBException.of(TYPE_CONSTRAINT_UNACCEPTED, IS);
} else if (// do nothing
labelConstraint.scope().isPresent())
// do nothing
return;
else // do nothing
if (undefined.contains(variable))
return;
ThingType type = getThingType(labelConstraint);
if (!variable.plays().isEmpty())
undefinePlays(type, variable.plays());
if (!variable.owns().isEmpty())
undefineOwns(type, variable.owns());
if (!variable.relates().isEmpty())
undefineRelates(type.asRelationType(), variable.relates());
if (variable.regex().isPresent())
undefineRegex(type.asAttributeType().asString(), variable.regex().get());
if (variable.abstractConstraint().isPresent())
undefineAbstract(type);
if (variable.sub().isPresent())
undefineSub(type, variable.sub().get());
else if (variable.valueType().isPresent()) {
throw TypeDBException.of(ATTRIBUTE_VALUE_TYPE_UNDEFINED, variable.valueType().get().valueType().name(), variable.label().get().label());
}
undefined.add(variable);
}
}
Aggregations