Ejemplo n.º 1
0
 public ElementSymbol getResultSetColumn(int index) {
   SPParameter resultSetParameter = getResultSetParameter();
   if (resultSetParameter != null) {
     return resultSetParameter.getResultSetColumn(index);
   }
   return null;
 }
Ejemplo n.º 2
0
 public int getNumberOfColumns() {
   SPParameter resultSetParameter = getResultSetParameter();
   if (resultSetParameter != null) {
     return resultSetParameter.getResultSetColumns().size();
   }
   return 0;
 }
Ejemplo n.º 3
0
  public LinkedHashMap<ElementSymbol, Expression> getProcedureParameters() {
    LinkedHashMap<ElementSymbol, Expression> map = new LinkedHashMap<ElementSymbol, Expression>();
    for (SPParameter element : this.getInputParameters()) {
      map.put(element.getParameterSymbol(), element.getExpression());
    } // for

    return map;
  }
Ejemplo n.º 4
0
 public boolean returnsScalarValue() {
   for (SPParameter param : this.mapOfParameters.values()) {
     if (param.getParameterType() == SPParameter.RETURN_VALUE) {
       return true;
     }
   }
   return false;
 }
Ejemplo n.º 5
0
 private Expression rewriteMultiSourceCommand(Command command) throws TeiidComponentException {
   Expression result = null;
   if (command instanceof StoredProcedure) {
     StoredProcedure obj = (StoredProcedure) command;
     for (Iterator<SPParameter> params = obj.getMapOfParameters().values().iterator();
         params.hasNext(); ) {
       SPParameter param = params.next();
       if (param.getParameterType() != SPParameter.IN) {
         continue;
       }
       if (metadata.isMultiSourceElement(param.getMetadataID())) {
         Expression source = param.getExpression();
         params.remove();
         if (param.isUsingDefault()
             && source instanceof Constant
             && ((Constant) source).isNull()) {
           continue;
         }
         result = source;
         break;
       }
     }
   }
   if (command instanceof Insert) {
     Insert obj = (Insert) command;
     for (int i = 0; i < obj.getVariables().size(); i++) {
       ElementSymbol elem = obj.getVariables().get(i);
       Object metadataID = elem.getMetadataID();
       if (metadata.isMultiSourceElement(metadataID)) {
         Expression source = (Expression) obj.getValues().get(i);
         obj.getVariables().remove(i);
         obj.getValues().remove(i);
         result = source;
         break;
       }
     }
   } else if (command instanceof FilteredCommand) {
     for (Criteria c : Criteria.separateCriteriaByAnd(((FilteredCommand) command).getCriteria())) {
       if (!(c instanceof CompareCriteria)) {
         continue;
       }
       CompareCriteria cc = (CompareCriteria) c;
       if (cc.getLeftExpression() instanceof ElementSymbol) {
         ElementSymbol es = (ElementSymbol) cc.getLeftExpression();
         if (metadata.isMultiSourceElement(es.getMetadataID())
             && EvaluatableVisitor.willBecomeConstant(cc.getRightExpression())) {
           if (result != null && !result.equals(cc.getRightExpression())) {
             return Constant.NULL_CONSTANT;
           }
           result = cc.getRightExpression();
         }
       }
     }
   }
   return result;
 }
Ejemplo n.º 6
0
 public List<SPParameter> getInputParameters() {
   List<SPParameter> parameters = new ArrayList<SPParameter>(getParameters());
   Iterator<SPParameter> params = parameters.iterator();
   while (params.hasNext()) {
     SPParameter param = params.next();
     if (param.getParameterType() != ParameterInfo.IN
         && param.getParameterType() != ParameterInfo.INOUT) {
       params.remove();
     }
   }
   return parameters;
 }
Ejemplo n.º 7
0
  /**
   * Set a stored procedure's parameter
   *
   * @param index the index of the parameter to set
   * @param parameter <code>StoredProcedureParameter</code> the parameter
   * @throws IllegalArgumentExcecption if the parameters (index and parameter) are invalid.
   */
  public void setParameter(SPParameter parameter) {
    if (parameter == null) {
      throw new IllegalArgumentException(
          QueryPlugin.Util.getString("ERR.015.010.0011")); // $NON-NLS-1$
    }

    Integer key = parameter.getIndex();
    if (parameter.getParameterType() == ParameterInfo.RESULT_SET) {
      resultSetParameterKey = key;
    }

    mapOfParameters.put(key, parameter);
  }
