Package org.teiid.query.optimizer.relational.plantree

Examples of org.teiid.query.optimizer.relational.plantree.PlanNode


          }
            Set<GroupSymbol> groups = GroupsUsedByElementsVisitor.getGroups(aggregateSymbol);
            if (groups.isEmpty()) {
              continue;
            }
            PlanNode originatingNode = FrameUtil.findOriginatingNode(groupNode, groups);
            if (originatingNode == null) {
              if (aggs) {
                return null//should never happen
              }
              continue;
            }

            PlanNode parentAccess = NodeEditor.findParent(originatingNode, NodeConstants.Types.ACCESS, NodeConstants.Types.GROUP);

            if (parentAccess != null) {
                while (parentAccess.getType() == NodeConstants.Types.SELECT) {
                    parentAccess = parentAccess.getParent();
                }
                originatingNode = parentAccess;
            }

            if (originatingNode.getParent() == groupNode) {
View Full Code Here


       
        //create a new list to iterate over since the original will be modified
        for (PlanNode nullNode : new LinkedList<PlanNode>(nodes)) {
            while (nullNode.getParent() != null && nodes.contains(nullNode)) {
                // Attempt to raise the node
                PlanNode newRoot = raiseNullNode(plan, nodes, nullNode, metadata, capFinder);
                if(newRoot != null) {
                    plan = newRoot;
                } else {
                    break;
                }
View Full Code Here

     * @return null if the raising should not continue, else the newRoot
     */
    PlanNode raiseNullNode(PlanNode rootNode, List<PlanNode> nodes, PlanNode nullNode, QueryMetadataInterface metadata, CapabilitiesFinder capFinder)
    throws QueryPlannerException, QueryMetadataException, TeiidComponentException {
       
        PlanNode parentNode = nullNode.getParent();
       
        switch(parentNode.getType()) {
            case NodeConstants.Types.JOIN:
            {
                JoinType jt = (JoinType)parentNode.getProperty(NodeConstants.Info.JOIN_TYPE);
                if (jt == JoinType.JOIN_CROSS || jt == JoinType.JOIN_INNER) {
                    return raiseNullNode(rootNode, parentNode, nullNode, nodes);
                }
                //for outer joins if the null node is on the outer side, then the join itself is null
                //if the null node is on the inner side, then the join can be removed but the null values
                //coming from the inner side will need to be placed into the frame
                if (jt == JoinType.JOIN_LEFT_OUTER) {
                    if (nullNode == parentNode.getFirstChild()) {
                        return raiseNullNode(rootNode, parentNode, nullNode, nodes);
                    }
                    raiseNullThroughJoin(metadata, parentNode, parentNode.getLastChild());
                    return null;
                }
                if (jt == JoinType.JOIN_RIGHT_OUTER) {
                    if (nullNode == parentNode.getLastChild()) {
                        return raiseNullNode(rootNode, parentNode, nullNode, nodes);
                    }
                    raiseNullThroughJoin(metadata, parentNode, parentNode.getFirstChild());
                    return null;
                }  
                if (jt == JoinType.JOIN_FULL_OUTER) {
                    if (nullNode == parentNode.getLastChild()) {
                        raiseNullThroughJoin(metadata, parentNode, parentNode.getLastChild());
                    } else {
                        raiseNullThroughJoin(metadata, parentNode, parentNode.getFirstChild());
                    }
                    return null;
                }
                break;
            }           
            case NodeConstants.Types.SET_OP:
            {
                boolean isLeftChild = parentNode.getFirstChild() == nullNode;
                SetQuery.Operation operation = (SetQuery.Operation)parentNode.getProperty(NodeConstants.Info.SET_OPERATION);
                boolean raiseOverSetOp = (operation == SetQuery.Operation.INTERSECT || (operation == SetQuery.Operation.EXCEPT && isLeftChild));
               
                if (raiseOverSetOp) {
                    return raiseNullNode(rootNode, parentNode, nullNode, nodes);
                }
               
                boolean isAll = parentNode.hasBooleanProperty(NodeConstants.Info.USE_ALL);
               
                if (isLeftChild) {
                    PlanNode firstProject = NodeEditor.findNodePreOrder(parentNode, NodeConstants.Types.PROJECT);
                   
                    if (firstProject == null) { // will only happen if the other branch has only null nodes
                        return raiseNullNode(rootNode, parentNode, nullNode, nodes);
                    }

                    List<SingleElementSymbol> newProjectSymbols = (List<SingleElementSymbol>)firstProject.getProperty(NodeConstants.Info.PROJECT_COLS);
                    List<SingleElementSymbol> oldProjectSymbols = (List<SingleElementSymbol>)nullNode.getProperty(NodeConstants.Info.PROJECT_COLS);
                   
                    for (int i = 0; i < newProjectSymbols.size(); i++) {
                        SingleElementSymbol newSes = newProjectSymbols.get(i);
                        SingleElementSymbol oldSes = oldProjectSymbols.get(i);
                        if (newSes instanceof ExpressionSymbol || !newSes.getShortCanonicalName().equals(oldSes.getShortCanonicalName())) {
                            if (newSes instanceof AliasSymbol) {
                                newSes = ((AliasSymbol)newSes).getSymbol();
                            }
                            newProjectSymbols.set(i, new AliasSymbol(oldSes.getShortName(), newSes));
                        }
                    }
                   
                    PlanNode sort = NodeEditor.findParent(firstProject, NodeConstants.Types.SORT, NodeConstants.Types.SOURCE);
                   
                    if (sort != null) { //correct the sort to the new columns as well
                        OrderBy sortOrder = (OrderBy)sort.getProperty(NodeConstants.Info.SORT_ORDER);
                        for (OrderByItem item : sortOrder.getOrderByItems()) {
                            SingleElementSymbol sortElement = item.getSymbol();
                            sortElement = newProjectSymbols.get(oldProjectSymbols.indexOf(sortElement));
                            item.setSymbol(sortElement);
                        }
                    }
                   
                    PlanNode sourceNode = NodeEditor.findParent(parentNode, NodeConstants.Types.SOURCE);
                    if (sourceNode != null && NodeEditor.findNodePreOrder(sourceNode, NodeConstants.Types.PROJECT) == firstProject) {
                        SymbolMap symbolMap = (SymbolMap)sourceNode.getProperty(NodeConstants.Info.SYMBOL_MAP);
                        symbolMap = SymbolMap.createSymbolMap(symbolMap.getKeys(), newProjectSymbols);
                        sourceNode.setProperty(NodeConstants.Info.SYMBOL_MAP, symbolMap);
                    }                                       
                }
               
                NodeEditor.removeChildNode(parentNode, nullNode);

                PlanNode grandParent = parentNode.getParent();
               
                if (!isAll) { //ensure that the new child is distinct
                  PlanNode nestedSetOp = NodeEditor.findNodePreOrder(parentNode.getFirstChild(), NodeConstants.Types.SET_OP, NodeConstants.Types.SOURCE);
                  if (nestedSetOp != null) {
                    nestedSetOp.setProperty(NodeConstants.Info.USE_ALL, false);
                  } else if (NodeEditor.findNodePreOrder(parentNode.getFirstChild(), NodeConstants.Types.DUP_REMOVE, NodeConstants.Types.SOURCE) == null) {
                    parentNode.getFirstChild().addAsParent(NodeFactory.getNewNode(NodeConstants.Types.DUP_REMOVE));
                  }
                }
               
                if (grandParent == null) {
                    PlanNode newRoot = parentNode.getFirstChild();
                    parentNode.removeChild(newRoot);
                    return newRoot;
                }

                //remove the set op
                NodeEditor.removeChildNode(grandParent, parentNode);
               
                PlanNode sourceNode = NodeEditor.findParent(grandParent.getFirstChild(), NodeConstants.Types.SOURCE, NodeConstants.Types.SET_OP);
                               
                if (sourceNode != null) {
                    return RuleMergeVirtual.doMerge(sourceNode, rootNode, false, metadata);
                }
                return null;
            }
            case NodeConstants.Types.GROUP:
            {
                //if there are grouping columns, then we can raise
                if (parentNode.hasCollectionProperty(NodeConstants.Info.GROUP_COLS)) {
                    return raiseNullNode(rootNode, parentNode, nullNode, nodes);
                }
                break; //- the else case could be implemented, but it's a lot of work for little gain, since the null node can't raise higher
            }
      case NodeConstants.Types.PROJECT:
      {
        // check for project into
        PlanNode upperProject = NodeEditor.findParent(parentNode.getParent(), NodeConstants.Types.PROJECT)
       
        if (upperProject == null
            || upperProject.getProperty(NodeConstants.Info.INTO_GROUP) == null) {
                  return raiseNullNode(rootNode, parentNode, nullNode, nodes);
        }
        break;
      }
            default:
View Full Code Here

                                                         TeiidComponentException {
        Assertion.assertTrue(joinNode.getType() == NodeConstants.Types.JOIN);
        Assertion.assertTrue(nullNode.getType() == NodeConstants.Types.NULL);
        Assertion.assertTrue(nullNode.getParent() == joinNode);
       
        PlanNode frameStart = joinNode.getParent();
       
        NodeEditor.removeChildNode(joinNode, nullNode);
        NodeEditor.removeChildNode(joinNode.getParent(), joinNode);
       
        for (GroupSymbol group : nullNode.getGroups()) {
View Full Code Here

      HashSet<PlanNode> skipNodes = new HashSet<PlanNode>();
      for (PlanNode projectNode : projectNodes) {
        if (projectNode.getChildCount() == 0 || projectNode.getProperty(NodeConstants.Info.INTO_GROUP) != null) {
          continue;
        }
        PlanNode groupNode = NodeEditor.findNodePreOrder(projectNode, NodeConstants.Types.GROUP, NodeConstants.Types.SOURCE | NodeConstants.Types.JOIN);
        if (groupNode != null) {
          projectNode = groupNode;
        }
          Set<GroupSymbol> requiredForOptional = getRequiredGroupSymbols(projectNode.getFirstChild());
        boolean done = false;
View Full Code Here

          return null;
        }
        if (isOptional) {
          //prevent bridge table removal
      HashSet<GroupSymbol> joinGroups = new HashSet<GroupSymbol>();
        PlanNode parentNode = joinNode;
        while (parentNode.getType() != NodeConstants.Types.PROJECT) {
          PlanNode current = parentNode;
          parentNode = parentNode.getParent();
          if (current.getType() != NodeConstants.Types.SELECT && current.getType() != NodeConstants.Types.JOIN) {
            continue;
          }
          Set<GroupSymbol> currentGroups = current.getGroups();
        if (current.getType() == NodeConstants.Types.JOIN) {
          currentGroups = GroupsUsedByElementsVisitor.getGroups((List<Criteria>)current.getProperty(NodeConstants.Info.JOIN_CRITERIA));
        }
        if (!Collections.disjoint(currentGroups, optionalNode.getGroups()) && !optionalNode.getGroups().containsAll(currentGroups)) {
          //we're performing a join
          boolean wasEmpty = joinGroups.isEmpty();
          boolean modified = joinGroups.addAll(current.getGroups());
          if (!wasEmpty && modified) {
            return null;
          }
        }
        }
        }
        JoinType jt = (JoinType)joinNode.getProperty(NodeConstants.Info.JOIN_TYPE);
       
        if (!isOptional &&
            (jt != JoinType.JOIN_LEFT_OUTER || optionalNode != joinNode.getLastChild() || useNonDistinctRows(joinNode.getParent()))) {
          return null;
        }
      // remove the parent node and move the sibling node upward
    PlanNode parentNode = joinNode.getParent();
    joinNode.removeChild(optionalNode);
    joinNode.getFirstChild().setProperty(NodeConstants.Info.OUTPUT_COLS, joinNode.getProperty(NodeConstants.Info.OUTPUT_COLS));
    NodeEditor.removeChildNode(parentNode, joinNode);
    if (record != null && record.recordDebug()) {
      record.println("Removing join node since " + (isOptional?"it was marked as optional ":"it will not affect the results") + joinNode); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }

    while (parentNode.getType() != NodeConstants.Types.PROJECT) {
      PlanNode current = parentNode;
      parentNode = parentNode.getParent();
      if (correctFrame) {
        if (current.getType() == NodeConstants.Types.SELECT) {
          if (!Collections.disjoint(current.getGroups(), optionalNode.getGroups())) {
            current.getFirstChild().setProperty(NodeConstants.Info.OUTPUT_COLS, current.getProperty(NodeConstants.Info.OUTPUT_COLS));
            NodeEditor.removeChildNode(parentNode, current);
          }
        } else if (current.getType() == NodeConstants.Types.JOIN) {
          if (!Collections.disjoint(current.getGroups(), optionalNode.getGroups())) {
            List<Criteria> crits = (List<Criteria>) current.getProperty(NodeConstants.Info.JOIN_CRITERIA);
            if (crits != null && !crits.isEmpty()) {
              for (Iterator<Criteria> iterator = crits.iterator(); iterator.hasNext();) {
                Criteria criteria = iterator.next();
                if (!Collections.disjoint(GroupsUsedByElementsVisitor.getGroups(criteria), optionalNode.getGroups())) {
                  iterator.remove();
                }
              }
              if (crits.isEmpty()) {
                JoinType joinType = (JoinType) current.getProperty(NodeConstants.Info.JOIN_TYPE);
                if (joinType == JoinType.JOIN_INNER) {
                  current.setProperty(NodeConstants.Info.JOIN_TYPE, JoinType.JOIN_CROSS);
                }
              }
            }
          }
        }
      } else if (current.getType() != NodeConstants.Types.JOIN) {
        break;
      }
      if (current.getType() == NodeConstants.Types.JOIN) {
        current.getGroups().removeAll(optionalNode.getGroups());
      }
    }
   
    return NodeEditor.findAllNodes(optionalNode, NodeConstants.Types.JOIN);
    }
View Full Code Here

        node.setProperty(NodeConstants.Info.IS_DUP_REMOVAL, true);
      } else {
        root = checkForProjectOptimization(node, root, metadata, capFinder, record);
      }
      List<SingleElementSymbol> orderColumns = ((OrderBy)node.getProperty(NodeConstants.Info.SORT_ORDER)).getSortKeys();
      PlanNode possibleSort = NodeEditor.findNodePreOrder(node, NodeConstants.Types.GROUP, NodeConstants.Types.SOURCE | NodeConstants.Types.ACCESS);
      if (possibleSort != null) {
        List exprs = (List)possibleSort.getProperty(Info.GROUP_COLS);
        if (exprs != null && exprs.containsAll(orderColumns)) {
          exprs.removeAll(orderColumns);
          orderColumns.addAll(exprs);
          possibleSort.setProperty(Info.GROUP_COLS, orderColumns);
          if (node.getParent() == null) {
            root = node.getFirstChild();
            root.removeFromParent();
            node = root;
          } else {
            PlanNode nextNode = node.getFirstChild();
            NodeEditor.removeChildNode(node.getParent(), node);
            node = nextNode;
          }
        }
        break;
      }
/*      possibleSort = NodeEditor.findNodePreOrder(node, NodeConstants.Types.JOIN, NodeConstants.Types.SOURCE | NodeConstants.Types.ACCESS);
      if (possibleSort == null) {
        break;
      }
      boolean left = false;
      if (possibleSort.getType() == NodeConstants.Types.JOIN) {
        if (possibleSort.getProperty(NodeConstants.Info.JOIN_STRATEGY) != JoinStrategyType.MERGE
          || possibleSort.getProperty(NodeConstants.Info.JOIN_TYPE) != JoinType.JOIN_INNER) {
          break;
        }
        if (FrameUtil.findJoinSourceNode(possibleSort.getFirstChild()).getGroups().containsAll(node.getGroups())
            && possibleSort.getProperty(NodeConstants.Info.SORT_LEFT) == SortOption.SORT) {
          left = true;
        } else if (!FrameUtil.findJoinSourceNode(possibleSort.getLastChild()).getGroups().containsAll(node.getGroups())
            || possibleSort.getProperty(NodeConstants.Info.SORT_RIGHT) != SortOption.SORT) {
          break;
        }
      }
      List exprs = (List)possibleSort.getProperty(left?Info.LEFT_EXPRESSIONS:Info.RIGHT_EXPRESSIONS);
      if (exprs != null && exprs.containsAll(orderColumns)) {
        List<Integer> indexes = new ArrayList<Integer>(orderColumns.size());
        for (Expression expr : (List<Expression>)orderColumns) {
          indexes.add(0, exprs.indexOf(expr));
        }
        exprs.removeAll(orderColumns);
        List newExprs = new ArrayList(orderColumns);
        newExprs.addAll(exprs);
        possibleSort.setProperty(left?Info.LEFT_EXPRESSIONS:Info.RIGHT_EXPRESSIONS, newExprs);
        if (node.getParent() == null) {
          root = node.getFirstChild();
          root.removeFromParent();
          node = root;
        } else {
          PlanNode nextNode = node.getFirstChild();
          NodeEditor.removeChildNode(node.getParent(), node);
          node = nextNode;
        }
        exprs = (List)possibleSort.getProperty(left?Info.RIGHT_EXPRESSIONS:Info.LEFT_EXPRESSIONS);
        List toRemove = new ArrayList();
        for (Integer index : indexes) {
          Object o = exprs.get(index);
          exprs.add(0, o);
          toRemove.add(o);
        }
        exprs.subList(indexes.size(), exprs.size()).removeAll(toRemove);
        possibleSort.setProperty(left?NodeConstants.Info.SORT_LEFT:NodeConstants.Info.SORT_RIGHT, SortOption.SORT_REQUIRED);
      }
*/
      break;
    case NodeConstants.Types.DUP_REMOVE:
      if (parentBlocking) {
        node.setType(NodeConstants.Types.SORT);
        node.setProperty(NodeConstants.Info.IS_DUP_REMOVAL, true);
      }
      break;
    case NodeConstants.Types.GROUP:
      if (!node.hasCollectionProperty(NodeConstants.Info.GROUP_COLS)) {
        break;
      }
      if (mergeSortWithDupRemovalAcrossSource(node)) {
        node.setProperty(NodeConstants.Info.IS_DUP_REMOVAL, true);
      }
      //TODO: check the join interesting order
      parentBlocking = true;
      break;
    case NodeConstants.Types.JOIN:
      if (node.getProperty(NodeConstants.Info.JOIN_STRATEGY) == JoinStrategyType.NESTED_LOOP
          || node.getProperty(NodeConstants.Info.JOIN_STRATEGY) == JoinStrategyType.NESTED_TABLE) {
        break;
      }
      /*
       *  Look under the left and the right sources for a dup removal operation
       *  join
       *   [project]
       *     source
       *       dup remove | union not all
       */
      parentBlocking = true;
      PlanNode toTest = node.getFirstChild();
      if (mergeSortWithDupRemovalAcrossSource(toTest)) {
        node.setProperty(NodeConstants.Info.SORT_LEFT, SortOption.SORT_DISTINCT);
        if (node.getProperty(NodeConstants.Info.SORT_RIGHT) != SortOption.SORT) {
          node.setProperty(NodeConstants.Info.JOIN_STRATEGY, JoinStrategyType.MERGE);
        }
View Full Code Here

    return root;
  }

  private PlanNode checkForProjectOptimization(PlanNode node, PlanNode root,
      QueryMetadataInterface metadata, CapabilitiesFinder capFinder, AnalysisRecord record) throws QueryMetadataException, TeiidComponentException, QueryPlannerException {
    PlanNode projectNode = node.getFirstChild();
    PlanNode parent = node.getParent();
    boolean raiseAccess = false;
    //special check for unrelated order by compensation
    if (projectNode.getType() == NodeConstants.Types.ACCESS && RuleRaiseAccess.canRaiseOverSort(projectNode.getFirstChild(), metadata, capFinder, node, record, true)) {
      projectNode = NodeEditor.findNodePreOrder(projectNode, NodeConstants.Types.PROJECT, NodeConstants.Types.SOURCE);
      if (projectNode == null) {
        return root; //shouldn't happen
      }
      raiseAccess = true;
    } else if (projectNode.getType() == NodeConstants.Types.PROJECT && projectNode.getFirstChild() != null) {
      raiseAccess = projectNode.getFirstChild().getType() == NodeConstants.Types.ACCESS
        && RuleRaiseAccess.canRaiseOverSort(projectNode.getFirstChild(), metadata, capFinder, node, record, false);
     
      //if we can't raise the access node and this doesn't have a limit, there's no point in optimizing
      if (!raiseAccess && (parent == null || parent.getType() != NodeConstants.Types.TUPLE_LIMIT)) {
        return root;
      }
    } else {
      return root;
    }
    List<SingleElementSymbol> childOutputCols = (List<SingleElementSymbol>) projectNode.getFirstChild().getProperty(Info.OUTPUT_COLS);
    OrderBy orderBy = (OrderBy) node.getProperty(Info.SORT_ORDER);
    List<SingleElementSymbol> orderByKeys = orderBy.getSortKeys();
    for (SingleElementSymbol ss : orderByKeys) {
      if(ss instanceof AliasSymbol) {
                ss = ((AliasSymbol)ss).getSymbol();
            }
           
            if (ss instanceof ExpressionSymbol && !(ss instanceof AggregateSymbol)) {
                ExpressionSymbol exprSymbol = (ExpressionSymbol)ss;
               
                if (!exprSymbol.isDerivedExpression()) {
                    return root; //TODO: insert a new project node to handle this case
                }
            }
      if (!childOutputCols.contains(ss)) {
        return root;
      }
    }
    NodeEditor.removeChildNode(projectNode.getParent(), projectNode);
    if (parent != null && parent.getType() == NodeConstants.Types.TUPLE_LIMIT && parent.getParent() != null) {
      parent.addAsParent(projectNode);
    } else {
      if (parent == null) {
        root = projectNode;
      }
      if (parent != null && parent.getType() == NodeConstants.Types.TUPLE_LIMIT) {
        if (root == parent) {
          root = projectNode;
        }
        projectNode.addFirstChild(parent);
      } else {
        projectNode.addFirstChild(node);
      }
    }
    List<SingleElementSymbol> orderByOutputSymbols = (List<SingleElementSymbol>) node.getProperty(Info.OUTPUT_COLS);
    boolean unrelated = false;
    if (node.hasBooleanProperty(Info.UNRELATED_SORT)) {
      node.setProperty(Info.UNRELATED_SORT, false);
      unrelated = true;
    }
    for (OrderByItem item : orderBy.getOrderByItems()) {
      if (unrelated) {
          //update sort order
        int index = childOutputCols.indexOf(item.getSymbol());
        item.setExpressionPosition(index);
      }
      //strip alias as project was raised
      if (item.getSymbol() instanceof AliasSymbol) {
        item.setSymbol(((AliasSymbol)item.getSymbol()).getSymbol());
      }
    }
    projectNode.setProperty(Info.OUTPUT_COLS, orderByOutputSymbols);
    projectNode.setProperty(Info.PROJECT_COLS, orderByOutputSymbols);
    node.setProperty(Info.OUTPUT_COLS, childOutputCols);
    if (parent != null) {
      parent.setProperty(Info.OUTPUT_COLS, childOutputCols);
    }
    if (raiseAccess) {
      PlanNode accessNode = node.getFirstChild();
      //instead of just calling ruleraiseaccess, we're more selective
      //we do not want to raise the access node over a project that is handling an unrelated sort
      PlanNode newRoot = RuleRaiseAccess.raiseAccessNode(root, accessNode, metadata, capFinder, true, record);
      if (newRoot != null) {
        root = newRoot;
        if (accessNode.getParent().getType() == NodeConstants.Types.TUPLE_LIMIT) {
          newRoot = RulePushLimit.raiseAccessOverLimit(root, accessNode, metadata, capFinder, accessNode.getParent());
        }
View Full Code Here

    }
    return root;
  }

  private boolean mergeSortWithDupRemovalAcrossSource(PlanNode toTest) {
    PlanNode source = NodeEditor.findNodePreOrder(toTest, NodeConstants.Types.SOURCE, NodeConstants.Types.ACCESS | NodeConstants.Types.JOIN);
    return source != null && mergeSortWithDupRemoval(source);
  }
View Full Code Here

            }

            HashSet inputSymbols = new HashSet();
            List inputReferences = new LinkedList();
           
            PlanNode critNode = node.getParent();
           
            List conjuncts = new LinkedList();
            HashSet coveredParams = new HashSet();
            //List preExecNodes = new LinkedList();
                       
            for (Iterator params = proc.getInputParameters().iterator(); params.hasNext();) {
                SPParameter param = (SPParameter)params.next();
                ElementSymbol symbol = param.getParameterSymbol();
                Expression input = param.getExpression();
                inputReferences.add(input);
                inputSymbols.add(symbol);
            }
           
            findInputNodes(inputSymbols, critNode, conjuncts, coveredParams);
           
            List defaults = new LinkedList();
           
            for (Iterator params = inputReferences.iterator(); params.hasNext();) {
                Reference ref = (Reference)params.next();
                ElementSymbol symbol = ref.getExpression();
               
                Expression defaultValue = null;
               
                /*try {
                    defaultValue = ResolverUtil.getDefault(symbol, metadata);
                } catch (QueryResolverException qre) {
                    //Just ignore
                }*/
               
                defaults.add(defaultValue);
               
                if (defaultValue == null && !coveredParams.contains(symbol)) {
                    throw new QueryPlannerException(QueryPlugin.Util.getString("RulePlanProcedures.no_values", symbol)); //$NON-NLS-1$
                }
            }
           
            /*if (conjuncts.isEmpty()) {
                for (int j = 0; j < inputReferences.size(); j++) {
                    Reference ref = (Reference)inputReferences.get(j);
                    ref.setValue(defaults.get(j));
                }
                continue;
            }*/
           
            PlanNode accessNode = NodeEditor.findNodePreOrder(node, NodeConstants.Types.ACCESS);
           
            Criteria crit = Criteria.combineCriteria(conjuncts);
           
            accessNode.setProperty(NodeConstants.Info.PROCEDURE_CRITERIA, crit);
            accessNode.setProperty(NodeConstants.Info.PROCEDURE_INPUTS, inputReferences);
            accessNode.setProperty(NodeConstants.Info.PROCEDURE_DEFAULTS, defaults);
            accessNode.setProperty(NodeConstants.Info.IS_DEPENDENT_SET, Boolean.TRUE);
        }
       
        return plan;
    }
View Full Code Here

TOP

Related Classes of org.teiid.query.optimizer.relational.plantree.PlanNode

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.