Ejemplo n.º 1
0
        /**
         * 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);
        }
Ejemplo n.º 2
0
        /**
         * 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();
        }
Ejemplo n.º 3
0
        /**
         * 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();
        }