001 /*
002 // $Id: //open/mondrian-release/3.2/src/main/mondrian/olap/fun/MemberHelper.java#1 $
003 // This software is subject to the terms of the Eclipse Public License v1.0
004 // Agreement, available at the following URL:
005 // http://www.eclipse.org/legal/epl-v10.html.
006 // Copyright (C) 2003-2009 Julian Hyde and others
007 // All Rights Reserved.
008 // You must accept the terms of that agreement to use this software.
009 */
010 package mondrian.olap.fun;
011
012 import mondrian.olap.Member;
013
014 /**
015 * This helper class is used by the Distinct(<set>) function to determine
016 * whether or not elements of different types within a set are equal.
017 */
018 public class MemberHelper {
019 private final Object mObject;
020 public MemberHelper(Object entry) {
021 if ((entry == null)
022 || (entry instanceof Member)
023 || (entry instanceof Member[]))
024 {
025 mObject = entry;
026 } else {
027 throw new IllegalArgumentException("Expected Member or Member[]");
028 }
029 }
030
031 public boolean equals(Object obj) {
032 if ((obj == null) || !(obj instanceof MemberHelper)) {
033 return false;
034 } else if (this == obj) {
035 return true;
036 }
037
038 MemberHelper mh = (MemberHelper)obj;
039
040 if (this.mObject == null) {
041 return mh.mObject == null;
042 } else if (mh.mObject instanceof Member && mObject instanceof Member) {
043 return ((Member)mObject).equals(mh.mObject);
044 } else if (mh.mObject instanceof Member[]
045 && mObject instanceof Member[])
046 {
047 Member[] array1 = (Member[])mh.mObject;
048 Member[] array2 = (Member[])this.mObject;
049
050 if (array1.length != array2.length) {
051 return false;
052 }
053
054 for (int idx = 0; idx < array1.length; idx++) {
055 if (!array1[idx].equals(array2[idx])) {
056 return false;
057 }
058 }
059
060 return true;
061 } else {
062 return false;
063 }
064 }
065
066 public int hashCode() {
067 if (mObject instanceof Member) {
068 return mObject.hashCode();
069 } else if (mObject instanceof Member[]) {
070 int hash = 0;
071
072 Member[] array = (Member[]) mObject;
073
074 for (int idx = 0; idx < array.length; idx++) {
075 hash ^= array[idx].hashCode();
076 }
077
078 return hash;
079 } else {
080 return mObject.hashCode();
081 }
082 }
083 }
084
085 // End MemberHelper.java