/** * @param var the variable that this predicate is testing against */ ComparatorPredicate(VarPattern var) { this.value = Optional.empty(); this.var = Optional.of(var.admin()); }
/** * Add a datatype to a resource type var * @param var var to be modified * @param type type from which metadata extracted * @return var with appropriate datatype */ private static VarPattern datatype(VarPattern var, AttributeType type) { AttributeType.DataType dataType = type.dataType(); if (dataType != null) { return var.datatype(dataType); } else { return var; } } }
@Override public UnaryOperator<VarPattern> visitPropHas(GraqlParser.PropHasContext ctx) { Label type = visitLabel(ctx.label()); VarPattern relation = Optional.ofNullable(ctx.relation).map(this::getVariable).orElseGet(Graql::var); VarPattern resource = Optional.ofNullable(ctx.resource).map(this::getVariable).orElseGet(Graql::var); if (ctx.predicate() != null) { resource = resource.val(visitPredicate(ctx.predicate())); } VarPattern finalResource = resource; return var -> var.has(type, finalResource, relation); }
/** * construct a $varName (rolemap) isa $typeVariable relation * @param varName variable name * @param relationPlayers collection of rolePlayer-roleType mappings * @return corresponding {@link VarPatternAdmin} */ private VarPattern relationPattern(Var varName, Collection<RelationPlayer> relationPlayers) { VarPattern var = varName; for (RelationPlayer rp : relationPlayers) { VarPatternAdmin rolePattern = rp.getRole().orElse(null); var = rolePattern != null? var.rel(rolePattern, rp.getRolePlayer()) : var.rel(rp.getRolePlayer()); } return var.admin(); }
@Override public RelationshipAtom rewriteWithRelationVariable(){ VarPattern newVar = Graql.var().asUserDefined(); VarPattern relVar = getPattern().admin().getProperty(IsaProperty.class) .map(prop -> newVar.isa(prop.type())) .orElse(newVar); for (RelationPlayer c: getRelationPlayers()) { VarPatternAdmin roleType = c.getRole().orElse(null); if (roleType != null) { relVar = relVar.rel(roleType, c.getRolePlayer()); } else { relVar = relVar.rel(c.getRolePlayer()); } } return create(relVar.admin(), this.getPredicateVariable(), this.getTypeId(), this.getPossibleTypes(), this.getParentQuery()); }
VarPattern rolePlayer = rp.getRolePlayer(); if (rolePattern != null){ Var roleVar = rolePattern.admin().var(); relVar = relVar.rel(rolePattern, rolePlayer); else relVar = relVar.rel(rolePlayer); relVar.isaExplicit(typeVariable.asUserDefined()) : relVar.isa(typeVariable.asUserDefined()); return RelationshipAtom.create(relVar.admin(), typeVariable, predicateId, parent);
/** * @throws GraqlQueryException if no label is specified on {@code resourceType} */ public static HasAttributeTypeProperty of(VarPatternAdmin resourceType, boolean required) { Label resourceLabel = resourceType.getTypeLabel().orElseThrow(() -> GraqlQueryException.noLabelSpecifiedForHas(resourceType) ); VarPattern role = Graql.label(Schema.MetaSchema.ROLE.getLabel()); VarPatternAdmin ownerRole = var().sub(role).admin(); VarPatternAdmin valueRole = var().sub(role).admin(); VarPattern relationType = var().sub(Graql.label(Schema.MetaSchema.RELATIONSHIP.getLabel())); // If a key, limit only to the implicit key type if(required){ ownerRole = ownerRole.label(KEY_OWNER.getLabel(resourceLabel)).admin(); valueRole = valueRole.label(KEY_VALUE.getLabel(resourceLabel)).admin(); relationType = relationType.label(KEY.getLabel(resourceLabel)); } VarPatternAdmin relationOwner = relationType.relates(ownerRole).admin(); VarPatternAdmin relationValue = relationType.admin().var().relates(valueRole).admin(); return new AutoValue_HasAttributeTypeProperty( resourceType, ownerRole, valueRole, relationOwner, relationValue, required); }
Var varName = rp.getRolePlayer().var(); Role role = Iterables.getOnlyElement(entry.getValue()); VarPatternAdmin rolePattern = Graql.var().label(role.label()).admin(); inferredRelationPlayers.add(RelationPlayer.of(rolePattern, varName.admin())); allocatedRelationPlayers.add(rp); rolePattern.var().label(metaRole.label()).admin() : Graql.var().label(metaRole.label()).admin(); inferredRelationPlayers.add(RelationPlayer.of(rolePattern, varName.admin())); }); VarPatternAdmin newPattern = (isDirect()? relationPattern.isaExplicit(getPredicateVariable()) : relationPattern.isa(getPredicateVariable()) ).admin(); return create(newPattern, this.getPredicateVariable(), this.getTypeId(), this.getPossibleTypes(), this.getParentQuery());
public Pattern pattern(Relationship concept) { VarPattern relationPattern = Graql.var(); Set<Pattern> idPatterns = new HashSet<>(); for (Map.Entry<Role, Set<Thing>> entry : concept.rolePlayersMap().entrySet()) { for (Thing var : entry.getValue()) { Var rolePlayer = Graql.var(); relationPattern = relationPattern.rel(Graql.label(entry.getKey().label()), rolePlayer); idPatterns.add(rolePlayer.asUserDefined().id(var.id())); } } relationPattern = relationPattern.isa(Graql.label(concept.type().label())); Pattern pattern = relationPattern; for (Pattern idPattern : idPatterns) { pattern = pattern.and(idPattern); } return pattern; } }
/** * Add the roleplayers of a {@link Relationship} to the relationship var * @param var var representing the relationship * @param relationship {@link Relationship} that contains roleplayer data * @return var pattern with roleplayers */ private static VarPattern roleplayers(VarPattern var, Relationship relationship){ for(Map.Entry<Role, Set<Thing>> entry: relationship.rolePlayersMap().entrySet()){ Role role = entry.getKey(); for (Thing thing : entry.getValue()) { var = var.rel(Graql.label(role.label()), thing.id().getValue()); } } return var; }
@Override public UnaryOperator<VarPattern> visitRelates(GraqlParser.RelatesContext ctx) { VarPattern superRole = ctx.superRole != null ? visitVariable(ctx.superRole) : null; return var -> var.relates(visitVariable(ctx.role), superRole); }
@Override public UnaryOperator<VarPattern> visitPropResource(GraqlParser.PropResourceContext ctx) { return var -> var.has(visitVariable(ctx.variable())); }
@Override public UnaryOperator<VarPattern> visitPropValue(GraqlParser.PropValueContext ctx) { return var -> var.val(visitPredicate(ctx.predicate())); }
@Override public UnaryOperator<VarPattern> visitPlays(GraqlParser.PlaysContext ctx) { return var -> var.plays(visitVariable(ctx.variable())); }
@Override public UnaryOperator<VarPattern> visitSub(GraqlParser.SubContext ctx) { return var -> var.sub(visitVariable(ctx.variable())); }
@Override public UnaryOperator<VarPattern> visitPropId(GraqlParser.PropIdContext ctx) { return var -> var.id(visitId(ctx.id())); }
/** * Add is-abstract annotation to a var * @param var var to be marked * @param type type from which metadata extracted */ private static VarPattern isAbstract(VarPattern var, Type type) { return type.isAbstract() ? var.isAbstract() : var; }
@Override public RelationshipAtom toRelationshipAtom(){ SchemaConcept type = getSchemaConcept(); if (type == null) throw GraqlQueryException.illegalAtomConversion(this, RelationshipAtom.class); GraknTx tx = getParentQuery().tx(); Label typeLabel = Schema.ImplicitType.HAS.getLabel(type.label()); return RelationshipAtom.create( Graql.var() .rel(Schema.ImplicitType.HAS_OWNER.getLabel(type.label()).getValue(), getVarName()) .rel(Schema.ImplicitType.HAS_VALUE.getLabel(type.label()).getValue(), getPredicateVariable()) .isa(typeLabel.getValue()) .admin(), getPredicateVariable(), tx.getSchemaConcept(typeLabel).id(), getParentQuery() ); }
/** * if any {@link Role} variable of the parent is user defined rewrite ALL {@link Role} variables to user defined (otherwise unification is problematic) * @param parentAtom parent atom that triggers rewrite * @return new relation atom with user defined {@link Role} variables if necessary or this */ private RelationshipAtom rewriteWithVariableRoles(Atom parentAtom){ if (!parentAtom.requiresRoleExpansion()) return this; VarPattern relVar = getPattern().admin().getProperty(IsaProperty.class) .map(prop -> getVarName().isa(prop.type())).orElse(getVarName()); for (RelationPlayer rp: getRelationPlayers()) { VarPatternAdmin rolePattern = rp.getRole().orElse(null); if (rolePattern != null) { Var roleVar = rolePattern.var(); Label roleLabel = rolePattern.getTypeLabel().orElse(null); relVar = relVar.rel(roleVar.asUserDefined().label(roleLabel), rp.getRolePlayer()); } else { relVar = relVar.rel(rp.getRolePlayer()); } } return create(relVar.admin(), this.getPredicateVariable(), this.getTypeId(), this.getPossibleTypes(), this.getParentQuery()); }