1
22
23 package com.liferay.portal.dao.orm.common;
24
25 import com.liferay.portal.kernel.log.Log;
26 import com.liferay.portal.kernel.log.LogFactoryUtil;
27 import com.liferay.portal.kernel.util.StringPool;
28 import com.liferay.portal.tools.sql.DBUtil;
29 import com.liferay.portal.util.PropsValues;
30
31 import java.util.HashMap;
32 import java.util.Map;
33
34
39 public class SQLTransformer {
40
41 public static String transform(String sql) {
42 return _instance._transform(sql);
43 }
44
45 private SQLTransformer() {
46 _sqlMap = new HashMap<String, String>();
47
48 DBUtil dbUtil = DBUtil.getInstance();
49
50 if (dbUtil.getType().equals(DBUtil.TYPE_MYSQL)) {
51 _vendorMySQL = true;
52 }
53 }
54
55 private String _removeLower(String sql) {
56 int x = sql.indexOf(_LOWER_OPEN);
57
58 if (x == -1) {
59 return sql;
60 }
61
62 String newSQL = _sqlMap.get(sql);
63
64 if (newSQL != null) {
65 return newSQL;
66 }
67
68 StringBuilder sb = new StringBuilder(sql.length());
69
70 int y = 0;
71
72 while (true) {
73 sb.append(sql.substring(y, x));
74
75 y = sql.indexOf(_LOWER_CLOSE, x);
76
77 if (y == -1) {
78 sb.append(sql.substring(x));
79
80 break;
81 }
82
83 sb.append(sql.substring(x + _LOWER_OPEN.length(), y));
84
85 y++;
86
87 x = sql.indexOf(_LOWER_OPEN, y);
88
89 if (x == -1) {
90 sb.append(sql.substring(y));
91
92 break;
93 }
94 }
95
96 newSQL = sb.toString();
97
98 if (_log.isDebugEnabled()) {
99 _log.debug("Original SQL " + sql);
100 _log.debug("Modified SQL " + newSQL);
101 }
102
103 _sqlMap.put(sql, newSQL);
104
105 return newSQL;
106 }
107
108 private String _transform(String sql) {
109 if (sql == null) {
110 return sql;
111 }
112
113 if (_vendorMySQL &&
114 !PropsValues.DATABASE_MYSQL_FUNCTION_LOWER_ENABLED) {
115
116 sql = _removeLower(sql);
117 }
118
119 return sql;
120 }
121
122 private static final String _LOWER_CLOSE = StringPool.CLOSE_PARENTHESIS;
123
124 private static final String _LOWER_OPEN = "lower(";
125
126 private static Log _log = LogFactoryUtil.getLog(SQLTransformer.class);
127
128 private static SQLTransformer _instance = new SQLTransformer();
129
130 private Map<String, String> _sqlMap;
131 private boolean _vendorMySQL;
132
133 }