tuplefundef.java

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

JAVA
98
字号
/*
// $Id: //open/mondrian/src/main/mondrian/olap/fun/TupleFunDef.java#10 $
// 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 2002-2005 Kana Software, Inc. and others.
// All Rights Reserved.
// You must accept the terms of that agreement to use this software.
//
// jhyde, 3 March, 2002
*/
package mondrian.olap.fun;
import mondrian.olap.*;
import mondrian.olap.type.*;
import mondrian.resource.MondrianResource;

import java.io.PrintWriter;

/**
 * <code>TupleFunDef</code> implements the '( ... )' operator which builds
 * tuples, as in <code>([Time].CurrentMember,
 * [Stores].[USA].[California])</code>.
 *
 * @author jhyde
 * @since 3 March, 2002
 * @version $Id: //open/mondrian/src/main/mondrian/olap/fun/TupleFunDef.java#10 $
 **/
class TupleFunDef extends FunDefBase {
    private final int[] argTypes;

    TupleFunDef(int[] argTypes) {
        super(
            "()",
            "(<Member> [, <Member>]...)",
            "Parenthesis operator constructs a tuple.  If there is only one member, the expression is equivalent to the member expression.",
            Syntax.Parentheses,
            Category.Tuple,
            argTypes);
        this.argTypes = argTypes;
    }
    public int getReturnCategory() {
        return Category.Tuple;
    }
    public int[] getParameterTypes() {
        return argTypes;
    }
    public void unparse(Exp[] args, PrintWriter pw) {
        ExpBase.unparseList(pw, args, "(", ", ", ")");
    }

    public Type getResultType(Validator validator, Exp[] args) {
        // _Tuple(<Member1>[,<MemberI>]...), which is written
        // (<Member1>[,<MemberI>]...), has type [Hie1] x ... x [HieN].
        //
        // If there is only one member, it merely represents a parenthesized
        // expression, whose Hierarchy is that of the member.
        if (args.length == 1) {
            return TypeUtil.toMemberType(args[0].getTypeX());
        } else {
            Type[] types = new Type[args.length];
            for (int i = 0; i < args.length; i++) {
                Exp arg = args[i];
                types[i] = TypeUtil.toMemberType(arg.getTypeX());
            }
            return new TupleType(types);
        }
    }

    public Object evaluate(Evaluator evaluator, Exp[] args) {
        Member[] members = new Member[args.length];
        for (int i = 0; i < args.length; i++) {
            Member member = getMemberArg(evaluator, args, i, true);
            if (member == null ||
                    member.isNull()) {
                return null;
            }
            members[i] = member;
        }
        checkDimensions(members);
        return members;
    }

    private void checkDimensions(Member[] members) {
        for (int i = 0; i < members.length; i++) {
            Member member = members[i];
            for (int j = 0; j < i; j++) {
                Member member1 = members[j];
                if (member.getDimension() == member1.getDimension()) {
                    throw MondrianResource.instance().DupDimensionsInTuple.ex(
                            member.getDimension().getUniqueName());
                }
            }
        }
    }
}

// End TupleFunDef.java

⌨️ 快捷键说明

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