/** * '$RCSfile$' * Purpose: A Class that searches a relational DB for elements and * attributes that have free text matches to the query string. * It returns a result set consisting of the root nodeid for * each document that satisfies the query * Copyright: 2000 Regents of the University of California and the * National Center for Ecological Analysis and Synthesis * Authors: Matt Jones * * '$Author$' * '$Date$' * '$Revision$' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package edu.ucsb.nceas.metacat; import java.io.*; import java.net.URL; import java.net.MalformedURLException; import java.sql.*; import java.util.Stack; import java.util.Hashtable; import java.util.Enumeration; import edu.ucsb.nceas.metacat.database.DBConnection; import edu.ucsb.nceas.metacat.database.DBConnectionPool; /** * A Class that searches a relational DB for elements and attributes that * have free text matches to the query string. It returns a result set * consisting of the root nodeid for each document that satisfies the query */ public class DBSimpleQuery { //private Connection conn = null; /** * the main routine used to test the DBSimpleQuery utility. *

* Usage: java DBSimpleQuery * * @param query the text to search for in the element and attribute content */ static public void main(String[] args) { if (args.length < 2) { System.err.println("Wrong number of arguments!!!"); System.err.println("USAGE: java DBSimpleQuery "); return; } else { try { String query = args[0]; String doctype = args[1]; // Open a connection to the database //Connection dbconn = util.openDBConnection(); // Execute the simple query DBSimpleQuery rd = new DBSimpleQuery(); Hashtable nodelist = null; if (doctype.equals("any") || doctype.equals("ANY")) { nodelist = rd.findDocuments(query); } else { nodelist = rd.findDocuments(query, doctype); } // Print the reulting root nodes StringBuffer result = new StringBuffer(); String document = null; String docid = null; result.append("\n"); result.append("\n"); // following line removed by Dan Higgins to avoid insertion of query XML inside returned XML doc // result.append(" " + query + "\n"); Enumeration doclist = nodelist.keys(); while (doclist.hasMoreElements()) { docid = (String)doclist.nextElement(); document = (String)nodelist.get(docid); result.append(" \n " + document + "\n \n"); } result.append("\n"); System.out.println(result); } catch (Exception e) { System.err.println("Error in DBSimpleQuery.main"); System.err.println(e.getMessage()); e.printStackTrace(System.err); } } } /** * construct an instance of the DBSimpleQuery class * *

Generally, one would call the findDocuments() routine after creating * an instance to specify the search query

* * @param conn the JDBC connection that we use for the query */ public DBSimpleQuery() throws IOException, SQLException, ClassNotFoundException { //this.conn = conn; } /** * routine to search the elements and attributes looking to match query * * @param query the text to search for */ public Hashtable findDocuments(String query) { return this.findDocuments(query, null); } /** * routine to search the elements and attributes looking to match query * * @param query the text to search for * @param requestedDoctype the type of documents to return from the query */ public Hashtable findDocuments(String query, String requestedDoctype) { Hashtable docListResult = new Hashtable(); PreparedStatement pstmt = null; DBConnection dbConn = null; int serialNumber = -1; // Now look up the document id String docid = null; String docname = null; String doctype = null; String doctitle = null; //StringBuffer document = null; try { dbConn=DBConnectionPool. getDBConnection("DBSimpleQuery.findDocuments"); serialNumber=dbConn.getCheckOutSerialNumber(); if (requestedDoctype == null || requestedDoctype.equals("any") || requestedDoctype.equals("ANY")) { pstmt = dbConn.prepareStatement( "SELECT docid,docname,doctype,doctitle " + "FROM xml_documents " + "WHERE docid IN " + "(SELECT docid " + "FROM xml_nodes WHERE nodedata LIKE ? )"); // Bind the values to the query pstmt.setString(1, query); } else { pstmt = dbConn.prepareStatement( "SELECT docid,docname,doctype,doctitle " + "FROM xml_documents " + "WHERE docid IN " + "(SELECT docid " + "FROM xml_nodes WHERE nodedata LIKE ? ) " + "AND doctype = ?"); // Bind the values to the query pstmt.setString(1, query); pstmt.setString(2, requestedDoctype); } pstmt.execute(); ResultSet rs = pstmt.getResultSet(); boolean tableHasRows = rs.next(); while (tableHasRows) { docid = rs.getString(1); docname = rs.getString(2); doctype = rs.getString(3); doctitle = rs.getString(4); StringBuffer document = new StringBuffer(); document.append("").append(docid).append(""); if (docname != null) { document.append("" + docname + ""); } if (doctype != null) { document.append("" + doctype + ""); } if (doctitle != null) { document.append("" + doctitle + ""); } // Store the document id and the root node id docListResult.put(docid,(String)document.toString()); // Advance to the next record in the cursor tableHasRows = rs.next(); } pstmt.close(); } catch (SQLException e) { System.out.println("Error in DBSimpleQuery.findDocuments: " + e.getMessage()); } finally { DBConnectionPool.returnDBConnection(dbConn, serialNumber); } return docListResult; } }