mondriandimensionfilter.java

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

JAVA
182
字号
/*
// $Id: //open/mondrian/src/main/mondrian/jolap/MondrianDimensionFilter.java#4 $
// 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, Dec 24, 2002
*/
package mondrian.jolap;

import mondrian.olap.Exp;
import mondrian.olap.FunCall;
import mondrian.olap.Literal;
import mondrian.olap.Util;

import javax.olap.OLAPException;
import javax.olap.metadata.Member;
import javax.olap.query.dimensionfilters.DimensionFilter;
import javax.olap.query.dimensionfilters.DimensionInsertOffset;
import javax.olap.query.edgefilters.EdgeInsertOffset;
import javax.olap.query.enumerations.DimensionInsertOffsetType;
import javax.olap.query.enumerations.DimensionInsertOffsetTypeEnum;
import javax.olap.query.enumerations.SetActionType;
import javax.olap.query.enumerations.SetActionTypeEnum;
import javax.olap.query.querycoremodel.CompoundDimensionStep;
import javax.olap.query.querycoremodel.DimensionStepManager;
import javax.olap.query.querycoremodel.MemberInsertOffset;

/**
 * Abstract implementation of {@link DimensionFilter}.
 *
 * @author jhyde
 * @since Dec 24, 2002
 * @version $Id: //open/mondrian/src/main/mondrian/jolap/MondrianDimensionFilter.java#4 $
 **/
abstract class MondrianDimensionFilter extends MondrianDimensionStep
        implements DimensionFilter {
    private SetActionType setAction;
    private MondrianInsertOffset dimensionInsertOffset;

    MondrianDimensionFilter(MondrianDimensionStepManager manager) {
        super(manager);
    }

    protected Exp combine(Exp previousExp, Exp exp) {
        if (setAction == SetActionTypeEnum.APPEND) {
            return new FunCall("Union", new Exp[] {previousExp, exp});
        } else if (setAction == SetActionTypeEnum.DIFFERENCE) {
            return new FunCall("Minus", new Exp[] {previousExp, exp});
        } else if (setAction == SetActionTypeEnum.INITIAL) {
//          Util.assertTrue(previousExp == null);
            return exp;
        } else if (setAction == SetActionTypeEnum.INSERT) {
            // todo: Implement "Insert(<set>,<set>,<number>|<member>)" and
            return new FunCall("Insert", new Exp[] {
                previousExp, exp, dimensionInsertOffset.convert()});
        } else if (setAction == SetActionTypeEnum.INTERSECTION) {
            return new FunCall("Intersect", new Exp[] {previousExp, exp});
        } else if (setAction == SetActionTypeEnum.PREPEND) {
            return new FunCall("Union", new Exp[] {exp, previousExp});
        } else {
            throw Util.newInternal("Unknown SetAction " + setAction);
        }
    }

    // object model methods

    public SetActionType getSetAction() throws OLAPException {
        return setAction;
    }

    public void setSetAction(SetActionType input) throws OLAPException {
        this.setAction = input;
    }

    public void setDimensionInsertOffset(DimensionInsertOffset input) throws OLAPException {
        this.dimensionInsertOffset = (MondrianInsertOffset) input;
    }

    public DimensionInsertOffset getDimensionInsertOffset() throws OLAPException {
        throw new UnsupportedOperationException();
    }

    public DimensionInsertOffset createDimensionInsertOffset(DimensionInsertOffsetType type) throws OLAPException {
        if (type == DimensionInsertOffsetTypeEnum.INTEGER_INSERT_OFFSET) {
            return new MondrianIntegerInsertOffset(this);
        } else if (type == DimensionInsertOffsetTypeEnum.MEMBER_INSERT_OFFSET) {
            return new MondrianMemberInsertOffset(this);
        } else {
            throw Util.newInternal("Unknown DimensionInsertOffsetType " + type);
        }
    }

    public void setDimensionStepManager(DimensionStepManager value) throws OLAPException {
        throw new UnsupportedOperationException();
    }

    public void setCompoundDimensionStep(CompoundDimensionStep value) throws OLAPException {
        throw new UnsupportedOperationException();
    }
}

/**
 * Abstract implementation of {@link EdgeInsertOffset} and
 * base class for implementing {@link DimensionInsertOffset} and
 * {@link MemberInsertOffset}.
 */
abstract class MondrianInsertOffset extends QueryObjectSupport implements
        EdgeInsertOffset {
    private MondrianDimensionFilter dimensionFilter;

    MondrianInsertOffset(MondrianDimensionFilter dimensionFilter) {
        super(false);
        this.dimensionFilter = dimensionFilter;
    }

    public DimensionFilter getDimensionFilter() throws OLAPException {
        return dimensionFilter;
    }

    public void setDimensionFilter(DimensionFilter dimensionFilter) throws OLAPException {
        this.dimensionFilter = (MondrianDimensionFilter) dimensionFilter;
    }

    /** Converts this offset into an expression which can be used in a call to
     * the "Insert(<set>,<set>,<member>|<number>)" function. */
    abstract Exp convert();
}

/**
 * Implementation of {@link DimensionInsertOffset} for integers.
 */
class MondrianIntegerInsertOffset extends MondrianInsertOffset
        implements DimensionInsertOffset {
    Integer value;

    MondrianIntegerInsertOffset(MondrianDimensionFilter dimensionFilter) {
        super(dimensionFilter);
    }

    Exp convert() {
        return Literal.create(value);
    }

    public Integer getValue() throws OLAPException {
        return value;
    }

    public void setValue(Integer input) throws OLAPException {
        this.value = input;
    }
}

/**
 * Implementation of {@link MemberInsertOffset}.
 */
class MondrianMemberInsertOffset extends MondrianInsertOffset
        implements MemberInsertOffset {
    Member member;

    MondrianMemberInsertOffset(MondrianDimensionFilter dimensionFilter) {
        super(dimensionFilter);
    }

    Exp convert() {
        return ((MondrianJolapMember) member).member;
    }

    public Member getMember() throws OLAPException {
        return member;
    }

    public void setMember(Member input) throws OLAPException {
        this.member = input;
    }
}

// End MondrianDimensionFilter.java

⌨️ 快捷键说明

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