Package lupos.engine.operators.multiinput.join

Examples of lupos.engine.operators.multiinput.join.MergeJoinWithoutSorting


        collationOrder2 = this.fill(collationOrder2, i2);
        final CollationOrder co1 = getCollationOrder(collationOrder1);
        final CollationOrder co2 = getCollationOrder(collationOrder2);
        index1.setCollationOrder(co1);
        index2.setCollationOrder(co2);
        final Join join = new MergeJoinWithoutSorting();
        join.setIntersectionVariables(hsv);
        join.setUnionVariables(new HashSet<Variable>());
        join.getUnionVariables().addAll(index1.getUnionVariables());
        join.getUnionVariables().addAll(index2.getUnionVariables());
        index1.setSucceedingOperator(new OperatorIDTuple(join, 0));
        index2.setSucceedingOperator(new OperatorIDTuple(join, 1));
        ic.addSucceedingOperator(new OperatorIDTuple(index1, 0));
        ic.addSucceedingOperator(new OperatorIDTuple(index2, 0));
        remainingJoins.add(join);
      } else {
        int[] collationOrder1 = { -1, -1, -1 };
        int i1 = 0;
        for (int i = 0; i < 3; i++) {
          if (!index1.getTriplePattern().iterator().next().getPos(i)
              .isVariable()) {
            collationOrder1[i1] = i;
            i1++;
          }
        }
        for (final Variable v : index1.unionVariables) {
          collationOrder1[i1] = index1.getTriplePattern().iterator()
              .next().getPos(v);
          i1++;
        }
        collationOrder1 = this.fill(collationOrder1, i1);
        final CollationOrder co1 = getCollationOrder(collationOrder1);
        index1.setCollationOrder(co1);
        ic.addSucceedingOperator(new OperatorIDTuple(index1, 0));
        remainingJoins.add(index1);
      }
    }
    while (remainingJoins.size() > 1) {
      // choose best combination
      final Collection<BasicOperator> co = this.getNextJoin(remainingJoins);
      final Iterator<BasicOperator> io = co.iterator();
      final BasicOperator first = io.next();
      final BasicOperator second = io.next();
      final Join join = new Join();
      join.setIntersectionVariables(new HashSet<Variable>());
      join.setUnionVariables(new HashSet<Variable>());
      join.getUnionVariables().addAll(first.getUnionVariables());
      join.getUnionVariables().addAll(second.getUnionVariables());
      first.setSucceedingOperator(new OperatorIDTuple(join, 0));
      second.setSucceedingOperator(new OperatorIDTuple(join, 1));
      remainingJoins.remove(first);
      remainingJoins.remove(second);
      remainingJoins.add(join);
View Full Code Here


  protected BasicOperator generateJoin(final InnerNodePlan inp, final Root root, final BasicOperator left, final BasicOperator right, final Collection<Variable> sortCriterium, final Map<TriplePattern, Map<Variable, VarBucket>> selectivity){
    Join join;
    Operator last;
    if (this.RDF3XSORT) {
      if (sortCriterium.size() == 0 || equalCriterium(sortCriterium, inp.getOrder())) {
        join = new MergeJoinWithoutSorting();
        join.setEstimatedCardinality(inp.getCardinality());
        last = join;
      } else {
        join = new MergeJoinWithoutSorting();
        join.setEstimatedCardinality(inp.getCardinality());
        if (!sortCriterium.equals(inp.getJoinPartner())) {
          // insert necessary sort operator
          last = FastSort.createInstance(root, inp.getTriplePatterns(), sortCriterium);
          join.setEstimatedCardinality(inp.getCardinality());
          last.setPrecedingOperator(join);
          join.setSucceedingOperator(new OperatorIDTuple(last, 0));
          this.moveToLeft(inp.getTriplePatterns(), root);
        } else {
          last = join;
        }
      }
      if (left instanceof RDF3XIndexScan) {
        ((RDF3XIndexScan) left).setCollationOrder(inp.getJoinPartner());
      }
      if (right instanceof RDF3XIndexScan) {
        ((RDF3XIndexScan) right).setCollationOrder(inp.getJoinPartner());
      }
    } else {
      if (inp.getJoinType() == JoinType.MERGEJOIN) {
        if (this.NARYMERGEJOIN) {
          throw new UnsupportedOperationException("Deprecated");
          // combine existing n-ary merge joins with the one which will be newly created
//          int number;
//          if (left instanceof NAryMergeJoinWithoutSorting) {
//            number = ((NAryMergeJoinWithoutSorting) left).getNumberOfOperands();
//          } else {
//            number = 1;
//          }
//          if (right instanceof NAryMergeJoinWithoutSorting) {
//            number += ((NAryMergeJoinWithoutSorting) right).getNumberOfOperands();
//          } else {
//            number += 1;
//          }
//          // determine minima and maxima...
//          Bindings min = Bindings.createNewInstance();
//          for (final Variable v : inp.getJoinPartner()) {
//            if (inp.getSelectivity() == null) {
//              min = null;
//              break;
//            }
//            final VarBucket vb = inp.getSelectivity().get(v);
//            if (vb == null) {
//              min = null;
//              break;
//            }
//            min.add(v, vb.minimum);
//          }
//          Bindings max = Bindings.createNewInstance();
//          for (final Variable v : inp.getJoinPartner()) {
//            if (inp.getSelectivity() == null) {
//              max = null;
//              break;
//            }
//            final VarBucket vb = inp.getSelectivity().get(v);
//            if (vb == null) {
//              max = null;
//              break;
//            }
//            max.add(v, vb.maximum);
//          }
//          join = new NAryMergeJoinWithoutSorting(number, min, max);
//          final BasicOperator[] bos = new BasicOperator[number];
//
//          int index2 = 0;
//          if (left instanceof NAryMergeJoinWithoutSorting) {
//            for (final BasicOperator bo : left
//                .getPrecedingOperators()) {
//              bos[index2++] = bo;
//              join.addPrecedingOperator(bo);
//            }
//          } else {
//            bos[index2++] = left;
//            join.addPrecedingOperator(left);
//          }
//          if (right instanceof NAryMergeJoinWithoutSorting) {
//            for (final BasicOperator bo : right
//                .getPrecedingOperators()) {
//              bos[index2++] = bo;
//              join.addPrecedingOperator(bo);
//            }
//          } else {
//            bos[index2++] = right;
//            join.addPrecedingOperator(right);
//          }
//          if (min != null){
//            Arrays.sort(bos, new Comparator<Object>() {
//              @Override
//              public int compare(final Object o1, final Object o2) {
//                final double sel1 = selectivity.get(
//                    ((BasicIndexScan) o1).getTriplePattern().iterator().next()).values().iterator().next().getSumDistinctLiterals();
//                final double sel2 = selectivity.get(
//                    ((BasicIndexScan) o2).getTriplePattern().iterator().next()).values().iterator().next().getSumDistinctLiterals();
//                if (sel1 < sel2){
//                  return -1;
//                } else if (sel2 < sel1){
//                  return 1;
//                } else {
//                  return 0;
//                }
//              }
//            });
//          }
//          for (int i = 0; i < bos.length; i++) {
//            bos[i].setSucceedingOperator(new OperatorIDTuple(join, i));
//          }
        } else {
          join = new MergeJoinWithoutSorting();
        }
        join.setEstimatedCardinality(inp.getCardinality());
        last = join;
        if (left instanceof RDF3XIndexScan) {
          ((RDF3XIndexScan) left).setCollationOrder(inp.getJoinPartner());
View Full Code Here

  }

  private static Collection<? extends Join> initOperators() {
    final List<Join> joiner = new ArrayList<Join>();
    for (int i = 0; i < DEFAULT_NUMBER_THREADS; i++) {
      joiner.add(new MergeJoinWithoutSorting());
    }
    return joiner;
  }
View Full Code Here

                for (final BasicOperator bo : llbo) {
                  operatorMustReceiveSortedData(root, bo,
                      basicOperator
                      .getIntersectionVariables());
                }
                final BasicOperator newOperator = new MergeJoinWithoutSorting();
                newOperator.cloneFrom(basicOperator);
                basicOperator.replaceWith(newOperator);
                return newOperator;
              } else {
                // do not insert SIP operator in cycles!
                if(!(basicOperator.getCycleOperands()!=null && basicOperator.getCycleOperands().size()>0)){
                  // insert SIP operator for joins other than
                  // MergeJoinWithoutSorting!
                  int min = -1;
                  int minIndex = -1;
                  int i = 0;
                  for (final BasicOperator bo : basicOperator
                      .getPrecedingOperators()) {
                    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;
                    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++;
                  }
                  final BasicOperator bo = join.getPrecedingOperators().get(minIndex);
                  if (bo != null
                      && bo instanceof FastSort
                      && bo.getPrecedingOperators().size() == 1
                      && !(bo.getPrecedingOperators().get(0) instanceof SIPFilterOperator)) {
                    if (!this.severalTimesQueryResults(bo,
                        new HashSet<BasicOperator>())) {
                      List<TriplePattern> tpsOfOthers = null;
                      for (final BasicOperator others : join
                          .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(join, tpsOfOthers);
                      final SIPFilterOperator sip_op =
                        // (replacements
                        // .get(Join.class) ==
                        // HashMapIndexJoin.class) ?
                        new SIPFilterOperatorIterator(
                            tpsOfOthers,
                            join.getIntersectionVariables())
                      // : new
                      // SIPFilterOperator(tpsOfOthers,join
                      // .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);
                      if (bo instanceof FastSort) {
                        final BasicOperator bo2 = bo
                        .getPrecedingOperators()
                        .get(0);
                        sip_op.addSucceedingOperators(bo2
                            .getSucceedingOperators());
                        sip_op.setPrecedingOperator(bo2);
                        bo2
                        .setSucceedingOperator(new OperatorIDTuple(
                            sip_op, 0));
                        bo.removePrecedingOperator(bo2);
                        bo.addPrecedingOperator(sip_op);
                      } else {
                        sip_op.addSucceedingOperators(bo.getSucceedingOperators());
                        sip_op.setPrecedingOperator(bo);
                        bo.setSucceedingOperator(new OperatorIDTuple(sip_op, 0));
                        join.removePrecedingOperator(bo);
                        join.addPrecedingOperator(sip_op);
                      }
                    }
                  }
                }
              }
            } else if (basicOperator instanceof Sort) {
              BasicOperator sortlimit = basicOperator;
              if (basicOperator.getPrecedingOperators().size() == 1) {
                final BasicOperator prec = basicOperator
                .getPrecedingOperators().get(0);
                if (prec instanceof SortLimit) {
                  sortlimit = prec;
                }
              }
              final Collection<Variable> sortCriterium = ((Sort) basicOperator)
              .getSortCriterium();
              boolean flag;
              if (sortCriterium != null
                  && (LiteralFactory.getMapType() != LiteralFactory.MapType.LAZYLITERAL)
                  && (LiteralFactory.getMapType() != LiteralFactory.MapType.LAZYLITERALWITHOUTINITIALPREFIXCODEMAP)) {
                flag = true;
                for (final BasicOperator bo : sortlimit
                    .getPrecedingOperators()) {
                  flag = flag
                  && operatorCanReceiveSortedData(bo,
                      sortCriterium);
                }
              } else {
                flag = false;
              }
              if (flag) {
                final LinkedList<BasicOperator> llbo = new LinkedList<BasicOperator>();
                llbo.addAll(sortlimit.getPrecedingOperators());
                for (final BasicOperator bo : llbo) {
                  bo.removeSucceedingOperator(sortlimit);
                  bo.addSucceedingOperators(basicOperator
                      .getSucceedingOperators());
                  for (final OperatorIDTuple oID : basicOperator
                      .getSucceedingOperators()) {
                    oID.getOperator().removePrecedingOperator(
                        basicOperator);
                    oID.getOperator().addPrecedingOperator(bo);
                  }
                  operatorMustReceiveSortedData(root, bo,
                      sortCriterium);
                }
                return null;
              }
            }
          }
        } catch(final CyclesDuringDeterminationofTriplePatternsException e){
        }

        final Class<? extends BasicOperator> newClass = replacements
        .get(basicOperator.getClass());
        BasicOperator newOperator = basicOperator;
        if (newClass != null) {
          try {
            newOperator = newClass.newInstance();
          } catch (final Exception ex) {
            ex.printStackTrace();
            System.err.println(ex);
          }
          newOperator.cloneFrom(basicOperator);
          basicOperator.replaceWith(newOperator);
          if (basicOperator.getClass() == Join.class
              && newOperator instanceof MergeJoinWithoutSortingSeveralIterations) {
            // Insert necessary sort operators here...
            final LinkedList<BasicOperator> llbo = new LinkedList<BasicOperator>();
            llbo.addAll(newOperator.getPrecedingOperators());
            for (final BasicOperator bo : llbo) {
              final List<Variable> sortCriterium = new LinkedList<Variable>();
              sortCriterium.addAll(basicOperator
                  .getIntersectionVariables());
              if (!(root instanceof PatternMatcher)
                  && !(root instanceof Stream)
                  && operatorCanReceiveSortedData(
                      bo,
                      basicOperator
                      .getIntersectionVariables())) {
                operatorMustReceiveSortedData(root, bo,
                    basicOperator
                    .getIntersectionVariables());
              } else {
                final ImmediateSort immediateSort = new ImmediateSort(
                    sortCriterium);
                final List<Variable> vars = new LinkedList<Variable>();
                vars.addAll(basicOperator
                    .getIntersectionVariables());
                immediateSort.setUnionVariables(vars);
                immediateSort.setIntersectionVariables(vars);
                immediateSort.addPrecedingOperator(bo);
                immediateSort
                .addSucceedingOperator(new OperatorIDTuple(
                    newOperator, bo
                    .getOperatorIDTuple(
                        newOperator)
                        .getId()));
                bo.getOperatorIDTuple(newOperator).setOperator(
                    immediateSort);
                newOperator.removePrecedingOperator(bo);
              }
            }
          }
        }
        return newOperator;
      }

      private void tpsOfSucceedingJoins(final BasicOperator bo,
          List<TriplePattern> tpsOfOthers) throws CyclesDuringDeterminationofTriplePatternsException {
        if (bo.getSucceedingOperators().size() == 1) {
          final BasicOperator sbo = bo.getSucceedingOperators()
          .get(0).getOperator();
          if (sbo instanceof Join) {
            if (sbo.getPrecedingOperators().size() == 2) {
              for (final BasicOperator op : sbo
                  .getPrecedingOperators()) {
                if (!op.equals(bo)) {
                  if (tpsOfOthers == null) {
                    tpsOfOthers = determineTriplePatterns(
                        op,
                        new LinkedList<TriplePattern>(),
                        new HashSet<BasicOperator>());
                  } else {
                    tpsOfOthers
                    .addAll(determineTriplePatterns(
                        op,
                        new LinkedList<TriplePattern>(),
                        new HashSet<BasicOperator>()));
                  }
                }
              }
            }
            this.tpsOfSucceedingJoins(sbo, tpsOfOthers);
          }
        }
      }

      private boolean severalTimesQueryResults(
          final BasicOperator basicOperator,
          final Set<BasicOperator> alreadyVisited) {
        if (alreadyVisited.contains(basicOperator)) {
          // loop detected!
          return true;
        }
        alreadyVisited.add(basicOperator);
        if (basicOperator instanceof Union) {
          if (!(basicOperator instanceof MergeUnion)) {
            return true;
          }
        } else if (basicOperator instanceof BasicIndexScan) {
          return false;
        } else {
          if (basicOperator.getPrecedingOperators() != null) {
            for (final BasicOperator predecessor : basicOperator
                .getPrecedingOperators()) {
              if (this.severalTimesQueryResults(predecessor,
                  alreadyVisited)) {
                return true;
              }
            }
          }
        }
        return false;
      }
    };
    final BasicOperator newRoot = (BasicOperator) op.visit(sogv);

    // now replace any merge joins and merge optionals with maybe their
    // parallel versions...

    final SimpleOperatorGraphVisitor sogvMergeJoinsAndOptionals = new SimpleOperatorGraphVisitor() {
      @Override
      public Object visit(final BasicOperator basicOperator) {
        final Class<? extends BasicOperator> newClass = replacementsMergeJoinAndMergeOptional
        .get(basicOperator.getClass());
        BasicOperator newOperator = basicOperator;
        if (newClass != null) {
          try {
            newOperator = newClass.newInstance();
          } catch (final Exception ex) {
            ex.printStackTrace();
            System.err.println(ex);
          }
          newOperator.cloneFrom(basicOperator);
          basicOperator.replaceWith(newOperator);
        }
        return newOperator;
      }
    };
View Full Code Here

TOP

Related Classes of lupos.engine.operators.multiinput.join.MergeJoinWithoutSorting

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.