KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jahia > sqlprofiler > QueryStatistics


1 /*
2  * Copyright (C) Jahia Ltd. All rights reserved.
3  *
4  * This software is published under the terms of the Jahia Open Software
5  * License version 1.1, a copy of which has been included with this
6  * distribution in the LICENSE.txt file.
7  */

8 package org.jahia.sqlprofiler;
9
10 import java.util.*;
11 import org.jahia.sqlparser.SqlLexer;
12 import java.io.*;
13 import org.jahia.sqlparser.SqlParser;
14 import antlr.collections.AST;
15 //import antlr.DumpASTVisitor; //JPV : For debugging Tree
16
import org.jahia.sqlparser.SqlTreeParser;
17
18 /**
19  * <p>Title: SQL Profiler</p>
20  * <p>Description: </p>
21  * <p>Copyright: Copyright (c) 2003</p>
22  * <p>Company: Jahia Ltd</p>
23  * @author Serge Huber
24  * @author Jean-Philippe Valentin
25  * @version 2.0
26  *
27  * 11/14/2003 : Add DML statements by Jean-Philippe VALENTIN (JPV)
28  */

29
30 public class QueryStatistics {
31
32     private static final org.apache.log4j.Logger logger = org.apache.log4j.
33         Logger.getLogger(QueryStatistics.class);
34
35     Map occurences = new TreeMap();
36     Map queryStatEntries = new TreeMap();
37     private long totalElapsedQueryTime = 0;
38
39     public QueryStatistics() {
40
41     }
42
43     public void clear() {
44         occurences.clear();
45         queryStatEntries.clear();
46         totalElapsedQueryTime = 0;
47     }
48
49 /*JPV : Add DML statements*/
50     public Integer JavaDoc processSQL(QueryEntry queryEntry) {
51         Integer JavaDoc occurenceCount = null;
52         String JavaDoc sqlStatement = queryEntry.getSqlStatement().toLowerCase();
53         if (sqlStatement.trim().startsWith("select") ||
54             sqlStatement.trim().startsWith("insert") ||
55             sqlStatement.trim().startsWith("update") ||
56             sqlStatement.trim().startsWith("delete")) {
57             occurenceCount = (Integer JavaDoc) occurences.get(
58                 sqlStatement);
59             if (occurenceCount == null) {
60                 occurenceCount = new Integer JavaDoc(0);
61             }
62             occurenceCount = new Integer JavaDoc(occurenceCount.intValue() + 1);
63             occurences.put(sqlStatement, occurenceCount);
64             parseSQL(queryEntry);
65         }
66         return occurenceCount;
67     }
68
69     public Set getQueryStatsByOccurence() {
70         Set queryStatByOccurence = new TreeSet();
71         Iterator queryStatIter = queryStatEntries.keySet().iterator();
72         while (queryStatIter.hasNext()) {
73             String JavaDoc curQueryStatKey = (String JavaDoc) queryStatIter.next();
74             QueryStatEntry curQueryStatEntry = (QueryStatEntry)
75                 queryStatEntries.get(curQueryStatKey);
76             queryStatByOccurence.add(curQueryStatEntry);
77         }
78         return queryStatByOccurence;
79     }
80
81     public Map getGeneratedIndexes() {
82         Map generatedIndexes = new TreeMap();
83         Iterator queryStatByOccurenceIter = getQueryStatsByOccurence().iterator();
84         while (queryStatByOccurenceIter.hasNext()) {
85             QueryStatEntry curQueryStat = (QueryStatEntry)
86                 queryStatByOccurenceIter.next();
87
88             if ((curQueryStat.getTableNames().size() == 1) &&
89                 (curQueryStat.getColumnNames().size() > 0)) {
90                 // only generate index on one table for the moment.
91
// first let's generate an index name
92
String JavaDoc tableName = (String JavaDoc) curQueryStat.getTableNames().
93                     iterator().next();
94                 if (tableName.startsWith("SEL_"))
95                 //JPV : only SELECT statements used by index generation
96
{
97                     //JPV : don't keep the prefix SEL_
98
tableName = tableName.substring(4, tableName.length());
99                 String JavaDoc indexName = tableName + "_index";
100                 String JavaDoc indexSuffix = "";
101                 int indexSuffixNumber = 1;
102                 while (generatedIndexes.containsKey(new String JavaDoc(indexName +
103                     indexSuffix))) {
104                     indexSuffixNumber++;
105                     indexSuffix = Integer.toString(indexSuffixNumber);
106                 }
107                 StringBuffer JavaDoc indexStrBuffer = new StringBuffer JavaDoc(
108                     "CREATE INDEX ");
109                 indexStrBuffer.append(indexName);
110                 indexStrBuffer.append(indexSuffix);
111                 indexStrBuffer.append(" ON ");
112                 indexStrBuffer.append(tableName);
113                 indexStrBuffer.append(" ( ");
114                 Iterator columnNameIter = curQueryStat.getColumnNames().
115                     iterator();
116                 while (columnNameIter.hasNext()) {
117                     String JavaDoc curColumnName = (String JavaDoc) columnNameIter.next();
118                     indexStrBuffer.append(curColumnName);
119                     if (columnNameIter.hasNext()) {
120                         indexStrBuffer.append(",");
121                     }
122                 }
123                 indexStrBuffer.append(" ); ");
124                 generatedIndexes.put(new String JavaDoc(indexName + indexSuffix),
125                                      indexStrBuffer.toString());
126             }
127         }
128         }
129         return generatedIndexes;
130     }
131
132     private void parseSQL(QueryEntry queryEntry) {
133         try {
134             SqlLexer lexer = new SqlLexer(new StringReader(queryEntry.getSqlStatement().toLowerCase()));
135             SqlParser parser = new SqlParser(lexer);
136             parser.start_rule();
137             AST resultTree = parser.getAST();
138
139             /*
140                          System.out.println("");
141                          System.out.println("==> Dump of AST <==");
142                          DumpASTVisitor visitor = new DumpASTVisitor();
143                          visitor.visit(resultTree);
144                          System.out.println("==> End Dump of AST <==");
145              */

146
147             SqlTreeParser sqlTreeParser = new SqlTreeParser();
148 /*JPV : Add DML statements*/
149             String JavaDoc strSqlStatement = queryEntry.getSqlStatement().toLowerCase();
150             if (strSqlStatement.trim().startsWith("select"))
151             {
152             sqlTreeParser.select_statement(resultTree);
153             }
154             else if (strSqlStatement.trim().startsWith("update"))
155             {
156                 sqlTreeParser.update_command(resultTree);
157             }
158             else if (strSqlStatement.trim().startsWith("delete"))
159             {
160                 sqlTreeParser.delete_command(resultTree);
161             }
162             else if (strSqlStatement.trim().startsWith("insert"))
163             {
164                 sqlTreeParser.insert_command(resultTree);
165             }
166
167 /*End JPV*/
168             QueryStatEntry newEntry = new QueryStatEntry(sqlTreeParser.
169                 getTableNames(), sqlTreeParser.getColumnNames());
170             if (queryStatEntries.containsKey(newEntry.getKey())) {
171                 newEntry = (QueryStatEntry) queryStatEntries.get(newEntry.
172                     getKey());
173             }
174             newEntry.incOccurences();
175             newEntry.addQuery(queryEntry);
176             if (queryEntry.getElapsedTime() > 0) {
177                 newEntry.incTotalElapseTime(queryEntry.getElapsedTime());
178                 totalElapsedQueryTime += queryEntry.getElapsedTime();
179             }
180             queryStatEntries.put(newEntry.getKey(), newEntry);
181
182         } catch (Exception JavaDoc e) {
183             System.err.println("exception: " + e);
184         }
185     }
186
187     public int getOccurenceCount() {
188         return occurences.size();
189     }
190
191     public long getTotalElapsedQueryTime() {
192         return totalElapsedQueryTime;
193     }
194
195 }
Free Books   Free Magazines  
Popular Tags