1 28 29 package com.caucho.amber.expr.fun; 30 31 import com.caucho.amber.expr.AmberExpr; 32 import com.caucho.amber.query.QueryParser; 33 import com.caucho.util.CharBuffer; 34 import com.caucho.util.L10N; 35 36 import java.util.ArrayList ; 37 38 39 42 public class LocateFunExpr extends FunExpr { 43 private static final L10N L = new L10N(LocateFunExpr.class); 44 45 48 protected LocateFunExpr(QueryParser parser, 49 ArrayList <AmberExpr> args) 50 { 51 super(parser, "locate", args, false); 52 } 53 54 public static FunExpr create(QueryParser parser, 55 ArrayList <AmberExpr> args) 56 { 57 return new LocateFunExpr(parser, args); 58 } 59 60 63 public void generateWhere(CharBuffer cb) 64 { 65 generateInternalWhere(cb, true); 66 } 67 68 71 public void generateUpdateWhere(CharBuffer cb) 72 { 73 generateInternalWhere(cb, false); 74 } 75 76 79 void generateInternalWhere(CharBuffer cb, 80 boolean select) 81 { 82 84 ArrayList <AmberExpr> args = getArgs(); 85 86 int n = args.size(); 87 88 95 if (_parser.isDerbyDBMS()) { 96 97 99 cb.append("locate("); 100 101 if (select) 102 args.get(0).generateWhere(cb); 103 else 104 args.get(0).generateUpdateWhere(cb); 105 106 cb.append(','); 107 108 if (select) 109 args.get(1).generateWhere(cb); 110 else 111 args.get(1).generateUpdateWhere(cb); 112 113 cb.append(','); 114 115 if (n == 2) { 116 cb.append('1'); 117 } 118 else { 119 AmberExpr expr = args.get(2); 120 121 if (select) 122 expr.generateWhere(cb); 123 else 124 expr.generateUpdateWhere(cb); 125 } 126 127 cb.append(')'); 128 129 return; 130 } 131 132 134 CharBuffer charBuffer = new CharBuffer(); 135 136 charBuffer.append("position("); 137 138 if (select) 139 args.get(0).generateWhere(charBuffer); 140 else 141 args.get(0).generateUpdateWhere(charBuffer); 142 143 charBuffer.append(" in substring("); 144 145 if (select) 146 args.get(1).generateWhere(charBuffer); 147 else 148 args.get(1).generateUpdateWhere(charBuffer); 149 150 charBuffer.append(','); 151 152 int fromIndex = 1; 153 154 AmberExpr expr = null; 155 156 if (n == 2) { 157 charBuffer.append('1'); 158 } 159 else { 160 expr = args.get(2); 161 162 try { 163 fromIndex = Integer.parseInt(expr.toString()); 164 } catch (Exception ex) { 165 } 168 169 if (select) 170 expr.generateWhere(charBuffer); 171 else 172 expr.generateUpdateWhere(charBuffer); 173 } 174 175 charBuffer.append(",length("); 176 177 if (select) 178 args.get(1).generateWhere(charBuffer); 179 else 180 args.get(1).generateUpdateWhere(charBuffer); 181 182 charBuffer.append(")))"); 183 184 cb.append("case when "); 185 cb.append(charBuffer); 186 cb.append(" <= 0 then 0 else "); 187 cb.append(charBuffer); 188 189 if (fromIndex > 1) { 190 191 cb.append('+'); 192 193 cb.append(fromIndex-1); 194 } 195 196 cb.append(" end"); 197 } 198 } 199 | Popular Tags |