1 10 11 package mondrian.olap.fun; 12 13 import mondrian.olap.FunDef; 14 import mondrian.olap.Syntax; 15 16 import java.util.*; 17 import java.lang.reflect.Array ; 18 19 26 public class FunInfo implements Comparable <FunInfo> { 27 private final Syntax syntax; 28 private final String name; 29 private final String description; 30 private final int[] returnTypes; 31 private final int[][] parameterTypes; 32 private String [] sigs; 33 34 static FunInfo make(Resolver resolver) { 35 FunDef funDef = resolver.getFunDef(); 36 if (funDef != null) { 37 return new FunInfo(funDef); 38 } else if (resolver instanceof MultiResolver) { 39 return new FunInfo((MultiResolver) resolver); 40 } else { 41 return new FunInfo(resolver); 42 } 43 } 44 45 FunInfo(FunDef funDef) { 46 this.syntax = funDef.getSyntax(); 47 this.name = funDef.getName(); 48 this.returnTypes = new int[] { funDef.getReturnCategory() }; 49 this.parameterTypes = new int[][] { funDef.getParameterCategories() }; 50 this.sigs = makeSigs(syntax, name, returnTypes, parameterTypes); 51 this.description = funDef.getDescription(); 52 } 53 54 FunInfo(MultiResolver multiResolver) { 55 this.syntax = multiResolver.getSyntax(); 56 this.name = multiResolver.getName(); 57 this.description = multiResolver.getDescription(); 58 59 String [] signatures = multiResolver.getSignatures(); 60 this.returnTypes = new int[signatures.length]; 61 this.parameterTypes = new int[signatures.length][]; 62 for (int i = 0; i < signatures.length; i++) { 63 returnTypes[i] = FunUtil.decodeReturnCategory(signatures[i]); 64 parameterTypes[i] = FunUtil.decodeParameterCategories(signatures[i]); 65 } 66 this.sigs = makeSigs(syntax, name, returnTypes, parameterTypes); 67 } 68 69 FunInfo(Resolver resolver) { 70 this.syntax = resolver.getSyntax(); 71 this.name = resolver.getName(); 72 this.description = resolver.getDescription(); 73 this.returnTypes = null; 74 this.parameterTypes = null; 75 final String signature = resolver.getSignature(); 76 this.sigs = signature == null ? new String [0] : 77 new String [] {signature}; 78 } 79 80 public String [] getSignatures() { 81 return sigs; 82 } 83 84 private static String [] makeSigs( 85 Syntax syntax, 86 String name, int[] returnTypes, int[][] parameterTypes) { 87 if (parameterTypes == null) { 88 return null; 89 } 90 91 String [] sigs = new String [parameterTypes.length]; 92 for (int i = 0; i < sigs.length; i++) { 93 sigs[i] = syntax.getSignature( 94 name, returnTypes[i], parameterTypes[i]); 95 } 96 return sigs; 97 } 98 99 102 public Syntax getSyntax() { 103 return this.syntax; 104 } 105 106 109 public String getName() { 110 return this.name; 111 } 112 113 116 public String getDescription() { 117 return this.description; 118 } 119 120 124 public int[] getReturnCategories() { 125 return this.returnTypes; 126 } 127 128 135 public int[][] getParameterCategories() { 136 return this.parameterTypes; 137 } 138 139 public int compareTo(FunInfo fi) { 140 int c = this.name.compareTo(fi.name); 141 if (c != 0) { 142 return c; 143 } 144 final List pcList = toList(this.getParameterCategories()); 145 final String pc = pcList.toString(); 146 final List otherPcList = toList(fi.getParameterCategories()); 147 final String otherPc = otherPcList.toString(); 148 return pc.compareTo(otherPc); 149 } 150 151 private static List toList(Object a) { 152 final List<Object > list = new ArrayList<Object >(); 153 if (a == null) { 154 return list; 155 } 156 final int length = Array.getLength(a); 157 for (int i = 0; i < length; i++) { 158 final Object o = Array.get(a, i); 159 if (o.getClass().isArray()) { 160 list.add(toList(o)); 161 } else { 162 list.add(o); 163 } 164 } 165 return list; 166 } 167 } 168 169 | Popular Tags |