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