use of com.wplatform.ddal.value.Value in project jdbc-shards by wplatform.
the class Query method prepareOrder.
/**
* Create a {@link SortOrder} object given the list of {@link SelectOrderBy}
* objects. The expression list is extended if necessary.
*
* @param orderList a list of {@link SelectOrderBy} elements
* @param expressionCount the number of columns in the query
* @return the {@link SortOrder} object
*/
public SortOrder prepareOrder(ArrayList<SelectOrderBy> orderList, int expressionCount) {
int size = orderList.size();
int[] index = new int[size];
int[] sortType = new int[size];
for (int i = 0; i < size; i++) {
SelectOrderBy o = orderList.get(i);
int idx;
boolean reverse = false;
Expression expr = o.columnIndexExpr;
Value v = expr.getValue(null);
if (v == ValueNull.INSTANCE) {
// parameter not yet set - order by first column
idx = 0;
} else {
idx = v.getInt();
if (idx < 0) {
reverse = true;
idx = -idx;
}
idx -= 1;
if (idx < 0 || idx >= expressionCount) {
throw DbException.get(ErrorCode.ORDER_BY_NOT_IN_RESULT, "" + (idx + 1));
}
}
index[i] = idx;
boolean desc = o.descending;
if (reverse) {
desc = !desc;
}
int type = desc ? SortOrder.DESCENDING : SortOrder.ASCENDING;
if (o.nullsFirst) {
type += SortOrder.NULLS_FIRST;
} else if (o.nullsLast) {
type += SortOrder.NULLS_LAST;
}
sortType[i] = type;
}
return new SortOrder(session.getDatabase(), index, sortType, orderList);
}
use of com.wplatform.ddal.value.Value in project jdbc-shards by wplatform.
the class Query method query.
/**
* Execute the query, writing the result to the target result.
*
* @param limit the maximum number of rows to return
* @param target the target result (null will return the result)
* @return the result set (if the target is not set).
*/
public LocalResult query(int limit, ResultTarget target) {
if (noCache) {
return queryWithoutCache(limit, target);
}
Value[] params = getParameterValues();
if (isEverything(ExpressionVisitor.DETERMINISTIC_VISITOR)) {
if (lastResult != null && !lastResult.isClosed() && limit == lastLimit) {
if (sameResultAsLast(session, params, lastParameters)) {
lastResult = lastResult.createShallowCopy(session);
if (lastResult != null) {
lastResult.reset();
return lastResult;
}
}
}
}
lastParameters = params;
closeLastResult();
LocalResult r = queryWithoutCache(limit, target);
lastResult = r;
lastLimit = limit;
return r;
}
use of com.wplatform.ddal.value.Value in project jdbc-shards by wplatform.
the class ConditionInConstantSet method getValue.
@Override
public Value getValue(Session session) {
Value x = left.getValue(session);
if (x == ValueNull.INSTANCE) {
return x;
}
boolean result = valueSet.contains(x);
if (!result) {
boolean setHasNull = valueSet.contains(ValueNull.INSTANCE);
if (setHasNull) {
return ValueNull.INSTANCE;
}
}
return ValueBoolean.get(result);
}
use of com.wplatform.ddal.value.Value in project jdbc-shards by wplatform.
the class ConditionInSelect method exportParameters.
@Override
public String exportParameters(TableFilter filter, List<Value> container) {
Session session = filter.getSession();
LocalResult rows = query(session);
if (rows.getRowCount() > 0) {
StatementBuilder buff = new StatementBuilder();
buff.append('(').append(left.exportParameters(filter, container)).append(' ');
if (all) {
//由于all代表全部,所以<all表示小于子查询中返回全部值中的最小值;
//>all表示大于子查询中返回全部值中的最大值。
buff.append(Comparison.getCompareOperator(compareType)).append(" ALL");
} else {
if (compareType == Comparison.EQUAL) {
buff.append("IN");
} else {
//<any可以理解为小于子查询中返回的任意一个值,因此只要小于最大值即可
//>any可以理解为大于子查询中返回的任意一个值,因此只要大于最小值即可
buff.append(Comparison.getCompareOperator(compareType)).append(" ANY");
}
}
buff.append("(");
while (rows.next()) {
buff.appendExceptFirst(",");
buff.append("?");
Value r = rows.currentRow()[0];
container.add(r);
}
buff.append("))");
return buff.toString();
} else {
return "1 = 0";
}
}
use of com.wplatform.ddal.value.Value in project jdbc-shards by wplatform.
the class ConditionInSelect method getValue.
@Override
public Value getValue(Session session) {
LocalResult rows = query(session);
try {
Value l = left.getValue(session);
if (rows.getRowCount() == 0) {
return ValueBoolean.get(all);
} else if (l == ValueNull.INSTANCE) {
return l;
}
if (!session.getDatabase().getSettings().optimizeInSelect) {
return getValueSlow(rows, l);
}
if (all || (compareType != Comparison.EQUAL && compareType != Comparison.EQUAL_NULL_SAFE)) {
return getValueSlow(rows, l);
}
int dataType = rows.getColumnType(0);
if (dataType == Value.NULL) {
return ValueBoolean.get(false);
}
l = l.convertTo(dataType);
if (rows.containsDistinct(new Value[] { l })) {
return ValueBoolean.get(true);
}
if (rows.containsDistinct(new Value[] { ValueNull.INSTANCE })) {
return ValueNull.INSTANCE;
}
return ValueBoolean.get(false);
} finally {
rows.close();
}
}
Aggregations