Ejemplo n.º 8
0
 public List<ElementSymbol> getResultSetColumns() {
   SPParameter resultSetParameter = getResultSetParameter();
   if (resultSetParameter != null) {
     List<ElementSymbol> result = new LinkedList<ElementSymbol>();
     for (Iterator<ElementSymbol> i = resultSetParameter.getResultSetColumns().iterator();
         i.hasNext(); ) {
       ElementSymbol symbol = i.next().clone();
       symbol.setGroupSymbol(getGroup());
       result.add(symbol);
     }
     return result;
   }
   return Collections.emptyList();
 }
Ejemplo n.º 9
0
 public Object clone() {
   StoredProcedure copy = new StoredProcedure();
   copy.setModelID(getModelID());
   copy.setProcedureName(getProcedureName());
   copy.setProcedureCallableName(getProcedureCallableName());
   copy.setProcedureID(getProcedureID());
   copy.setGroup(getGroup().clone());
   copy.callableName = callableName;
   copy.calledWithReturn = calledWithReturn;
   Collection<SPParameter> params = getParameters();
   for (SPParameter spParameter : params) {
     copy.setParameter((SPParameter) spParameter.clone());
   }
   copy.resultSetParameterKey = resultSetParameterKey;
   this.copyMetadataState(copy);
   copy.displayNamedParameters = displayNamedParameters;
   copy.isCallableStatement = isCallableStatement;
   copy.isProcedureRelational = isProcedureRelational;
   return copy;
 }
Ejemplo n.º 10
0
 /**
  * Get the ordered list of all elements returned by this query. These elements may be
  * ElementSymbols or ExpressionSymbols but in all cases each represents a single column.
  *
  * @return Ordered list of SingleElementSymbol
  */
 public List getProjectedSymbols() {
   if (!returnParameters()) {
     return getResultSetColumns();
   }
   // add result set columns
   List<ElementSymbol> result = new ArrayList<ElementSymbol>(getResultSetColumns());
   // add out/inout parameter symbols
   for (SPParameter parameter : mapOfParameters.values()) {
     if (parameter.getParameterType() == ParameterInfo.RETURN_VALUE) {
       ElementSymbol symbol = parameter.getParameterSymbol();
       symbol.setGroupSymbol(this.getGroup());
       result.add(0, symbol);
     } else if (parameter.getParameterType() == ParameterInfo.INOUT
         || parameter.getParameterType() == ParameterInfo.OUT) {
       ElementSymbol symbol = parameter.getParameterSymbol();
       symbol.setGroupSymbol(this.getGroup());
       result.add(symbol);
     }
   }
   return result;
 }
Ejemplo n.º 11
0
 public boolean returnsResultSet() {
   SPParameter param = getResultSetParameter();
   return param != null && !param.getResultSetColumns().isEmpty();
 }
Ejemplo n.º 12
0
  private TupleSource handleSystemProcedures(final CommandContext context, StoredProcedure proc)
      throws TeiidComponentException, QueryMetadataException, QueryProcessingException,
          QueryResolverException, QueryValidatorException, TeiidProcessingException,
          ExpressionEvaluationException {
    final QueryMetadataInterface metadata = context.getMetadata();
    if (StringUtil.endsWithIgnoreCase(proc.getProcedureCallableName(), REFRESHMATVIEW)) {
      Object groupID =
          validateMatView(
              metadata, (String) ((Constant) proc.getParameter(2).getExpression()).getValue());
      TempMetadataID matTableId =
          context.getGlobalTableStore().getGlobalTempTableMetadataId(groupID);
      final GlobalTableStore globalStore = getGlobalStore(context, matTableId);
      String matViewName = metadata.getFullName(groupID);
      String matTableName = metadata.getFullName(matTableId);
      LogManager.logDetail(
          LogConstants.CTX_MATVIEWS, "processing refreshmatview for", matViewName); // $NON-NLS-1$
      boolean invalidate =
          Boolean.TRUE.equals(((Constant) proc.getParameter(3).getExpression()).getValue());
      boolean needsLoading =
          globalStore.needsLoading(matTableName, globalStore.getAddress(), true, true, invalidate);
      if (!needsLoading) {
        return CollectionTupleSource.createUpdateCountTupleSource(-1);
      }
      GroupSymbol matTable = new GroupSymbol(matTableName);
      matTable.setMetadataID(matTableId);
      return loadGlobalTable(context, matTable, matTableName, globalStore);
    } else if (StringUtil.endsWithIgnoreCase(proc.getProcedureCallableName(), REFRESHMATVIEWROW)) {
      final Object groupID =
          validateMatView(
              metadata, (String) ((Constant) proc.getParameter(2).getExpression()).getValue());
      TempMetadataID matTableId =
          context.getGlobalTableStore().getGlobalTempTableMetadataId(groupID);
      final GlobalTableStore globalStore = getGlobalStore(context, matTableId);
      Object pk = metadata.getPrimaryKey(groupID);
      String matViewName = metadata.getFullName(groupID);
      if (pk == null) {
        throw new QueryProcessingException(
            QueryPlugin.Event.TEIID30230,
            QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30230, matViewName));
      }
      List<?> ids = metadata.getElementIDsInKey(pk);
      Constant key = (Constant) proc.getParameter(3).getExpression();
      Object initialValue = key.getValue();
      SPParameter keyOther = proc.getParameter(4);
      Object[] otherCols = null;
      int length = 1;
      if (keyOther != null) {
        otherCols = ((ArrayImpl) ((Constant) keyOther.getExpression()).getValue()).getValues();
        if (otherCols != null) {
          length += otherCols.length;
        }
      }
      if (ids.size() != length) {
        throw new QueryProcessingException(
            QueryPlugin.Event.TEIID30231,
            QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30231, matViewName, ids.size(), length));
      }
      final String matTableName = RelationalPlanner.MAT_PREFIX + matViewName.toUpperCase();
      MatTableInfo info = globalStore.getMatTableInfo(matTableName);
      if (!info.isValid()) {
        return CollectionTupleSource.createUpdateCountTupleSource(-1);
      }
      TempTable tempTable = globalStore.getTempTable(matTableName);
      if (!tempTable.isUpdatable()) {
        throw new QueryProcessingException(
            QueryPlugin.Event.TEIID30232,
            QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30232, matViewName));
      }
      Iterator<?> iter = ids.iterator();
      final Object[] params = new Object[length];
      StringBuilder criteria = new StringBuilder();
      for (int i = 0; i < length; i++) {
        Object id = iter.next();
        String targetTypeName = metadata.getElementType(id);
        Object value = i == 0 ? initialValue : otherCols[i - 1];
        value =
            DataTypeManager.transformValue(value, DataTypeManager.getDataTypeClass(targetTypeName));
        params[i] = value;
        if (i != 0) {
          criteria.append(" AND "); // $NON-NLS-1$
        }
        criteria.append(metadata.getFullName(id)).append(" = ?"); // $NON-NLS-1$
      }
      LogManager.logInfo(
          LogConstants.CTX_MATVIEWS,
          QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30012, matViewName, Arrays.toString(params)));

      String queryString =
          Reserved.SELECT
              + " * "
              + Reserved.FROM
              + ' '
              + matViewName
              + ' '
              + Reserved.WHERE
              + ' '
              + //$NON-NLS-1$
              criteria.toString()
              + ' '
              + Reserved.OPTION
              + ' '
              + Reserved.NOCACHE;
      final QueryProcessor qp =
          context
              .getQueryProcessorFactory()
              .createQueryProcessor(queryString, matViewName.toUpperCase(), context, params);
      final TupleSource ts = new BatchCollector.BatchProducerTupleSource(qp);
      return new ProxyTupleSource() {

        @Override
        protected TupleSource createTupleSource()
            throws TeiidComponentException, TeiidProcessingException {
          List<?> tuple = ts.nextTuple();
          boolean delete = false;
          if (tuple == null) {
            delete = true;
            tuple = Arrays.asList(params);
          } else {
            tuple = new ArrayList<Object>(tuple); // ensure the list is serializable
          }
          List<?> result = globalStore.updateMatViewRow(matTableName, tuple, delete);
          if (eventDistributor != null) {
            eventDistributor.updateMatViewRow(
                context.getVdbName(),
                context.getVdbVersion(),
                metadata.getName(metadata.getModelID(groupID)),
                metadata.getName(groupID),
                tuple,
                delete);
          }
          return CollectionTupleSource.createUpdateCountTupleSource(result != null ? 1 : 0);
        }

        @Override
        public void closeSource() {
          super.closeSource();
          qp.closeProcessing();
        }
      };
    }
    return null;
  }
Ejemplo n.º 13
0
  private TupleSource handleCachedProcedure(final CommandContext context, StoredProcedure proc)
      throws TeiidComponentException, QueryMetadataException, TeiidProcessingException {
    String fullName = context.getMetadata().getFullName(proc.getProcedureID());
    LogManager.logDetail(
        LogConstants.CTX_DQP, "processing cached procedure request for", fullName); // $NON-NLS-1$
    LinkedList<Object> vals = new LinkedList<Object>();
    for (SPParameter param : proc.getInputParameters()) {
      vals.add(((Constant) param.getExpression()).getValue());
    }
    // collapse the hash to single byte for the key to restrict the possible results to 256
    int hash = vals.hashCode();
    hash |= (hash >>> 16);
    hash |= (hash >>> 8);
    hash &= 0x000000ff;
    final CacheID cid =
        new CacheID(
            new ParseInfo(),
            fullName + hash,
            context.getVdbName(),
            context.getVdbVersion(),
            context.getConnectionId(),
            context.getUserName());
    cid.setParameters(vals);
    CachedResults results = cache.get(cid);
    if (results != null) {
      TupleBuffer buffer = results.getResults();
      return buffer.createIndexedTupleSource();
    }
    // construct a query with a no cache hint
    final CacheHint hint = proc.getCacheHint();
    proc.setCacheHint(null);
    Option option = new Option();
    option.setNoCache(true);
    option.addNoCacheGroup(fullName);
    proc.setOption(option);
    StoredProcedure cloneProc = (StoredProcedure) proc.clone();
    int i = 0;
    for (SPParameter param : cloneProc.getInputParameters()) {
      param.setExpression(new Reference(i++));
    }
    final QueryProcessor qp =
        context
            .getQueryProcessorFactory()
            .createQueryProcessor(
                cloneProc.toString(), fullName.toUpperCase(), context, vals.toArray());
    final BatchCollector bc = qp.createBatchCollector();

    return new ProxyTupleSource() {
      boolean success = false;

      @Override
      protected TupleSource createTupleSource()
          throws TeiidComponentException, TeiidProcessingException {
        TupleBuffer tb = bc.collectTuples();
        CachedResults cr = new CachedResults();
        cr.setResults(tb, qp.getProcessorPlan());
        Determinism determinismLevel = qp.getContext().getDeterminismLevel();
        if (hint != null && hint.getDeterminism() != null) {
          LogManager.logTrace(
              LogConstants.CTX_DQP,
              new Object[] {
                "Cache hint modified the query determinism from ",
                determinismLevel,
                " to ",
                hint.getDeterminism()
              }); //$NON-NLS-1$ //$NON-NLS-2$
          determinismLevel = hint.getDeterminism();
        }
        cache.put(cid, determinismLevel, cr, hint != null ? hint.getTtl() : null);
        context.setDeterminismLevel(determinismLevel);
        success = true;
        return tb.createIndexedTupleSource();
      }

      @Override
      public void closeSource() {
        super.closeSource();
        qp.closeProcessing();
        if (!success && bc.getTupleBuffer() != null) {
          bc.getTupleBuffer().remove();
        }
      }
    };
  }
Ejemplo n.º 14
0
  private TupleSource handleSystemProcedures(final CommandContext context, StoredProcedure proc)
      throws TeiidComponentException, QueryMetadataException, QueryProcessingException,
          QueryResolverException, QueryValidatorException, TeiidProcessingException,
          ExpressionEvaluationException {
    final QueryMetadataInterface metadata = context.getMetadata();
    if (StringUtil.endsWithIgnoreCase(proc.getProcedureCallableName(), REFRESHMATVIEW)) {
      Object groupID =
          validateMatView(
              metadata, (String) ((Constant) proc.getParameter(2).getExpression()).getValue());
      TempMetadataID matTableId =
          context.getGlobalTableStore().getGlobalTempTableMetadataId(groupID);
      final GlobalTableStore globalStore = getGlobalStore(context, matTableId);
      String matViewName = metadata.getFullName(groupID);
      String matTableName = metadata.getFullName(matTableId);
      LogManager.logDetail(
          LogConstants.CTX_MATVIEWS, "processing refreshmatview for", matViewName); // $NON-NLS-1$
      boolean invalidate =
          Boolean.TRUE.equals(((Constant) proc.getParameter(3).getExpression()).getValue());
      boolean needsLoading =
          globalStore.needsLoading(matTableName, globalStore.getAddress(), true, true, invalidate);
      if (!needsLoading) {
        return CollectionTupleSource.createUpdateCountTupleSource(-1);
      }
      GroupSymbol matTable = new GroupSymbol(matTableName);
      matTable.setMetadataID(matTableId);
      return loadGlobalTable(context, matTable, matTableName, globalStore);
    } else if (StringUtil.endsWithIgnoreCase(proc.getProcedureCallableName(), REFRESHMATVIEWROWS)) {
      final Object groupID =
          validateMatView(
              metadata, (String) ((Constant) proc.getParameter(2).getExpression()).getValue());
      TempMetadataID matTableId =
          context.getGlobalTableStore().getGlobalTempTableMetadataId(groupID);
      final GlobalTableStore globalStore = getGlobalStore(context, matTableId);
      Object pk = metadata.getPrimaryKey(groupID);
      String matViewName = metadata.getFullName(groupID);
      if (pk == null) {
        throw new QueryProcessingException(
            QueryPlugin.Event.TEIID30230,
            QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30230, matViewName));
      }
      List<?> ids = metadata.getElementIDsInKey(pk);
      Object[][] params =
          (Object[][])
              ((ArrayImpl) ((Constant) proc.getParameter(3).getExpression()).getValue())
                  .getValues();
      return updateMatviewRows(context, metadata, groupID, globalStore, matViewName, ids, params);
    } else if (StringUtil.endsWithIgnoreCase(proc.getProcedureCallableName(), REFRESHMATVIEWROW)) {
      final Object groupID =
          validateMatView(
              metadata, (String) ((Constant) proc.getParameter(2).getExpression()).getValue());
      TempMetadataID matTableId =
          context.getGlobalTableStore().getGlobalTempTableMetadataId(groupID);
      final GlobalTableStore globalStore = getGlobalStore(context, matTableId);
      Object pk = metadata.getPrimaryKey(groupID);
      final String matViewName = metadata.getFullName(groupID);
      if (pk == null) {
        throw new QueryProcessingException(
            QueryPlugin.Event.TEIID30230,
            QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30230, matViewName));
      }
      List<?> ids = metadata.getElementIDsInKey(pk);
      Constant key = (Constant) proc.getParameter(3).getExpression();
      Object initialValue = key.getValue();
      SPParameter keyOther = proc.getParameter(4);
      Object[] param = null;
      if (keyOther != null) {
        Object[] otherCols =
            ((ArrayImpl) ((Constant) keyOther.getExpression()).getValue()).getValues();
        if (otherCols != null) {
          param = new Object[1 + otherCols.length];
          param[0] = initialValue;
          for (int i = 0; i < otherCols.length; i++) {
            param[i + 1] = otherCols[i];
          }
        }
      }
      if (param == null) {
        param = new Object[] {initialValue};
      }

      Object[][] params = new Object[][] {param};

      return updateMatviewRows(context, metadata, groupID, globalStore, matViewName, ids, params);
    }
    return null;
  }