001/*
002// This software is subject to the terms of the Eclipse Public License v1.0
003// Agreement, available at the following URL:
004// http://www.eclipse.org/legal/epl-v10.html.
005// You must accept the terms of that agreement to use this software.
006//
007// Copyright (C) 2006-2009 Pentaho
008// All Rights Reserved.
009*/
010package mondrian.olap.fun;
011
012import mondrian.calc.*;
013import mondrian.calc.impl.AbstractCalc;
014import mondrian.mdx.ResolvedFunCall;
015import mondrian.olap.Evaluator;
016import mondrian.olap.Exp;
017
018/**
019 * Definition of the <code>&lt;Member&gt;.OrderKey</code> MDX builtin
020 * function.
021 *
022 * <p>Syntax:
023 * <blockquote><code>&lt;Member&gt;.OrderKey</code></blockquote>
024 *
025 * @author kvu
026 * @since Nov 10, 2008
027 */
028public final class MemberOrderKeyFunDef extends FunDefBase {
029    static final MemberOrderKeyFunDef instance =
030        new MemberOrderKeyFunDef();
031
032    /**
033     * Creates the singleton MemberOrderKeyFunDef.
034     */
035    private MemberOrderKeyFunDef() {
036        super(
037            "OrderKey", "Returns the member order key.", "pvm");
038    }
039
040    public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
041        final MemberCalc memberCalc =
042                compiler.compileMember(call.getArg(0));
043        return new CalcImpl(call, memberCalc);
044    }
045
046    public static class CalcImpl extends AbstractCalc {
047        private final MemberCalc memberCalc;
048
049        /**
050         * Creates a CalcImpl.
051         *
052         * @param exp Source expression
053         * @param memberCalc Compiled expression to calculate member
054         */
055        public CalcImpl(Exp exp, MemberCalc memberCalc) {
056            super(exp, new Calc[] {memberCalc});
057            this.memberCalc = memberCalc;
058        }
059
060        public OrderKey evaluate(Evaluator evaluator) {
061            return new OrderKey(memberCalc.evaluateMember(evaluator));
062        }
063
064        protected String getName() {
065            return "OrderKey";
066        }
067    }
068}
069
070// End MemberOrderKeyFunDef.java