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) 2004-2005 TONBELLER AG
008// Copyright (C) 2006-2009 Pentaho and others
009// All Rights Reserved.
010*/
011package mondrian.rolap.sql;
012
013import mondrian.rolap.*;
014import mondrian.rolap.aggmatcher.AggStar;
015
016import java.util.ArrayList;
017import java.util.List;
018
019/**
020 * Represents one of:
021 * <ul>
022 * <li>Level.Members:  member == null and level != null</li>
023 * <li>Member.Children: member != null and level =
024 *     member.getLevel().getChildLevel()</li>
025 * <li>Member.Descendants: member != null and level == some level below
026 *     member.getLevel()</li>
027 * </ul>
028 */
029public class DescendantsCrossJoinArg implements CrossJoinArg {
030    RolapMember member;
031    RolapLevel level;
032
033    public DescendantsCrossJoinArg(RolapLevel level, RolapMember member) {
034        this.level = level;
035        this.member = member;
036    }
037
038    public RolapLevel getLevel() {
039        return level;
040    }
041
042    public List<RolapMember> getMembers() {
043        if (member == null) {
044            return null;
045        }
046        final List<RolapMember> list = new ArrayList<RolapMember>();
047        list.add(member);
048        return list;
049    }
050
051    public void addConstraint(
052        SqlQuery sqlQuery,
053        RolapCube baseCube,
054        AggStar aggStar)
055    {
056        if (member != null) {
057            SqlConstraintUtils.addMemberConstraint(
058                sqlQuery, baseCube, aggStar, member, true);
059        }
060    }
061
062    public boolean isPreferInterpreter(boolean joinArg) {
063        return false;
064    }
065
066    private boolean equals(Object o1, Object o2) {
067        return o1 == null ? o2 == null : o1.equals(o2);
068    }
069
070    public boolean equals(Object obj) {
071        if (!(obj instanceof DescendantsCrossJoinArg)) {
072            return false;
073        }
074        DescendantsCrossJoinArg that = (DescendantsCrossJoinArg) obj;
075        if (!equals(this.level, that.level)) {
076            return false;
077        }
078        return equals(this.member, that.member);
079    }
080
081    public int hashCode() {
082        int c = 1;
083        if (level != null) {
084            c = level.hashCode();
085        }
086        if (member != null) {
087            c = 31 * c + member.hashCode();
088        }
089        return c;
090    }
091}
092
093// End DescendantsCrossJoinArg.java