use of lucee.runtime.sql.exp.Expression in project Lucee by lucee.
the class SelectParser method xorOp.
private Expression xorOp(ParserString raw) throws SQLParserException {
Expression expr = orOp(raw);
while (raw.forwardIfCurrentAndNoWordNumberAfter("xor")) {
raw.removeSpace();
expr = new Operation2(expr, orOp(raw), Operation.OPERATION2_XOR);
}
return expr;
}
use of lucee.runtime.sql.exp.Expression in project Lucee by lucee.
the class SelectParser method plusMinusOp.
private Expression plusMinusOp(ParserString raw) throws SQLParserException {
Expression expr = modOp(raw);
while (!raw.isLast()) {
// Plus Operation
if (raw.forwardIfCurrent('+')) {
raw.removeSpace();
expr = new Operation2(expr, modOp(raw), Operation.OPERATION2_PLUS);
} else // Minus Operation
if (raw.forwardIfCurrent('-')) {
raw.removeSpace();
expr = new Operation2(expr, modOp(raw), Operation.OPERATION2_MINUS);
} else
break;
}
return expr;
}
use of lucee.runtime.sql.exp.Expression in project Lucee by lucee.
the class SelectParser method divMultiOp.
private Expression divMultiOp(ParserString raw) throws SQLParserException {
Expression expr = expoOp(raw);
while (!raw.isLast()) {
// Multiply Operation
if (raw.forwardIfCurrent('*')) {
raw.removeSpace();
expr = new Operation2(expr, expoOp(raw), Operation.OPERATION2_MULTIPLY);
} else // Divide Operation
if (raw.forwardIfCurrent('/')) {
raw.removeSpace();
expr = new Operation2(expr, expoOp(raw), Operation.OPERATION2_DIVIDE);
} else {
break;
}
}
return expr;
}
use of lucee.runtime.sql.exp.Expression in project Lucee by lucee.
the class OperationN method toString.
@Override
public String toString(boolean noAlias) {
if (!hasIndex() || noAlias) {
StringBuffer sb = new StringBuffer();
sb.append(operator);
sb.append('(');
Iterator it = operants.iterator();
boolean isFirst = true;
while (it.hasNext()) {
if (!isFirst)
sb.append(',');
Expression exp = (Expression) it.next();
sb.append(exp.toString(!operator.equalsIgnoreCase("cast")));
isFirst = false;
}
sb.append(')');
return sb.toString();
}
return toString(true) + " as " + getAlias();
}
use of lucee.runtime.sql.exp.Expression in project Lucee by lucee.
the class QoQ method executeSingle.
private void executeSingle(PageContext pc, Select select, Query qr, QueryImpl target, int maxrows, SQL sql, boolean hasOrders) throws PageException {
ValueNumber oTop = select.getTop();
if (oTop != null) {
int top = (int) oTop.getValueAsDouble();
if (maxrows == -1 || maxrows > top)
maxrows = top;
}
int recCount = qr.getRecordcount();
Expression[] expSelects = select.getSelects();
int selCount = expSelects.length;
Map<Collection.Key, Object> selects = new HashMap<Collection.Key, Object>();
Iterator<Key> it;
Key k;
// headers
for (int i = 0; i < selCount; i++) {
Expression expSelect = expSelects[i];
if (expSelect.getAlias().equals("*")) {
it = qr.keyIterator();
while (it.hasNext()) {
k = it.next();
selects.put(k, k);
queryAddColumn(target, k, qr.getColumn(k).getType());
}
} else {
Key alias = Caster.toKey(expSelect.getAlias());
selects.put(alias, expSelect);
int type = Types.OTHER;
if (expSelect instanceof ColumnExpression)
type = qr.getColumn(Caster.toKey(((ColumnExpression) expSelect).getColumnName())).getType();
queryAddColumn(target, alias, type);
}
}
Collection.Key[] headers = selects.keySet().toArray(new Collection.Key[selects.size()]);
// loop records
Operation where = select.getWhere();
boolean hasMaxrow = maxrows > -1 && !hasOrders;
// get target columns
QueryColumn[] trgColumns = new QueryColumn[headers.length];
Object[] trgValues = new Object[headers.length];
for (int cell = 0; cell < headers.length; cell++) {
trgColumns[cell] = target.getColumn(headers[cell]);
trgValues[cell] = selects.get(headers[cell]);
}
for (int row = 1; row <= recCount; row++) {
sql.setPosition(0);
if (hasMaxrow && maxrows <= target.getRecordcount())
break;
boolean useRow = where == null || Caster.toBooleanValue(executeExp(pc, sql, qr, where, row));
if (useRow) {
target.addRow(1);
for (int cell = 0; cell < headers.length; cell++) {
// Object value = selects.get(headers[cell]);
trgColumns[cell].set(target.getRecordcount(), getValue(pc, sql, qr, row, headers[cell], trgValues[cell]));
/*target.setAt(
headers[cell],
target.getRecordcount(),
getValue(pc,sql,qr,row,headers[cell],trgValues[cell])
);*/
}
}
}
// Group By
if (select.getGroupbys().length > 0)
throw new DatabaseException("group by are not supported at the moment", null, sql, null);
if (select.getHaving() != null)
throw new DatabaseException("having is not supported at the moment", null, sql, null);
}
Aggregations