root / trunk / libraries / libGDBMS / src / main / java / com / hardcode / gdbms / engine / instruction / Utilities.java @ 10627
History | View | Annotate | Download (9.93 KB)
1 |
package com.hardcode.gdbms.engine.instruction; |
---|---|
2 |
|
3 |
import java.util.HashMap; |
4 |
|
5 |
import com.hardcode.gdbms.engine.data.DataSourceFactory; |
6 |
import com.hardcode.gdbms.parser.ASTSQLAndExpr; |
7 |
import com.hardcode.gdbms.parser.ASTSQLBetweenClause; |
8 |
import com.hardcode.gdbms.parser.ASTSQLColRef; |
9 |
import com.hardcode.gdbms.parser.ASTSQLCompareExpr; |
10 |
import com.hardcode.gdbms.parser.ASTSQLCompareExprRight; |
11 |
import com.hardcode.gdbms.parser.ASTSQLCompareOp; |
12 |
import com.hardcode.gdbms.parser.ASTSQLCustom; |
13 |
import com.hardcode.gdbms.parser.ASTSQLExistsClause; |
14 |
import com.hardcode.gdbms.parser.ASTSQLFunction; |
15 |
import com.hardcode.gdbms.parser.ASTSQLFunctionArgs; |
16 |
import com.hardcode.gdbms.parser.ASTSQLInClause; |
17 |
import com.hardcode.gdbms.parser.ASTSQLIsClause; |
18 |
import com.hardcode.gdbms.parser.ASTSQLLValueElement; |
19 |
import com.hardcode.gdbms.parser.ASTSQLLValueList; |
20 |
import com.hardcode.gdbms.parser.ASTSQLLikeClause; |
21 |
import com.hardcode.gdbms.parser.ASTSQLLiteral; |
22 |
import com.hardcode.gdbms.parser.ASTSQLLvalue; |
23 |
import com.hardcode.gdbms.parser.ASTSQLLvalueTerm; |
24 |
import com.hardcode.gdbms.parser.ASTSQLNotExpr; |
25 |
import com.hardcode.gdbms.parser.ASTSQLOrExpr; |
26 |
import com.hardcode.gdbms.parser.ASTSQLOrderBy; |
27 |
import com.hardcode.gdbms.parser.ASTSQLOrderByElem; |
28 |
import com.hardcode.gdbms.parser.ASTSQLOrderByList; |
29 |
import com.hardcode.gdbms.parser.ASTSQLOrderDirection; |
30 |
import com.hardcode.gdbms.parser.ASTSQLProductExpr; |
31 |
import com.hardcode.gdbms.parser.ASTSQLSelect; |
32 |
import com.hardcode.gdbms.parser.ASTSQLSelectCols; |
33 |
import com.hardcode.gdbms.parser.ASTSQLSelectList; |
34 |
import com.hardcode.gdbms.parser.ASTSQLSumExpr; |
35 |
import com.hardcode.gdbms.parser.ASTSQLTableList; |
36 |
import com.hardcode.gdbms.parser.ASTSQLTableRef; |
37 |
import com.hardcode.gdbms.parser.ASTSQLTerm; |
38 |
import com.hardcode.gdbms.parser.ASTSQLUnaryExpr; |
39 |
import com.hardcode.gdbms.parser.ASTSQLUnion; |
40 |
import com.hardcode.gdbms.parser.ASTSQLWhere; |
41 |
import com.hardcode.gdbms.parser.Node; |
42 |
import com.hardcode.gdbms.parser.SimpleNode; |
43 |
import com.hardcode.gdbms.parser.Token; |
44 |
|
45 |
|
46 |
/**
|
47 |
* Clase con distintos m?todos de utilidad
|
48 |
*
|
49 |
* @author Fernando Gonz?lez Cort?s
|
50 |
*/
|
51 |
public class Utilities { |
52 |
private static HashMap adapters = new HashMap(); |
53 |
|
54 |
static {
|
55 |
adapters.put(ASTSQLAndExpr.class, AndExprAdapter.class); |
56 |
adapters.put(ASTSQLCompareExpr.class, CompareExprAdapter.class); |
57 |
adapters.put(ASTSQLNotExpr.class, NotExprAdapter.class); |
58 |
adapters.put(ASTSQLOrExpr.class, OrExprAdapter.class); |
59 |
adapters.put(ASTSQLProductExpr.class, ProductExprAdapter.class); |
60 |
adapters.put(ASTSQLSelect.class, SelectAdapter.class); |
61 |
adapters.put(ASTSQLSumExpr.class, SumExprAdapter.class); |
62 |
adapters.put(ASTSQLTerm.class, TermAdapter.class); |
63 |
adapters.put(ASTSQLUnaryExpr.class, UnaryExprAdapter.class); |
64 |
adapters.put(ASTSQLUnion.class, UnionAdapter.class); |
65 |
adapters.put(ASTSQLCompareExprRight.class, CompareExprRigthAdapter.class); |
66 |
adapters.put(ASTSQLCompareOp.class, CompareOpAdapter.class); |
67 |
adapters.put(ASTSQLCustom.class, CustomAdapter.class); |
68 |
adapters.put(ASTSQLLikeClause.class, LikeClauseAdapter.class); |
69 |
adapters.put(ASTSQLInClause.class, InClauseAdapter.class); |
70 |
adapters.put(ASTSQLBetweenClause.class, BetweenClauseAdapter.class); |
71 |
adapters.put(ASTSQLIsClause.class, IsClauseAdapter.class); |
72 |
adapters.put(ASTSQLExistsClause.class, ExistsClauseAdapter.class); |
73 |
adapters.put(ASTSQLFunction.class, FunctionAdapter.class); |
74 |
adapters.put(ASTSQLFunctionArgs.class, FunctionArgsAdapter.class); |
75 |
adapters.put(ASTSQLLiteral.class, LiteralAdapter.class); |
76 |
adapters.put(ASTSQLColRef.class, ColRefAdapter.class); |
77 |
adapters.put(ASTSQLLvalue.class, LValueAdapter.class); |
78 |
adapters.put(ASTSQLLValueElement.class, LValueElementAdapter.class); |
79 |
adapters.put(ASTSQLLValueList.class, LValueListAdapter.class); |
80 |
adapters.put(ASTSQLLvalueTerm.class, LValueTermAdapter.class); |
81 |
adapters.put(ASTSQLOrderBy.class, OrderByAdapter.class); |
82 |
adapters.put(ASTSQLOrderByList.class, OrderByListAdapter.class); |
83 |
adapters.put(ASTSQLOrderByElem.class, OrderByElemAdapter.class); |
84 |
adapters.put(ASTSQLOrderDirection.class, OrderDirectionAdapter.class); |
85 |
adapters.put(ASTSQLSelectCols.class, SelectColsAdapter.class); |
86 |
adapters.put(ASTSQLSelectList.class, SelectListAdapter.class); |
87 |
adapters.put(ASTSQLTableList.class, TableListAdapter.class); |
88 |
adapters.put(ASTSQLTableRef.class, TableRefAdapter.class); |
89 |
adapters.put(ASTSQLWhere.class, WhereAdapter.class); |
90 |
} |
91 |
|
92 |
/**
|
93 |
* Obtienen el tipo de un nodo del arbol sint?ctico de entrada en caso de
|
94 |
* que dicho nodo tenga un solo token. Si el nodo tiene varios token's se
|
95 |
* devuelve un -1
|
96 |
*
|
97 |
* @param n Nodo cuyo tipo se quiere conocer
|
98 |
*
|
99 |
* @return Tipo del token del nodo. Una constante de la interfaz
|
100 |
* SQLEngineConstants
|
101 |
*/
|
102 |
public static int getType(Node n) { |
103 |
SimpleNode node = (SimpleNode) n; |
104 |
|
105 |
if (node.first_token == node.last_token) {
|
106 |
return node.first_token.kind;
|
107 |
} |
108 |
|
109 |
return -1; |
110 |
} |
111 |
|
112 |
/**
|
113 |
* Obtiene el texto de un nodo
|
114 |
*
|
115 |
* @param n Nodo del cual se quiere obtener el texto
|
116 |
*
|
117 |
* @return Texto del nodo
|
118 |
*/
|
119 |
public static String getText(Node n) { |
120 |
return getText((SimpleNode) n);
|
121 |
} |
122 |
|
123 |
/**
|
124 |
* Obtiene el texto de un nodo
|
125 |
*
|
126 |
* @param s Nodo del cual se quiere obtener el texto
|
127 |
*
|
128 |
* @return Texto del nodo
|
129 |
*/
|
130 |
public static String getText(SimpleNode s) { |
131 |
String ret = ""; |
132 |
|
133 |
for (Token tok = s.first_token; tok != s.last_token.next;
|
134 |
tok = tok.next) { |
135 |
ret += (" " + tok.image);
|
136 |
} |
137 |
|
138 |
return ret.trim();
|
139 |
} |
140 |
|
141 |
/**
|
142 |
* Construye un arbol de adaptadores correspondiente al arbol sint?ctico
|
143 |
* cuya raiz es el nodo que se pasa como par?metro. El ?rbol se construir?
|
144 |
* mientras se encuentren clases adaptadoras. En el momento que no se
|
145 |
* encuentre la clase adaptadora de un nodo no se seguir? profundizando
|
146 |
* por esa rama. Despues de la construcci?n del arbol se invoca el
|
147 |
* m?todo calculateLiteralCondition de todos los adaptadores del arbol
|
148 |
* que sean instancias de Expression
|
149 |
*
|
150 |
* @param root Nodo raiz
|
151 |
* @param sql DOCUMENT ME!
|
152 |
* @param ds DOCUMENT ME!
|
153 |
*
|
154 |
* @return Adaptador raiz
|
155 |
*/
|
156 |
public static Adapter buildTree(Node root, String sql, DataSourceFactory ds) { |
157 |
Adapter rootAdapter = recursiveBuildTree(root); |
158 |
rootAdapter.setInstructionContext(new InstructionContext());
|
159 |
rootAdapter.getInstructionContext().setSql(sql); |
160 |
rootAdapter.getInstructionContext().setDSFActory(ds); |
161 |
|
162 |
return rootAdapter;
|
163 |
} |
164 |
|
165 |
/**
|
166 |
* M?todo recursivo para la creaci?n del arbol de adaptadores
|
167 |
*
|
168 |
* @param root raiz del sub?rbol
|
169 |
*
|
170 |
* @return raiz del arbol creado o null si no se encuentra la clase
|
171 |
* adaptadora
|
172 |
*/
|
173 |
private static Adapter recursiveBuildTree(Node root) { |
174 |
Adapter a; |
175 |
|
176 |
try {
|
177 |
a = getAdapter(root); |
178 |
} catch (Exception e) { |
179 |
//e.printStackTrace();
|
180 |
//No se encontr? la clase adaptadora
|
181 |
return null; |
182 |
} |
183 |
|
184 |
a.setEntity(root); |
185 |
|
186 |
Adapter[] childs = new Adapter[root.jjtGetNumChildren()]; |
187 |
int index = 0; |
188 |
for (int i = 0; i < root.jjtGetNumChildren(); i++) { |
189 |
Adapter child = recursiveBuildTree(root.jjtGetChild(i)); |
190 |
|
191 |
if (child != null) { |
192 |
child.setParent(a); |
193 |
|
194 |
//Se encontr? la clase adaptadora
|
195 |
childs[index] = child; |
196 |
index++; |
197 |
} |
198 |
} |
199 |
Adapter[] trueChilds = new Adapter[index]; |
200 |
if (index != root.jjtGetNumChildren()) {
|
201 |
System.arraycopy(childs, 0, trueChilds, 0, index); |
202 |
a.setChilds(trueChilds); |
203 |
} else {
|
204 |
a.setChilds(childs); |
205 |
} |
206 |
|
207 |
return a;
|
208 |
} |
209 |
|
210 |
/**
|
211 |
* Obtiene una instancia nueva de la clase adaptadora de un nodo
|
212 |
*
|
213 |
* @param node nodo de cual se quiere obtener la clase adaptadora
|
214 |
*
|
215 |
* @return instancia de la clase adaptadora
|
216 |
*
|
217 |
* @throws InstantiationException Si no se puede instanciar la clase
|
218 |
* @throws IllegalAccessException Si no se puede acceder a la clase
|
219 |
*/
|
220 |
private static Adapter getAdapter(Node node) |
221 |
throws InstantiationException, IllegalAccessException { |
222 |
return (Adapter) ((Class) adapters.get(node.getClass())).newInstance(); |
223 |
} |
224 |
|
225 |
/**
|
226 |
* Dada una clase devuelve el nombre de dicha clase sin el texto
|
227 |
* correspondiente al paquete
|
228 |
*
|
229 |
* @param clase Clase cuyo nombre se quiere conocer
|
230 |
*
|
231 |
* @return nombre de la clase
|
232 |
*/
|
233 |
private static String getClassName(Class clase) { |
234 |
String nombre = clase.getName();
|
235 |
|
236 |
return nombre.substring(nombre.lastIndexOf('.') + 1); |
237 |
} |
238 |
|
239 |
/**
|
240 |
* Devuelve true si todas las expresiones que se pasan en el array son
|
241 |
* literales
|
242 |
*
|
243 |
* @param childs conjunto de adaptadores
|
244 |
*
|
245 |
* @return true si se cumple que para cada elemento del array childs que es
|
246 |
* Expresion, es literal
|
247 |
*/
|
248 |
public static boolean checkExpressions(Adapter[] childs) { |
249 |
for (int i = 0; i < childs.length; i++) { |
250 |
if (!(childs[i] instanceof Expression)) { |
251 |
continue;
|
252 |
} |
253 |
|
254 |
if (!((Expression) childs[i]).isLiteral()) { |
255 |
return false; |
256 |
} |
257 |
} |
258 |
|
259 |
return true; |
260 |
} |
261 |
|
262 |
/*
|
263 |
* Establece las tablas de la instrucci?n y la fuente de datos resultante
|
264 |
* de la cl?usula from
|
265 |
*
|
266 |
* @param root raiz del arbol de adaptadores donde se aplicar? el m?todo
|
267 |
* @param tables tablas de la clausula from
|
268 |
* @param source fuente de datos de la que obtiene los valores los objetos
|
269 |
* field, resultado de la clausula from
|
270 |
*
|
271 |
public static void setTablesAndSource(Adapter root, DataSource[] tables,
|
272 |
DataSource source) {
|
273 |
if (root instanceof FieldSupport) {
|
274 |
FieldSupport fs = (FieldSupport) root;
|
275 |
fs.setDataSource(source);
|
276 |
fs.setTables(tables);
|
277 |
}
|
278 |
Adapter[] hijos = root.getChilds();
|
279 |
for (int i = 0; i < hijos.length; i++) {
|
280 |
setTablesAndSource(hijos[i], tables, source);
|
281 |
}
|
282 |
}*
|
283 |
public static void setTablesAndSource(Adapter root, DataSource table, DataSource source){
|
284 |
setTablesAndSource(root, new DataSource[]{table}, source);
|
285 |
}
|
286 |
*/
|
287 |
|
288 |
/**
|
289 |
* Simplifica las expresiones del ?rbol de adaptadores
|
290 |
*
|
291 |
* @param root raiz del arbol que se simplifica
|
292 |
*/
|
293 |
public static void simplify(Adapter root) { |
294 |
if (root instanceof Expression) { |
295 |
Expression ex = (Expression) root; |
296 |
ex.simplify(); |
297 |
} |
298 |
|
299 |
Adapter[] hijos = root.getChilds();
|
300 |
|
301 |
for (int i = 0; i < hijos.length; i++) { |
302 |
simplify(hijos[i]); |
303 |
} |
304 |
} |
305 |
} |