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