multiresolver.java

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

JAVA
101
字号
/*
// $Id: //open/mondrian/src/main/mondrian/olap/fun/MultiResolver.java#11 $
// 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, Feb 12, 2003
*/
package mondrian.olap.fun;

import mondrian.olap.*;

/**
 * A <code>MultiResolver</code> considers several overloadings of the same
 * function. If one of these overloadings matches the actual arguments, it
 * calls the factory method {@link #createFunDef}.
 *
 * @author jhyde
 * @since Feb 12, 2003
 * @version $Id: //open/mondrian/src/main/mondrian/olap/fun/MultiResolver.java#11 $
 **/
abstract class MultiResolver extends FunUtil implements Resolver {
    private final String name;
    private final String description;
    private final String[] signatures;
    private final Syntax syntax;

    MultiResolver(String name,
                  String signature,
                  String description,
                  String[] signatures) {
        this.name = name;
        this.description = description;
        this.signatures = signatures;
        Util.assertTrue(signatures.length > 0);
        this.syntax = decodeSyntacticType(signatures[0]);
        for (int i = 1; i < signatures.length; i++) {
            Util.assertTrue(decodeSyntacticType(signatures[i]) == syntax);
        }
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    public Syntax getSyntax() {
        return syntax;
    }

    public String[] getReservedWords() {
        return emptyStringArray;
    }
    public String[] getSignatures() {
        return signatures;
    }

    public FunDef resolve(
            Exp[] args, Validator validator, int[] conversionCount) {
outer:
        for (int j = 0; j < signatures.length; j++) {
            int[] parameterTypes = decodeParameterTypes(signatures[j]);
            if (parameterTypes.length != args.length) {
                continue;
            }
            for (int i = 0; i < args.length; i++) {
                if (!validator.canConvert(
                        args[i], parameterTypes[i], conversionCount)) {
                    continue outer;
                }
            }
            final String signature = signatures[j];
            int returnType = decodeReturnType(signature);
            FunDef dummy = new FunDefBase(this, returnType, parameterTypes);
            return createFunDef(args, dummy);
        }
        return null;
    }

    public boolean requiresExpression(int k) {
        for (int j = 0; j < signatures.length; j++) {
            int[] parameterTypes = decodeParameterTypes(signatures[j]);
            if ((k < parameterTypes.length) &&
                    parameterTypes[k] == Category.Set) {
                return false;
            }
        }
        return true;
    }

    protected abstract FunDef createFunDef(Exp[] args, FunDef dummyFunDef);
}

// End MultiResolver.java

⌨️ 快捷键说明

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