All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.weaverplatform.sp4rql.model.restriction.QuadPathRestriction Maven / Gradle / Ivy

package com.weaverplatform.sp4rql.model.restriction;

import com.weaverplatform.sp4rql.error.ParseException;
import com.weaverplatform.sp4rql.model.restriction.path.PathNode;
import com.weaverplatform.sp4rql.model.restriction.path.PathRecord;
import com.weaverplatform.sp4rql.model.token.NullToken;
import com.weaverplatform.sp4rql.model.token.ReferenceToken;
import com.weaverplatform.sp4rql.model.token.Sp4rqlToken;
import com.weaverplatform.sp4rql.model.token.VariableToken;
import com.weaverplatform.util.IndentStringBuilder;

import java.util.HashSet;
import java.util.Iterator;

public class QuadPathRestriction extends QuadRestriction {

  HashSet pathStart = new HashSet<>();
  HashSet pathEnd = new HashSet<>();

  public QuadPathRestriction(Sp4rqlToken statement, Sp4rqlToken subject, Sp4rqlToken object) {
    super(new NullToken(), subject, null, object);
  }

  public QuadPathRestriction(QuadRestriction unfinishedQuad) {
    super(new NullToken(), unfinishedQuad.getSubject(), null, unfinishedQuad.getObject());
  }

  public void setObject(Sp4rqlToken object) {
    this.object = object;
  }

  public void addPathStart(PathNode node) {
    node.start();
    this.pathStart.add(node);
  }

  public HashSet getPathStart() {
    return pathStart;
  }

  public void addPathEnd(PathNode node) {
    node.end();
    this.pathEnd.add(node);
  }

  public HashSet getPathEnd() {
    return pathEnd;
  }

  public QuadPathRestriction clone() {
    QuadPathRestriction clone = new QuadPathRestriction(statement, subject, object);
    for(PathNode node : pathStart) {
      clone.addPathStart(node);
    }
    for(PathNode node : pathEnd) {
      clone.addPathEnd(node);
    }
    return clone;
  }

  public boolean isSingleTokenPath() {
    if(pathStart.isEmpty()) {
      throw new ParseException("There should be at least one token in the token path");
    }
    if(pathStart.size() > 1 || pathEnd.size() > 1) {
      return false;
    }
    PathNode start = pathStart.iterator().next();
    PathNode end = pathEnd.iterator().next();
    HashSet records = start.getNext();
    if(records.size() > 1) {
      return false;
    }
    PathRecord record = records.iterator().next();
    if(record.keys.size() != 1) {
      return false;
    }
    if(!record.to.equals(end)) {
      return false;
    }
    if(!end.getNext().isEmpty()) {
      return false;
    }
    return true;
  }

  public ReferenceToken getSingleToken() {
    if(!isSingleTokenPath()) {
      throw new ParseException("Do not call getSingleToken when restriction is not a singleTokenPath");
    }
    PathNode start = pathStart.iterator().next();
    HashSet records = start.getNext();
    return records.iterator().next().keys.iterator().next();
  }

  @Override
  public HashSet getExposedVariables() {
    HashSet tokens = new HashSet<>();
    if(subject instanceof VariableToken) {
      tokens.add((VariableToken) subject);
    }
    if(object instanceof VariableToken) {
      tokens.add((VariableToken) object);
    }
    return tokens;
  }

  public void buildString(IndentStringBuilder builder) {
    statement.buildString(builder);
    builder.append(" ");
    subject.buildString(builder);
    builder.append(" (path) ");
    object.buildString(builder);
    builder.appendLine(" .", 1);
    HashSet visited = new HashSet<>();
    Iterator iterator = getPathStart().iterator();
    while(iterator.hasNext()) {
      PathNode node = iterator.next();
      node.toString(builder, visited);
      if(iterator.hasNext()) {
        builder.newline();
      } else {
        builder.updateLevel(-1);
      }
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy