Package lupos.engine.operators.tripleoperator

Examples of lupos.engine.operators.tripleoperator.TriplePattern


                    final List<TriplePattern> listTps = determineTriplePatterns(
                        basicOperator,
                        new LinkedList<TriplePattern>(),
                        new HashSet<BasicOperator>());
                    if (listTps.size() > 0) {
                      final TriplePattern tp = listTps.get(0);
                      int current = 0;
                      for (final OperatorIDTuple oid : root
                          .getSucceedingOperators()) {
                        if (oid.getOperator() instanceof BasicIndexScan) {
                          if (((BasicIndexScan) oid.getOperator())
                              .getTriplePattern()
                              .contains(tp)) {
                            if (min == -1 || min > current) {
                              min = current;
                              minIndex = i;
                            }
                          }
                        }
                        current++;
                      }
                    }
                    i++;
                  }
                  if (minIndex > -1) {
                    final BasicOperator bo = basicOperator.getPrecedingOperators().get(minIndex);
                    if (bo != null && bo.getSucceedingOperators().size()==1) {
                      if (!this.severalTimesQueryResults(bo, new HashSet<BasicOperator>())) {
                        List<TriplePattern> tpsOfOthers = null;
                        for (final BasicOperator others : basicOperator
                            .getPrecedingOperators()) {
                          if (!others.equals(bo)) {
                            if (tpsOfOthers == null) {
                              tpsOfOthers = determineTriplePatterns(
                                  others,
                                  new LinkedList<TriplePattern>(),
                                  new HashSet<BasicOperator>());
                            } else {
                              tpsOfOthers
                              .addAll(determineTriplePatterns(
                                  others,
                                  new LinkedList<TriplePattern>(),
                                  new HashSet<BasicOperator>()));
                            }
                          }
                        }
                        this.tpsOfSucceedingJoins(basicOperator, tpsOfOthers);
                        if (tpsOfOthers != null) {
                          final SIPFilterOperator sip_op = (replacements
                              .get(Join.class) == HashMapIndexJoin.class) ? new SIPFilterOperatorIterator(
                                  tpsOfOthers,
                                  basicOperator
                                  .getIntersectionVariables())

                          : new SIPFilterOperator(tpsOfOthers, basicOperator.getIntersectionVariables());

                          final List<Variable> intersectionVariables = new LinkedList<Variable>();
                          final List<Variable> unionVariables = new LinkedList<Variable>();
                          intersectionVariables.addAll(bo.getIntersectionVariables());
                          unionVariables.addAll(bo.getUnionVariables());
                          sip_op.setIntersectionVariables(intersectionVariables);
                          sip_op.setUnionVariables(unionVariables);
                          sip_op.addSucceedingOperators(bo.getSucceedingOperators());
                          sip_op.setPrecedingOperator(bo);
                          bo.setSucceedingOperator(new OperatorIDTuple(sip_op, 0));
                          basicOperator.removePrecedingOperator(bo);
                          basicOperator.addPrecedingOperator(sip_op);
                        }
                      }
                    }
                  }
                }
              }
            } else if (basicOperator.getClass() == Optional.class) {
              // root.deleteParents();
              // root.setParents();
              // root.detectCycles();
              // root.sendMessage(new BoundVariablesMessage());

              // check if MergeWithoutSortingOptional can be used
              boolean flag = true;
              if (basicOperator.getIntersectionVariables().size() > 0) {
                for (final BasicOperator bo : basicOperator
                    .getPrecedingOperators()) {
                  flag = flag
                  && operatorCanReceiveSortedData(
                      bo,
                      basicOperator
                      .getIntersectionVariables());
                }
              } else {
                flag = false;
              }
              if (flag) {
                final LinkedList<BasicOperator> llbo = new LinkedList<BasicOperator>();
                llbo.addAll(basicOperator.getPrecedingOperators());
                for (final BasicOperator bo : llbo) {
                  operatorMustReceiveSortedData(root, bo,
                      basicOperator.getIntersectionVariables());
                }
                final BasicOperator newOperator = new MergeWithoutSortingOptional();
                newOperator.cloneFrom(basicOperator);
                basicOperator.replaceWith(newOperator);
                return newOperator;
              }
            } else if (basicOperator instanceof FastSort) {
              if (basicOperator.getPrecedingOperators().size() == 1
                  && !(basicOperator.getPrecedingOperators().get(0) instanceof SIPFilterOperator)
                      && basicOperator.getSucceedingOperators().size() == 1) {
                if (basicOperator.getSucceedingOperators().get(0)
                    .getOperator() instanceof Join) {
                  final Join join = (Join) basicOperator
                  .getSucceedingOperators().get(0)
                  .getOperator();
                  int min = -1;
                  int minIndex = -1;
                  int i = 0;
                  for (final BasicOperator bo : join
                      .getPrecedingOperators()) {
                    final TriplePattern tp = determineTriplePatterns(
                        join,
                        new LinkedList<TriplePattern>(),
                        new HashSet<BasicOperator>())
                        .get(0);
                    int current = 0;
View Full Code Here


public class RuleOptimizeReplaceByPat extends Rule {

  @Override
  protected void init() {
    final TriplePattern pat = new TriplePattern();
    final ReplaceVar replaceVar = new ReplaceVar();

    pat.setSucceedingOperator(new OperatorIDTuple(replaceVar, 0));
    replaceVar.setPrecedingOperator(pat);

    subGraphMap = new HashMap<BasicOperator, String>();
    subGraphMap.put(pat, "pat");
    subGraphMap.put(replaceVar, "replaceVar");
View Full Code Here

    startNode = replaceVar;
  }

  @Override
  protected boolean checkPrecondition(final Map<String, BasicOperator> mso) {
    final TriplePattern pat = (TriplePattern) mso.get("pat");
    // Because of time aspects triplepattern should not have more than one
    // successor
    if (pat.getSucceedingOperators().size() != 1) {
      return false;
    }

    final ReplaceVar replaceVar = (ReplaceVar) mso.get("replaceVar");
    BasicOperator op = replaceVar.getSucceedingOperators().get(0)
        .getOperator();
    // Ignore ReplaceLit and get the Projection
    if (op instanceof ReplaceLit) {
      op = op.getSucceedingOperators().get(0).getOperator();
    }
    if (!(op instanceof Projection)) {
      System.err
          .println("Replace has not Projection as direct successor or after its ReplaceLit => Correct RuleOptimizeReplaceByPat!!!");
      return false;
    } else {
      final Projection proj = (Projection) op;
      final Object[] projVars = proj.getProjectedVariables().toArray();
      final Item[] patItems = pat.getItems();
      for (int i = 0; i < patItems.length; i++) {
        // Only if a variable in TriplePattern is not projected later
        // (TP creates temporary tuples)
        if (patItems[i].isVariable()) {
          if (!arrayContains(projVars, (Variable) patItems[i])) {
View Full Code Here

  public Tuple<Collection<BasicOperator>, Collection<BasicOperator>> transformOperatorGraph(
      final Map<String, BasicOperator> mso,
      final BasicOperator rootOperator) {
    final Collection<BasicOperator> deleted = new LinkedList<BasicOperator>();
    final Collection<BasicOperator> added = new LinkedList<BasicOperator>();
    final TriplePattern pat = (TriplePattern) mso.get("pat");
    final ReplaceVar replaceVar = (ReplaceVar) mso.get("replaceVar");

    BasicOperator op = replaceVar.getSucceedingOperators().get(0)
        .getOperator();
    if (op instanceof ReplaceLit) {
      op = op.getSucceedingOperators().get(0).getOperator();
    }
    final Projection proj = (Projection) op;

    final LinkedList<Variable> replaceVarLeft = replaceVar
        .getSubstitutionsVariableLeft();
    final LinkedList<Variable> replaceVarRight = replaceVar
        .getSubstitutionsVariableRight();
    final Object[] projVars = proj.getProjectedVariables().toArray();
    final Item[] patItems = pat.getItems();

    Variable var;
    Variable newTripleVar;

    // Before transformation: TriplePattern generates (p,lit) ,
    // ReplaceVar makes (y,lit) [because it has the tupel (y,p)] and
    // the Projection deletes (p,lit)
    // => Transformation replaces p by y in TriplePattern directly
    for (int i = 0; i < patItems.length; i++) {
      if (patItems[i].isVariable()) {
        var = (Variable) patItems[i];
        if (!arrayContains(projVars, var)) {
          final LinkedList<Integer> indices = getPositions(
              replaceVarRight, var);
          // Variable can be substituted by a ReplaceVar-variable
          if (indices.size() > 0) {
            newTripleVar = replaceVarLeft.get(indices.getFirst());
            // Replacement in TriplePattern
            pat.replace(var, newTripleVar);
            // Replacement same Replacement in ReplaceVar
            for (int a = 1; a < indices.size(); a++) {
              replaceVarRight.set(indices.get(a), newTripleVar);
            }
            // Delete the Tupel for Replacement
            replaceVar.removeSubstitutionVars(indices.getFirst());
          }
        }
      }
    }

    // Delete empty ReplaceVar
    if (replaceVar.getSubstitutionsVariableLeft().size() == 0) {
      final OperatorIDTuple succ = replaceVar.getSucceedingOperators()
          .get(0);
      pat.addSucceedingOperator(succ);
      pat.removeSucceedingOperator(replaceVar);
      succ.getOperator().removePrecedingOperator(replaceVar);
      succ.getOperator().addPrecedingOperator(pat);

      rootOperator.deleteParents();
      rootOperator.setParents();
View Full Code Here

   * @throws JSONException
   */
  public static Map<Variable, Tuple<Literal, Literal>> getMinMax(final String minMaxRequestSerializedAsJSONString, final Dataset dataset, final IOperatorCreator operatorCreator) throws JSONException {
    final JSONObject json = new JSONObject(minMaxRequestSerializedAsJSONString);
    final Collection<Variable> vars = Helper.createVariablesFromJSON(json);
    final TriplePattern tp = Helper.createTriplePatternFromJSON(json);
    final Collection<TriplePattern> tps = new LinkedList<TriplePattern>();
    tps.add(tp);
    final BasicIndexScan indexScan = operatorCreator.createIndexScan(operatorCreator.createRoot(dataset), tps);
    final BindingsFactory bindingsFactory = BindingsFactory.createBindingsFactory(tp.getVariables());
    indexScan.setBindingsFactory(bindingsFactory);
    tp.setBindingsFactory(bindingsFactory);

    return indexScan.getMinMax(tp, vars);
  }
View Full Code Here

                if (literal != null) {
                  itemArray[i] = literal;
                }
              }
            }
            newTriplePatterns.add(new TriplePattern(itemArray));
          }
          basicIndex.setTriplePatterns(newTriplePatterns);
        } else {
          // TODO Filter
          // node.clone(false)
View Full Code Here

    final List<OperatorIDTuple> pats = rootOperator
        .getSucceedingOperators();

    final LinkedList<OperatorIDTuple> possiblePats = new LinkedList<OperatorIDTuple>();
    // Find possible TriplePattern objects
    TriplePattern pat;
    for (int a = 0; a < pats.size(); a++) {
      if (pats.get(a).getOperator() instanceof TriplePattern) {
        pat = (TriplePattern) pats.get(a).getOperator();
        if (matchPossible(generate.getValueOrVariable(),
            pat.getItems(), doNotConnectInferenceRules)) {
          possiblePats.add(new OperatorIDTuple(pat, 0));
          pat.addPrecedingOperator(generate);
        }
      }
    }
    rootOperator.removePrecedingOperator(generate);
    // Set new successors of Generate object
View Full Code Here

public class RuleReplaceGenPat extends Rule {

  @Override
  protected void init() {
    final Generate generate = new Generate();
    final TriplePattern pat = new TriplePattern();

    generate.setSucceedingOperator(new OperatorIDTuple(pat, -1));

    pat.setPrecedingOperator(generate);

    subGraphMap = new HashMap<BasicOperator, String>();
    subGraphMap.put(generate, "generate");
    subGraphMap.put(pat, "pat");
View Full Code Here

      final Map<String, BasicOperator> mso,
      final BasicOperator rootOperator) {
    final Collection<BasicOperator> deleted = new LinkedList<BasicOperator>();
    final Collection<BasicOperator> added = new LinkedList<BasicOperator>();
    final Generate generate = (Generate) mso.get("generate");
    final TriplePattern pat = (TriplePattern) mso.get("pat");
    final Item[] patItems = pat.getItems();
    final Item[] generateItems = generate.getValueOrVariable();

    // System.out.println(generate.toString() + "---" + pat.toString());

    Filter filter = null;
    final ReplaceVar replaceVar = new ReplaceVar();
    replaceVar.setIntersectionVariables(new HashSet<Variable>());
    replaceVar.setUnionVariables(replaceVar.getIntersectionVariables());

    final LinkedList<Variable> addBindingsVar = new LinkedList<Variable>();
    final LinkedList<Literal> addBindingsLit = new LinkedList<Literal>();

    String filterConstraint = "Filter( ";
    for (int i = 0; i < 3; i++) {
      final Item patItem = patItems[i];
      final Item generateItem = generateItems[i];
      if ((!patItem.isVariable()) && generateItem.isVariable()) {
        filterConstraint += generateItems[i].toString() + " = "
            + patItems[i].toString() + " && ";
      } else if (patItem.isVariable() && generateItem.isVariable()) {
        replaceVar.addSubstitution((Variable) patItem,
            (Variable) generateItem);
        replaceVar.getIntersectionVariables().add((Variable) patItem);
      } else if (patItem.isVariable() && (!generateItem.isVariable())) {
        addBindingsVar.add((Variable) patItem);
        addBindingsLit.add((Literal) generateItem);
      } else if (!patItem.isVariable() && !generateItem.isVariable()
          && !generateItem.equals(patItem)) {
        // cannot match, remove generate.
        for (final BasicOperator parent : generate
            .getPrecedingOperators())
          parent.removeSucceedingOperator(generate);
        generate.getPrecedingOperators().clear();
        generate.removeFromOperatorGraph();
        return null;
      }
    }

    // If (?x = ?a) and (?x = ?b) then (valueOf(?a) = value(?b)) must be
    // fulfilled
    for (int i = 0; i < 2; i++) {
      for (int x = i + 1; x < 3; x++) {
        if (patItems[i].equals(patItems[x])) {
          filterConstraint += generateItems[i].toString() + " = "
              + generateItems[x].toString() + " && ";
        }
      }
    }

    if (!filterConstraint.equals("Filter( ")) {
      filterConstraint = filterConstraint.substring(0,
          filterConstraint.length() - 3)
          + ") ";

      try {
        final ASTFilterConstraint ASTfilter = (ASTFilterConstraint) SPARQL1_1Parser
            .parseFilter(filterConstraint);
        filter = new Filter(ASTfilter);
      } catch (final Exception e) {
        System.err
            .println("This should never happen in RuleReplaceGenPat!");
        System.err.println(e);
        e.printStackTrace();
      }
    }

    // Only Operators with a not empty definition are put into the
    // operatorgraph
    final LinkedList<BasicOperator> order = new LinkedList<BasicOperator>();
    if (filter != null) {
      order.add(filter);
      added.add(filter);
    }

    final int substVar = replaceVar.getSubstitutionsVariableLeft().size();

    if (substVar > 0) {
      order.add(replaceVar);
      added.add(replaceVar);
    } else {
      final Projection p = new Projection();
      p.setIntersectionVariables(new HashSet<Variable>());
      p.setUnionVariables(p.getUnionVariables());
      order.add(p);
      added.add(p);
    }
    if (addBindingsVar.size() > 0) {
      final Iterator<Literal> lit_it = addBindingsLit.iterator();
      final HashSet<Variable> hsv = new HashSet<Variable>();
      hsv.addAll(replaceVar.getUnionVariables());
      for (final Variable v : addBindingsVar) {
        final AddBinding ab = new AddBinding(v, lit_it.next());
        hsv.add(v);
        ab.setIntersectionVariables((HashSet<Variable>) hsv.clone());
        ab.setUnionVariables(ab.getIntersectionVariables());
        order.add(ab);
        added.add(ab);
      }
    }

    // In case that Generate or TriplePattern has minimum one variable, than
    // minimum one operator has to be inserted
    if (order.size() > 0) {
      final List<BasicOperator> pres = (List<BasicOperator>) generate
          .getPrecedingOperators();
      BasicOperator pre;
      for (int i = 0; i < pres.size(); i++) {
        pre = pres.get(i);
        pre.addSucceedingOperator(new OperatorIDTuple(order.getFirst(),
            0));
        if (filter != null) {
          Collection<Variable> vars = filter
              .getIntersectionVariables();
          if (vars == null)
            vars = new HashSet<Variable>();
          vars.addAll(pre.getIntersectionVariables());
          filter.setIntersectionVariables(vars);
          filter.setUnionVariables(vars);
        }
        pre.removeSucceedingOperator(generate);
        order.getFirst().addPrecedingOperator(pre);
      }

      for (int i = 0; i < order.size() - 1; i++) {
        order.get(i + 1).setPrecedingOperator(order.get(i));
        order.get(i).setSucceedingOperator(
            new OperatorIDTuple(order.get(i + 1), 0));
      }

      final LinkedList<OperatorIDTuple> succs = (LinkedList<OperatorIDTuple>) pat
          .getSucceedingOperators();
      for (int i = 0; i < succs.size(); i++) {
        succs.get(i).getOperator()
            .addPrecedingOperator(order.getLast());
      }

      final LinkedList<OperatorIDTuple> sops = new LinkedList<OperatorIDTuple>();
      sops.addAll(pat.getSucceedingOperators());
      order.getLast().setSucceedingOperators(sops);
    } else {
      final LinkedList<BasicOperator> pres = (LinkedList<BasicOperator>) generate
          .getPrecedingOperators();
      final LinkedList<OperatorIDTuple> succs = (LinkedList<OperatorIDTuple>) pat
          .getSucceedingOperators();
      BasicOperator pre;
      BasicOperator succ;
      for (int i = 0; i < pres.size(); i++) {
        pre = pres.get(i);
        pre.removeSucceedingOperator(generate);
        for (int x = 0; x < succs.size(); x++) {
          pre.addSucceedingOperator(succs.get(x));
          succ = succs.get(x).getOperator();
          succ.removePrecedingOperator(pat);
          succ.addPrecedingOperator(pre);
        }
      }
    }

    // TriplePattern can have more predecessors then Generate..
    pat.removePrecedingOperator(generate);
    if (pat.getPrecedingOperators().size() == 0)
      deleted.add(pat);
    // System.out.println(pat.getPrecedingOperators());
    deleted.add(generate);

    rootOperator.deleteParents();
View Full Code Here

          items[index] = ((current / bitValue) % 2 == 0)? KEY.dummyVariable : item;
          bitValue*=2;
        }
        index++;
      }
      return new KeyTriplePattern(new TriplePattern(items));
    }
View Full Code Here

TOP

Related Classes of lupos.engine.operators.tripleoperator.TriplePattern

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.