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

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

package com.weaverplatform.sp4rql.model.restriction;

import com.weaverplatform.sp4rql.error.ParseException;
import com.weaverplatform.sp4rql.model.scope.Sp4rqlScope;
import com.weaverplatform.sp4rql.model.token.Sp4rqlToken;
import com.weaverplatform.sp4rql.model.token.VariableToken;
import com.weaverplatform.util.IndentStringBuilder;

import java.util.ArrayList;
import java.util.HashSet;

public class ValuesRestriction implements Sp4rqlRestriction {

  private ArrayList variables = new ArrayList<>();
  private ArrayList> valueColumns = new ArrayList<>();
  private int columnPointer = 0;
  private String alias;
  private Sp4rqlScope scope;

  @Override
  public void setAlias(String alias) {
    this.alias = alias;
  }

  @Override
  public String getAlias() {
    return alias;
  }

  @Override
  public void setInScope(Sp4rqlScope scope) {
    this.scope = scope;
  }

  @Override
  public Sp4rqlScope inScope() {
    return scope;
  }

  public void addVariable(VariableToken token) {
    if(valueColumns.isEmpty() || !valueColumns.get(0).isEmpty()) {
      new ParseException("Can not add variable to a ValuesRestriction after adding values");
    }
    variables.add(token);
    valueColumns.add(new ArrayList<>());
  }

  public void addValue(Sp4rqlToken value) {
    if(valueColumns.isEmpty()) {
      throw new ParseException("Can not add value when there is no variable defined");
    }
    valueColumns.get(columnPointer).add(value);
    columnPointer = (columnPointer + 1) % valueColumns.size();
  }

  public void addRow() {
    if(columnPointer != 0) {
      throw new ParseException(String.format("Can not add new row, the current row has %d values but should have %d", columnPointer, variables.size()));
    }
  }

  @Override
  public HashSet getExposedVariables() {
    HashSet tokens = new HashSet<>();
    tokens.addAll(variables);
    return tokens;
  }

  public ArrayList getValues(VariableToken binding) {
    int index = variables.indexOf(binding);
    return valueColumns.get(index);
  }

  public void buildString(IndentStringBuilder builder) {
    builder.append("VALUES ( ");
    builder.appendJoin(" ", variables.iterator());
    builder.append(" ) { ");
    for(int i = 0; i < valueColumns.get(0).size(); i++) {
      builder.append("( ");
      for(int j = 0; j < variables.size(); j++) {
        Sp4rqlToken token = valueColumns.get(j).get(i);
        token.buildString(builder);
        builder.append(" ");
      }
      builder.append(") ");
    }
    builder.append("}");
    builder.append(" # ");
    builder.append(getAlias());
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy