Example #1
0
 public double getCost(Session session, int[] masks) {
   if (recursive) {
     return 1000;
   }
   IntArray masksArray = new IntArray(masks == null ? Utils.EMPTY_INT_ARRAY : masks);
   CostElement cachedCost = costCache.get(masksArray);
   if (cachedCost != null) {
     long time = System.currentTimeMillis();
     if (time < cachedCost.evaluatedAt + Constants.VIEW_COST_CACHE_MAX_AGE) {
       return cachedCost.cost;
     }
   }
   Query q = (Query) session.prepare(querySQL, true);
   if (masks != null) {
     IntArray paramIndex = new IntArray();
     for (int i = 0; i < masks.length; i++) {
       int mask = masks[i];
       if (mask == 0) {
         continue;
       }
       paramIndex.add(i);
     }
     int len = paramIndex.size();
     for (int i = 0; i < len; i++) {
       int idx = paramIndex.get(i);
       int mask = masks[idx];
       int nextParamIndex = q.getParameters().size() + view.getParameterOffset();
       if ((mask & IndexCondition.EQUALITY) != 0) {
         Parameter param = new Parameter(nextParamIndex);
         q.addGlobalCondition(param, idx, Comparison.EQUAL_NULL_SAFE);
       } else {
         if ((mask & IndexCondition.START) != 0) {
           Parameter param = new Parameter(nextParamIndex);
           q.addGlobalCondition(param, idx, Comparison.BIGGER_EQUAL);
         }
         if ((mask & IndexCondition.END) != 0) {
           Parameter param = new Parameter(nextParamIndex);
           q.addGlobalCondition(param, idx, Comparison.SMALLER_EQUAL);
         }
       }
     }
     String sql = q.getPlanSQL();
     q = (Query) session.prepare(sql, true);
   }
   double cost = q.getCost();
   cachedCost = new CostElement();
   cachedCost.evaluatedAt = System.currentTimeMillis();
   cachedCost.cost = cost;
   costCache.put(masksArray, cachedCost);
   return cost;
 }
Example #2
0
 private Query getQuery(Session session, int[] masks) {
   Query q = (Query) session.prepare(querySQL, true);
   if (masks == null) {
     return q;
   }
   int firstIndexParam = originalParameters == null ? 0 : originalParameters.size();
   firstIndexParam += view.getParameterOffset();
   IntArray paramIndex = new IntArray();
   for (int i = 0; i < masks.length; i++) {
     int mask = masks[i];
     if (mask == 0) {
       continue;
     }
     paramIndex.add(i);
     if ((mask & IndexCondition.RANGE) == IndexCondition.RANGE) {
       // two parameters for range queries: >= x AND <= y
       paramIndex.add(i);
     }
   }
   int len = paramIndex.size();
   columns = new Column[len];
   for (int i = 0; i < len; ) {
     int idx = paramIndex.get(i);
     Column col = table.getColumn(idx);
     columns[i] = col;
     int mask = masks[idx];
     if ((mask & IndexCondition.EQUALITY) == IndexCondition.EQUALITY) {
       Parameter param = new Parameter(firstIndexParam + i);
       q.addGlobalCondition(param, idx, Comparison.EQUAL_NULL_SAFE);
       i++;
     } else {
       if ((mask & IndexCondition.START) == IndexCondition.START) {
         Parameter param = new Parameter(firstIndexParam + i);
         q.addGlobalCondition(param, idx, Comparison.BIGGER_EQUAL);
         i++;
       }
       if ((mask & IndexCondition.END) == IndexCondition.END) {
         Parameter param = new Parameter(firstIndexParam + i);
         q.addGlobalCondition(param, idx, Comparison.SMALLER_EQUAL);
         i++;
       }
     }
   }
   String sql = q.getPlanSQL();
   q = (Query) session.prepare(sql, true);
   return q;
 }
Example #3
0
 /**
  * Re-compile the query, updating the SQL statement.
  *
  * @param session the session
  * @return the query
  */
 public Query recompileQuery(Session session) {
   Prepared p = session.prepare(querySQL);
   if (!(p instanceof Query)) {
     throw DbException.getSyntaxError(querySQL, 0);
   }
   Query query = (Query) p;
   querySQL = query.getPlanSQL();
   return query;
 }
  /** @param sql Sql. */
  private <T extends Prepared> T parse(String sql) throws Exception {
    Session ses = (Session) connection().getSession();

    return (T) ses.prepare(sql);
  }
Example #5
0
 public Cursor find(Session session, SearchRow first, SearchRow last) {
   if (recursive) {
     if (view.getRecursiveResult() != null) {
       ResultInterface r = view.getRecursiveResult();
       r.reset();
       return new ViewCursor(table, r);
     }
     if (query == null) {
       query = (Query) createSession.prepare(querySQL, true);
       planSQL = query.getPlanSQL();
     }
     if (!(query instanceof SelectUnion)) {
       throw DbException.get(ErrorCode.SYNTAX_ERROR_2, "recursive queries without UNION ALL");
     }
     SelectUnion union = (SelectUnion) query;
     if (union.getUnionType() != SelectUnion.UNION_ALL) {
       throw DbException.get(ErrorCode.SYNTAX_ERROR_2, "recursive queries without UNION ALL");
     }
     Query left = union.getLeft();
     ResultInterface r = left.query(0);
     LocalResult result = union.getEmptyResult();
     while (r.next()) {
       result.addRow(r.currentRow());
     }
     Query right = union.getRight();
     r.reset();
     view.setRecursiveResult(r);
     while (true) {
       r = right.query(0);
       if (r.getRowCount() == 0) {
         break;
       }
       while (r.next()) {
         result.addRow(r.currentRow());
       }
       r.reset();
       view.setRecursiveResult(r);
     }
     return new ViewCursor(table, result);
   }
   ArrayList<Parameter> paramList = query.getParameters();
   for (int i = 0; originalParameters != null && i < originalParameters.size(); i++) {
     Parameter orig = originalParameters.get(i);
     int idx = orig.getIndex();
     Value value = orig.getValue(session);
     setParameter(paramList, idx, value);
   }
   int len;
   if (first != null) {
     len = first.getColumnCount();
   } else if (last != null) {
     len = last.getColumnCount();
   } else {
     len = 0;
   }
   int idx = originalParameters == null ? 0 : originalParameters.size();
   idx += view.getParameterOffset();
   for (int i = 0; i < len; i++) {
     if (first != null) {
       Value v = first.getValue(i);
       if (v != null) {
         int x = idx++;
         setParameter(paramList, x, v);
       }
     }
     // for equality, only one parameter is used (first == last)
     if (last != null && indexMasks[i] != IndexCondition.EQUALITY) {
       Value v = last.getValue(i);
       if (v != null) {
         int x = idx++;
         setParameter(paramList, x, v);
       }
     }
   }
   ResultInterface result = query.query(0);
   return new ViewCursor(table, result);
 }