1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.seasar.tuigwaa.database.function.criteria;
23
24
25
26 /***
27 * @author nishioka
28 */
29 public class LikeCriteriaFunction extends AbstractCriteriaFunction {
30
31 public static final String TYPE_IN = "in";
32
33 public static final String TYPE_HEAD = "head";
34
35 public static final String TYPE_TAIL = "tail";
36
37 public LikeCriteriaFunction() {
38 super();
39 }
40
41 public LikeCriteriaFunction(String field) {
42 super(field);
43 }
44
45 public LikeCriteriaFunction(String field, Object value) {
46 super(field, value);
47 }
48
49 public LikeCriteriaFunction(String field, Object value, String option) {
50 super(field, value);
51 setOption(option);
52 }
53
54 public Object evaluate(ICriteria criteria) {
55 return evaluate(criteria, getValue());
56 }
57
58 public Object evaluate(ICriteria criteria, Object value) {
59 String str = null;
60
61 String escapedValue = null;
62 if(value != null){
63 escapedValue = escapeWord(value.toString());
64 }
65
66 if(escapedValue == null || "".equals(escapedValue)){
67 str = "";
68 }else if (TYPE_HEAD.equals(getOption())) {
69 str = escapedValue + "%";
70 } else if (TYPE_TAIL.equals(getOption())) {
71 str = "%" + escapedValue;
72 } else if (TYPE_IN.equals(getOption())) {
73 str = "%" + escapedValue + "%";
74 }
75 return criteria.addLike(getField(), str);
76 }
77
78 private static final String escapeWord(String value){
79
80 if(value == null || "".equals(value)){
81 return "";
82 }
83
84 char[] c = value.toCharArray();
85 StringBuffer buf = new StringBuffer();
86 for(int i=0;i<c.length;i++){
87 if(c[i] == '%' || c[i] == '_'){
88 if(i==0 || c[i-1] != '//'){
89 buf.append('//');
90 }
91 }
92 buf.append(c[i]);
93 }
94 String ret = buf.toString();
95
96
97 return ret;
98 }
99
100
101
102 }