/**
* '$RCSfile$'
* Copyright: 2004 Regents of the University of California and the
* National Center for Ecological Analysis and Synthesis
*
* '$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.metacattest;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Enumeration;
import java.util.Hashtable;
import edu.ucsb.nceas.MCTestCase;
import edu.ucsb.nceas.metacat.database.DBConnection;
import edu.ucsb.nceas.metacat.database.DBConnectionPool;
import edu.ucsb.nceas.metacat.properties.PropertyService;
import junit.framework.Test;
import junit.framework.TestSuite;
/**
* @author jones
*
* Test class for getting idea how long it will take - to build
* records xml_queryresult table for a given return fields
*/
public class QueryResultBuilderTest extends MCTestCase
{
/** DBConnection pool*/
private DBConnectionPool connPool = null;
/** Return field value in xml_returnfield table*/
private String[] returnFieldString = {"dataset/title", "entityName", "individualName/surName", "keyword"};
/** Return field id value for above return field string in xml_returnfield*/
private int returnFieldId =11;
/**
* Create a suite of tests to be run together
*/
public static Test suite()
{
TestSuite suite = new TestSuite();
suite.addTest(new QueryResultBuilderTest("initialize"));
//suite.addTest(new QueryResultBuilderTest("testBuildRecords"));
return suite;
}
/**
* Constructor to build the test
*
* @param name the name of the test method
*/
public QueryResultBuilderTest(String name)
{
super(name);
}
/*
* @see TestCase#setUp()
*/
protected void setUp() throws Exception
{
super.setUp();
try {
connPool = DBConnectionPool.getInstance();
} catch (Exception e) {
fail(e.getMessage());
}
}
/**
* Run an initial test that always passes to check that the test
* harness is working.
*/
public void initialize()
{
assertTrue(1 == 1);
}
/**
* Tests how long it will take to build records in xml_queryresult table
*/
public void testBuildRecords() throws Exception
{
double start = System.currentTimeMillis()/1000;
DBConnection dbconn = DBConnectionPool.getDBConnection("DBQuery.findDocuments");
int serialNumber = dbconn.getCheckOutSerialNumber();
String sql = "SELECT docid, nodedata, path FROM xml_path_index WHERE path IN (";
PreparedStatement pstmt = null;
ResultSet result = null;
//Gets the document information such as doctype, docname and et al
Hashtable docsInformation = getDocumentsInfo();
//The key of the hash is docid, the element is the return field value (in xml_format)
Hashtable table = new Hashtable();
int size = returnFieldString.length;
// Constructs the sql base on the return fields
boolean first = true;
for (int i=0; i< size; i++)
{
if (!first)
{
sql=sql+",";
}
sql=sql+"'";
String path = returnFieldString[i];
sql = sql+path;
sql=sql+"'";
first = false;
}
sql = sql+")";
System.out.println("The final sql is "+sql);
pstmt = dbconn.prepareStatement(sql);
pstmt.execute();
result = pstmt.getResultSet();
boolean hasNext = result.next();
// Gets returning value for docids and puts them into hashtable
while (hasNext)
{
String docid = result.getString(1);
String value = result.getString(2);
String path = result.getString(3);
// Gets document information from document information hash table.
String docInfo = (String)docsInformation.get(docid);
StringBuffer buffer = new StringBuffer();
if (docInfo != null)
{
buffer.append(docInfo);
}
buffer.append("");
buffer.append(value);
buffer.append("");
String xmlValue = buffer.toString();
//If the hashtable already has key for this docid,
//we should append obove value to the old value
if (table.containsKey(docid))
{
String oldValue = (String)table.get(docid);
String newValue = oldValue+xmlValue;
table.put(docid, newValue);
}
else
{
table.put(docid, xmlValue);
}
hasNext = result.next();
}
result.close();
pstmt.close();
// Insert the hashtable value into xml_queryresult table
Enumeration docids = table.keys();
while (docids.hasMoreElements())
{
String docId = (String)docids.nextElement();
String returnString = (String)table.get(docId);
String query = "INSERT INTO xml_queryresult (returnfield_id, docid, "
+ "queryresult_string) VALUES (?, ?, ?)";
pstmt = dbconn.prepareStatement(query);
pstmt.setInt(1,returnFieldId );
pstmt.setString(2,docId);
pstmt.setString(3, returnString);
pstmt.execute();
pstmt.close();
}
double end = System.currentTimeMillis()/1000;
System.out.println("The time to build xml_queryresult is "+(end-start));
DBConnectionPool.returnDBConnection(dbconn, serialNumber);
assertTrue(1 == 1);
}
/*
* Gets a Hashtable which contains documents' information.
* The key of this Hashtable is docid. The element value is the information, like
* docid, docname,doctype and et al. This method will be used in testBuildRecords
* method to combine a completed return information for query.
*/
private Hashtable getDocumentsInfo() throws Exception
{
DBConnection dbconn = DBConnectionPool.getDBConnection("DBQuery.findDocuments");
int serialNumber = dbconn.getCheckOutSerialNumber();
String sql = "SELECT docid, rev, docname, doctype, date_created,date_updated from xml_documents";
PreparedStatement pstmt = null;
ResultSet result = null;
//The key of the hash is docid, the element is the document information (in xml_format)
Hashtable table = new Hashtable();
pstmt = dbconn.prepareStatement(sql);
pstmt.execute();
result = pstmt.getResultSet();
boolean hasNext = result.next();
// Get values from the xml_document table
while (hasNext)
{
String docid = result.getString(1);
int rev = result.getInt(2);
String docname = result.getString(3);
String doctype = result.getString(4);
String createDate = result.getString(5);
String updateDate = result.getString(6);
String completeDocid = docid
+ PropertyService.getProperty("document.accNumSeparator");
completeDocid += rev;
// Put everything into a string buffer
StringBuffer document = new StringBuffer();
document.append("").append(completeDocid).append("");
if (docname != null)
{
document.append("" + docname + "");
}
if (doctype != null)
{
document.append("" + doctype + "");
}
if (createDate != null)
{
document.append("" + createDate + "");
}
if (updateDate != null)
{
document.append("" + updateDate + "");
}
String information = document.toString();
// Put the docid and info into Hashtable
table.put(docid, information);
hasNext = result.next();
}
result.close();
pstmt.close();
return table;
}
}