/** * Method declaration * * * @param e */ private void addAndCondition(Expression e) { Expression e2 = new Expression(e); if (eAnd == null) { eAnd = e2; } else { Expression and = new Expression(Expression.AND, eAnd, e2); eAnd = and; } e.setTrue(); }
/** * Method declaration * * * @param e */ private void addAndCondition(Expression e) { Expression e2 = new Expression(e); if (eAnd == null) { eAnd = e2; } else { Expression and = new Expression(Expression.AND, eAnd, e2); eAnd = and; } e.setTrue(); }
/** * Method declaration * * * @param e * * @throws Exception */ public void setCondition(Expression e) { int type = e.getType(); Expression e1 = e.getArg(); Expression e2 = e.getArg2(); if (type == Expression.AND) { setCondition(e1); setCondition(e2); return; } int candidate; switch (type) { case Expression.NOT_EQUAL: case Expression.LIKE: // todo: maybe use index case Expression.IN: candidate = 0; break; case Expression.EQUAL: candidate = 1; break; case Expression.BIGGER: case Expression.BIGGER_EQUAL: candidate = 2; break; case Expression.SMALLER: case Expression.SMALLER_EQUAL: candidate = 3; break; default: // not a condition so forget it return; } if (e1.getFilter() == this) { // ok include this } else if (e2.getFilter() == this && candidate != 0) { // swap and try again to allow index usage e.swapCondition(); setCondition(e); return; } else { // unrelated: don't include return; } Trace.assert(e1.getFilter() == this, "setCondition"); if (!e2.isResolved()) { return; } if (candidate == 0) { addAndCondition(e); return; } int i = e1.getColumnNr(); Index index = tTable.getIndexForColumn(i); if (index == null || (iIndex != index && iIndex != null)) { // no index or already another index is used addAndCondition(e); return; } iIndex = index; if (candidate == 1) { // candidate for both start & end if (eStart != null || eEnd != null) { addAndCondition(e); return; } eStart = new Expression(e); eEnd = eStart; } else if (candidate == 2) { // candidate for start if (eStart != null) { addAndCondition(e); return; } eStart = new Expression(e); } else if (candidate == 3) { // candidate for end if (eEnd != null) { addAndCondition(e); return; } eEnd = new Expression(e); } e.setTrue(); }
/** * Method declaration * * * @param e * * @throws Exception */ public void setCondition(Expression e) { int type = e.getType(); Expression e1 = e.getArg(); Expression e2 = e.getArg2(); if (type == Expression.AND) { setCondition(e1); setCondition(e2); return; } int candidate; switch (type) { case Expression.NOT_EQUAL: case Expression.LIKE: // todo: maybe use index case Expression.IN: candidate = 0; break; case Expression.EQUAL: candidate = 1; break; case Expression.BIGGER: case Expression.BIGGER_EQUAL: candidate = 2; break; case Expression.SMALLER: case Expression.SMALLER_EQUAL: candidate = 3; break; default: // not a condition so forget it return; } if (e1.getFilter() == this) { // ok include this } else if (e2.getFilter() == this && candidate != 0) { // swap and try again to allow index usage e.swapCondition(); setCondition(e); return; } else { // unrelated: don't include return; } Trace.assert(e1.getFilter() == this, "setCondition"); if (!e2.isResolved()) { return; } if (candidate == 0) { addAndCondition(e); return; } int i = e1.getColumnNr(); Index index = tTable.getIndexForColumn(i); if (index == null || (iIndex != index && iIndex != null)) { // no index or already another index is used addAndCondition(e); return; } iIndex = index; if (candidate == 1) { // candidate for both start & end if (eStart != null || eEnd != null) { addAndCondition(e); return; } eStart = new Expression(e); eEnd = eStart; } else if (candidate == 2) { // candidate for start if (eStart != null) { addAndCondition(e); return; } eStart = new Expression(e); } else if (candidate == 3) { // candidate for end if (eEnd != null) { addAndCondition(e); return; } eEnd = new Expression(e); } e.setTrue(); }