/** * Method declaration * * * @return * * @throws Exception */ public bool findFirst() { if (iIndex == null) { iIndex = tTable.getPrimaryIndex(); } if (eStart == null) { nCurrent = iIndex.first(); } else { int type = eStart.getArg().getDataType(); object o = eStart.getArg2().getValue(type); nCurrent = iIndex.findFirst(o, eStart.getType()); } while (nCurrent != null) { oCurrentData = nCurrent.getData(); if (!test(eEnd)) { break; } if (test(eAnd)) { return(true); } nCurrent = iIndex.next(nCurrent); } oCurrentData = oEmptyData; if (bOuterJoin) { return(true); } return(false); }
/** * 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(); }