001 package hep.aida.ref.sql.Test; 002 003 import hep.aida.ref.sql.SQLTuple; 004 import hep.aida.ref.sql.Util; 005 import hep.aida.ref.sql.AIDAURL; 006 import hep.aida.ref.sql.SQLTupleException; 007 008 // AIDA 009 import hep.aida.IAnalysisFactory; 010 import hep.aida.ITree; 011 import hep.aida.ITuple; 012 import hep.aida.ITupleFactory; 013 import hep.aida.IFilter; 014 015 // Log4J 016 import org.apache.log4j.Logger; 017 018 // Java 019 import java.util.Collection; 020 import java.io.IOException; 021 022 /** <code>Read</code> reads one NTuple table. It gets 023 * a <code>token_sring</code> String from each row which 024 * satisfies a simple filter. {@link RowRepresentant}s are 025 * created from those Strings and accumulated in 026 * an array. Database and NTuple (table) should exist. 027 * <br> 028 * <code>Reading</code> is an example to show reading API and 029 * capabilities of SQLTuple. 030 * <p><font color="#880088"> 031 * <pre> 032 * $Log: Read.java,v $ 033 * Revision 1.28 2007/05/23 16:38:45 hrivnac 034 * logical connections for Plotter; better UML 035 * 036 * Revision 1.27 2004/10/29 22:27:25 hrivnac 037 * imports corrected 038 * 039 * Revision 1.26 2004/10/08 15:22:33 hrivnac 040 * JAS3 plugin works 041 * 042 * Revision 1.25 2004/05/22 15:12:59 hrivnac 043 * class id reformated 044 * 045 * Revision 1.24 2004/04/14 13:39:47 hrivnac 046 * 1.5 warnings fixed 047 * 048 * Revision 1.23 2004/04/13 15:45:54 hrivnac 049 * AIDA URL introduced 050 * 051 * Revision 1.22 2004/02/10 14:50:58 hrivnac 052 * JavaDoc tags completed 053 * 054 * Revision 1.21 2003/11/24 15:13:22 hrivnac 055 * Logging improved. 056 * 057 * Revision 1.20 2003/11/20 17:21:58 hrivnac 058 * Java 1.5 natively supported, Log4J reporting improved. 059 * 060 * Revision 1.19 2003/11/17 15:01:23 hrivnac 061 * More BM results. 062 * 063 * Revision 1.18 2003/11/17 10:18:29 hrivnac 064 * Cleaning. 065 * 066 * Revision 1.17 2003/11/13 15:43:23 hrivnac 067 * BenchMarking introduced. 068 * 069 * Revision 1.16 2003/11/05 19:46:22 hrivnac 070 * - FreeHEP 1.2.1 071 * - JAIDA 3.2.1 072 * 073 * Revision 1.9 2003/10/30 11:42:44 hrivnac 074 * ArrayList -> Collection 075 * 076 * Revision 1.6 2003/09/30 20:30:47 hrivnac 077 * special Pool functions 078 * 079 * Revision 1.5 2003/09/30 16:46:02 hrivnac 080 * - Writing test in TestWrite 081 * - SQLTuple projections supported 082 * 083 * Revision 1.4 2003/09/30 14:11:48 hrivnac 084 * Can created SQLTuples. 085 * 086 * Revision 1.3 2003/09/30 12:29:19 hrivnac 087 * Tuples can be written. 088 * 089 * Revision 1.2 2003/09/29 14:36:40 hrivnac 090 * Works per attribute. 091 * 092 * </pre> 093 * </font></p> 094 * @opt attributes 095 * @opt operations 096 * @opt types 097 * @opt visibility 098 * @version $Id: Read.java,v 1.28 2007/05/23 16:38:45 hrivnac Exp $ 099 * @author <a href="mailto:Julius.Hrivnac@cern.ch">J.Hrivnac</a> */ 100 public class Read { 101 102 /** Initiate processing. 103 * @param args <ol> 104 * <li>The URL of existing database,</li> 105 * <li>the user name to be used,</li> 106 * <li>the user password to be used.</li> 107 * </ol> */ 108 public static void main(String[] args) { 109 if (args.length != 3) { 110 log.fatal(Util.urlHelp("hep.aida.ref.sql.Test.Read <url> <user> <passwd>")); 111 System.exit(1); 112 } 113 try { 114 (new Read()).process(args[0], args[1], args[2]); 115 } 116 catch (Exception e) { 117 log.fatal(Util.report("*** Read failed ***", e), e); 118 } 119 } 120 121 /** Perform processing. 122 * @param url The URL of existing database. 123 * @param user The user name to be used. 124 * @param passwd The user password to be used. 125 * @throws SQLTuple if the operation can't be performed. */ 126 private void process(String url, 127 String user, 128 String passwd) throws SQLTupleException { 129 130 log.debug("Reading SQLTuple " + url + " as " + user); 131 132 // Parse URL 133 AIDAURL aidaurl = new AIDAURL(url); 134 String dbName = aidaurl.db(); 135 String tableName = aidaurl.table(); 136 137 // Create options 138 String options = "hep.aida.ref.sql.db=" + dbName + ";" 139 + "hep.aida.ref.sql.user=" + user + ";" 140 + "hep.aida.ref.sql.passwd=" + passwd; 141 142 // Create top-level factory (selection can be done 143 // by -Dhep.aida.IAnalysisFactory command-line option) 144 IAnalysisFactory af = IAnalysisFactory.create(); 145 146 // Create Tree 147 ITree tree = null; 148 try { 149 tree = af.createTreeFactory().create(dbName, aidaurl.storeType(), true, false, options); 150 } 151 catch (IOException e) { 152 throw new SQLTupleException("Can't create Tree from following options: " + options, e); 153 } 154 155 // Get NTuple 156 ITuple tuple = (ITuple)tree.find(tableName); 157 158 // Create Filter 159 ITupleFactory tf = af.createTupleFactory(tree); 160 IFilter filter = tf.createFilter("attfloat > attdouble"); 161 162 // Start time measure 163 long start = System.currentTimeMillis(); 164 165 // Perform filtering 166 Collection<RowRepresentant> reps = null; 167 if (tuple instanceof SQLTuple) { 168 reps = ((SQLTuple)tuple).getColumn("token_string", RowRepresentant.class, filter); 169 for (RowRepresentant r : reps) { 170 log.info(r); 171 } 172 } 173 174 // Quatify 175 int rows = tuple.rows(); 176 177 // Close Tree 178 try { 179 tree.close(); 180 } 181 catch (IOException e) { 182 throw new SQLTupleException("Can't close Tree", e); 183 } 184 185 // Report spent time and results 186 double delta = (System.currentTimeMillis() - start) / 1000.0; 187 log.info(rows + " rows read in " + delta + " s"); 188 if (reps != null) { 189 log.info(reps.size() + " found"); 190 } 191 192 } 193 194 /** Logging . */ 195 private static Logger log = Logger.getLogger(Read.class); 196 197 } 198