orderfundef.java

来自「数据仓库展示程序」· Java 代码 · 共 85 行

JAVA
85
字号
/*
// $Id: //open/mondrian/src/main/mondrian/olap/fun/OrderFunDef.java#5 $
// This software is subject to the terms of the Common Public License
// Agreement, available at the following URL:
// http://www.opensource.org/licenses/cpl.html.
// (C) Copyright 2004-2005 Kana Software, Inc. and others.
// All Rights Reserved.
// You must accept the terms of that agreement to use this software.
*/
package mondrian.olap.fun;

import mondrian.olap.*;

import java.util.List;

/**
 * Definition of the <code>ORDER</code> MDX function.
 */
class OrderFunDef extends FunDefBase {
    private final boolean desc;
    private final boolean brk;

    public OrderFunDef(FunDef dummyFunDef, boolean desc, boolean brk) {
        super(dummyFunDef);
        this.desc = desc;
        this.brk = brk;
    }

    public boolean callDependsOn(FunCall call, Dimension dimension) {
        // Order(<Set>, <Value Expression>) depends upon everything
        // <Value Expression> depends upon, except the dimensions of <Set>.
        return callDependsOnSet(call, dimension);
    }

    public Object evaluate(Evaluator evaluator, Exp[] args) {
        List members = (List) getArg(evaluator, args, 0);
        ExpBase exp = (ExpBase) getArgNoEval(args, 1);
        sort(evaluator.push(), members, exp, desc, brk);
        return members;
    }

    /**
     * Resolves calls to the <code>ORDER</code> MDX function.
     */
    static class OrderResolver extends MultiResolver {
        public OrderResolver() {
            super("Order",
                "Order(<Set>, <Value Expression>[, ASC | DESC | BASC | BDESC])",
                "Arranges members of a set, optionally preserving or breaking the hierarchy.",
                new String[]{"fxxvy", "fxxv"});
        }

        public String[] getReservedWords() {
            return OrderFunDef.Flags.instance.getNames();
        }

        protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) {
            int order = getLiteralArg(args, 2, Flags.ASC, Flags.instance, dummyFunDef);
            final boolean desc = Flags.isDescending(order);
            final boolean brk = Flags.isBreak(order);
            return new OrderFunDef(dummyFunDef, desc, brk);
        }
    }

    /**
     * Enumeration of the flags allowed to the <code>ORDER</code> MDX function.
     */
    static class Flags extends EnumeratedValues {
        static final Flags instance = new Flags();
        private Flags() {
            super(new String[] {"ASC","DESC","BASC","BDESC"});
        }
        public static final int ASC = 0;
        public static final int DESC = 1;
        public static final int BASC = 2;
        public static final int BDESC = 3;
        public static final boolean isDescending(int value) {
            return (value & DESC) == DESC;
        }
        public static final boolean isBreak(int value) {
            return (value & BASC) == BASC;
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?