1 12 package mondrian.olap.fun; 13 14 import mondrian.olap.*; 15 16 25 public abstract class MultiResolver extends FunUtil implements Resolver { 26 private final String name; 27 private final String signature; 28 private final String description; 29 private final String [] signatures; 30 private final Syntax syntax; 31 32 48 protected MultiResolver( 49 String name, 50 String signature, 51 String description, 52 String [] signatures) { 53 this.name = name; 54 this.signature = signature; 55 this.description = description; 56 this.signatures = signatures; 57 Util.assertTrue(signatures.length > 0); 58 this.syntax = decodeSyntacticType(signatures[0]); 59 for (int i = 1; i < signatures.length; i++) { 60 Util.assertTrue(decodeSyntacticType(signatures[i]) == syntax); 61 } 62 } 63 64 public String getName() { 65 return name; 66 } 67 68 public String getDescription() { 69 return description; 70 } 71 72 public String getSignature() { 73 return signature; 74 } 75 76 public Syntax getSyntax() { 77 return syntax; 78 } 79 80 public String [] getReservedWords() { 81 return emptyStringArray; 82 } 83 84 public String [] getSignatures() { 85 return signatures; 86 } 87 88 public FunDef getFunDef() { 89 return null; 90 } 91 92 public FunDef resolve( 93 Exp[] args, Validator validator, int[] conversionCount) 94 { 95 outer: 96 for (String signature : signatures) { 97 int[] parameterTypes = decodeParameterCategories(signature); 98 if (parameterTypes.length != args.length) { 99 continue; 100 } 101 for (int i = 0; i < args.length; i++) { 102 if (!validator.canConvert( 103 args[i], parameterTypes[i], conversionCount)) { 104 continue outer; 105 } 106 } 107 int returnType = decodeReturnCategory(signature); 108 FunDef dummy = createDummyFunDef(this, returnType, args); 109 return createFunDef(args, dummy); 110 } 111 return null; 112 } 113 114 public boolean requiresExpression(int k) { 115 for (String signature : signatures) { 116 int[] parameterTypes = decodeParameterCategories(signature); 117 if ((k < parameterTypes.length) && 118 parameterTypes[k] == Category.Set) { 119 return false; 120 } 121 } 122 return true; 123 } 124 125 protected abstract FunDef createFunDef(Exp[] args, FunDef dummyFunDef); 126 } 127 128 | Popular Tags |