Statistics
| Revision:

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
}