1 34 package smallsql.database; 35 36 37 40 public class ExpressionFunctionSoundex extends ExpressionFunctionReturnP1StringAndBinary { 41 42 final int getFunction() { 43 return SQLTokenizer.SOUNDEX; 44 } 45 46 47 final boolean isNull() throws Exception { 48 return param1.isNull(); 49 } 50 51 52 final byte[] getBytes() throws Exception { 53 throw createUnspportedConversion(SQLTokenizer.BINARY); 54 } 55 56 57 final String getString() throws Exception { 58 if(isNull()) return null; 59 String input = param1.getString(); 60 return getString(input); 61 } 62 63 64 static String getString(String input){ 65 char[] output = new char[4]; 66 int idx = 0; 67 input = input.toUpperCase(); 68 if(input.length()>0){ 69 output[idx++] = input.charAt(0); 70 } 71 char last = '0'; 72 for(int i=1; idx<4 && i<input.length(); i++){ 73 char c = input.charAt(i); 74 switch(c){ 75 case 'B': 76 case 'F': 77 case 'P': 78 case 'V': 79 c = '1'; 80 break; 81 case 'C': 82 case 'G': 83 case 'J': 84 case 'K': 85 case 'Q': 86 case 'S': 87 case 'X': 88 case 'Z': 89 c = '2'; 90 break; 91 case 'D': 92 case 'T': 93 c = '3'; 94 break; 95 case 'L': 96 c = '4'; 97 break; 98 case 'M': 99 case 'N': 100 c = '5'; 101 break; 102 case 'R': 103 c = '6'; 104 break; 105 default: 106 c = '0'; 107 break; 108 } 109 if(c > '0' && last != c){ 110 output[idx++] = c; 111 } 112 last = c; 113 } 114 for(; idx<4;){ 115 output[idx++] = '0'; 116 117 } 118 return new String (output); 119 } 120 121 122 int getPrecision(){ 123 return 4; 124 } 125 } 126 | Popular Tags |