KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > TestMedorCompiler


1 /**
2  * MEDOR: Middleware Enabling Distributed Object Requests
3  *
4  * Copyright (C) 2001-2004 France Telecom R&D
5  * Contact: alexandre.lefebvre@rd.francetelecom.com
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  *
21  * Initial developers: M. Alia, A. Lefebvre
22  */

23 import org.objectweb.medor.api.MedorException;
24 import org.objectweb.medor.datasource.api.DataStore;
25 import org.objectweb.medor.datasource.lib.BasicDataStore;
26 import org.objectweb.medor.eval.api.ConnectionResources;
27 import org.objectweb.medor.eval.api.QueryEvaluator;
28 import org.objectweb.medor.eval.lib.MedorEvaluator;
29 import org.objectweb.medor.expression.api.ParameterOperand;
30 import org.objectweb.medor.expression.api.Expression;
31 import org.objectweb.medor.expression.api.ExpressionException;
32 import org.objectweb.medor.filter.api.FieldOperand;
33 import org.objectweb.medor.filter.lib.BasicFieldOperand;
34 import org.objectweb.medor.expression.lib.BasicParameterOperand;
35 import org.objectweb.medor.expression.lib.Lower;
36 import org.objectweb.medor.expression.lib.Minus;
37 import org.objectweb.medor.expression.lib.Plus;
38 import org.objectweb.medor.expression.lib.BasicOperand;
39 import org.objectweb.medor.optim.api.ExecPlanGenerator;
40 import org.objectweb.medor.optim.lib.IndexesGenerator;
41 import org.objectweb.medor.optim.lib.SourceCodeGeneratorCompiler;
42 import org.objectweb.medor.query.api.CalculatedField;
43 import org.objectweb.medor.query.api.PropagatedField;
44 import org.objectweb.medor.query.api.QueryLeaf;
45 import org.objectweb.medor.query.api.QueryTree;
46 import org.objectweb.medor.query.api.QueryTreeField;
47 import org.objectweb.medor.query.lib.SelectProject;
48 import org.objectweb.medor.query.rdb.api.QualifiedTable;
49 import org.objectweb.medor.query.rdb.api.RdbField;
50 import org.objectweb.medor.query.rdb.api.RdbStringQueryLeaf;
51 import org.objectweb.medor.query.rdb.lib.BasicQualifiedTable;
52 import org.objectweb.medor.query.rdb.lib.BasicRdbStringQueryLeaf;
53 import org.objectweb.medor.tuple.api.TupleCollection;
54 import org.objectweb.medor.type.lib.PTypeSpaceMedor;
55
56 import java.io.File JavaDoc;
57 import java.sql.Connection JavaDoc;
58 import java.sql.SQLException JavaDoc;
59
60 public class TestMedorCompiler {
61     public static void main(String JavaDoc arg[])
62             throws ExpressionException, MedorException, SQLException JavaDoc {
63         //Creating a QueryTree...
64
// THE URL OF THE DATA BASE
65
String JavaDoc dbURL = new String JavaDoc("jdbc:idb:c:/EnhydraDB/Examples/sample.prp");
66         // THE SQL STRING QUERY
67
String JavaDoc sqlQuery1 = new String JavaDoc("SELECT * FROM Sample$db$Cols");
68         // THE SQL STRING QUERY
69
String JavaDoc sqlQuery2 = new String JavaDoc("SELECT * FROM Sample$db$Cols$pKey");
70
71         DataStore ds = new BasicDataStore(DataStore.JDBC_STORE, "sample.prp");
72         QualifiedTable table1 = new BasicQualifiedTable("sample$db$Cols", "sampledbCols");
73
74         // We creates a QueryLeaf with an empty TupleStructure
75
RdbStringQueryLeaf sqlLeaf = new BasicRdbStringQueryLeaf(ds, sqlQuery1, "");
76
77         // Adding Fields that will be projected
78
RdbField field1 = sqlLeaf.addRdbField("ColID", PTypeSpaceMedor.INT, "ColID");
79         RdbField field2 = sqlLeaf.addRdbField("TableId", PTypeSpaceMedor.INT, "TableId");
80         RdbField field3 = sqlLeaf.addRdbField("ColName", PTypeSpaceMedor.STRING, "ColName");
81
82
83         // Creating a SelectProject Operation
84
// At first the filter:
85
FieldOperand fieldOp = new BasicFieldOperand(field1);
86         BasicOperand value = new BasicOperand(1013);
87         Expression filter = new Lower(fieldOp, value);
88         // Then the Operation QueryNode
89
SelectProject sp = new SelectProject(filter, "");
90
91         // Adding Fields wich will be projected
92
PropagatedField pf1 = sp.addPropagatedField("Col_Att1", PTypeSpaceMedor.INT, new QueryTreeField[]{field1});
93         PropagatedField pf2 = sp.addPropagatedField("TableID_Att2", PTypeSpaceMedor.INT, new QueryTreeField[]{field2});
94         PropagatedField pf3 = sp.addPropagatedField("ColName_Att3", PTypeSpaceMedor.STRING, new QueryTreeField[]{field3});
95
96         // Adding CalculatedFields
97
// The Arithmetic axpression of the first CalculatedField = Col_Att1 + TableID_Att2
98
ParameterOperand x = new BasicParameterOperand(PTypeSpaceMedor.INT, "x");
99         Expression exp1 = new Plus(new Plus(new BasicFieldOperand(field1), new BasicFieldOperand(field2)), x);
100         // The Arithmetic axpression of the second CalculatedField = Col_Att1 - TableID_Att2
101
Expression exp2 = new Minus(new BasicFieldOperand(field1), new BasicFieldOperand(field2));
102         // Add The first calculedfield
103
CalculatedField cf1 = sp.addCalculatedField("Col_Att1 + TableID_Att2 + x", PTypeSpaceMedor.INT, exp1);
104         // Add the second CalculatedField
105
CalculatedField cf2 = sp.addCalculatedField("Col_Att1 -TableID_Att2", PTypeSpaceMedor.INT, exp2);
106         // This variable contains the path driver
107
String JavaDoc idbdriver = "org.enhydra.instantdb.jdbc.idbDriver";
108         JDBCConnection jdbcConn = new JDBCConnection();
109         Connection JavaDoc connection = jdbcConn.getConnection(dbURL, idbdriver);
110
111         // Preparing execution, generate indexes and setting TupleLoader
112
ExecPlanGenerator indexesGen = new IndexesGenerator();
113
114         System.out.print(" Generating indexes...");
115         QueryTree query1 = indexesGen.transform(sp);
116         System.out.println("success");
117
118
119         String JavaDoc dir = "h:" + File.separator + "MedorRepositories" + File.separator + "Mars.Medor" +
120             File.separator + "build" + File.separator + "org" + File.separator + "objectweb" +
121             File.separator + "medor" + File.separator + "filter" + File.separator + "lib";
122         String JavaDoc dir1 = "h:" + File.separator + "MedorRepositories" + File.separator + "Mars.Medor" + File.separator + "build";
123         String JavaDoc dir2 = "h:" + File.separator + "MedorRepositories" + File.separator + "Mars.Medor" + File.separator + "src";
124
125         SourceCodeGeneratorCompiler mComp = new SourceCodeGeneratorCompiler(dir, dir1, new String JavaDoc[]{dir2});
126         // Adding Jorm classpath
127
mComp.addLibraryPath("h:" + File.separator + "MedorRepositories" + File.separator + "Mars.Medor" + File.separator + "externals" + File.separator + "ow_jorm.jar");
128
129         // Generating source code and load classes
130
QueryTree query = mComp.transform(query1);
131
132         // Creates an evaluator associated to the QueryTree
133
QueryEvaluator evaluator = new MedorEvaluator(query, 0);
134
135         // Calculates and gets the required connection ressources for this query
136
ConnectionResources connRess = evaluator.getRequiredConnectionResources();
137
138         // Gets the QueryLeafs that requierd connections
139
QueryLeaf[] leafs = connRess.getRequiredQueryLeafConnection();
140
141         // Setting QueryLeaf's appropriated connection Object
142
for (int cpt = 0; (cpt < leafs.length); cpt++) {
143             connRess.setConnection(leafs[cpt], connection);// In our simple case
144
}
145
146         // Setting Parameter Values
147
x.setValue(-1800);
148
149         // Launching Medor Evaluator...
150
TupleCollection queryResult = null;
151         //queryResult = evaluator.evaluate(new ParameterOperand[]{x}, connRess);
152

153         // Browsing results
154
System.out.println("RESULTS :");
155         int cpt = 0;
156
157         if (!queryResult.isEmpty()) {
158             do {
159                 cpt++;
160                 cpt++;
161                 System.out.println("Tuple " + cpt + " :");
162                 System.out.println(queryResult.getMetaData().getField(1).getName() +
163                         " = " + queryResult.getTuple().getObject(1));
164                 System.out.println(queryResult.getMetaData().getField(2).getName() +
165                         " = " + queryResult.getTuple().getObject(2));
166                 System.out.println(queryResult.getMetaData().getField(3).getName() +
167                         " = " + queryResult.getTuple().getObject(3));
168                 System.out.println(queryResult.getMetaData().getField(4).getName() +
169                         " = " + queryResult.getTuple().getObject(4));
170                 System.out.println();
171             }
172             while (queryResult.next());
173         }
174         else
175             System.out.println("No result for this query");
176         connection.close();
177     }
178 }
179
Popular Tags