package gr.ntua.ivml.athena.test;
import gr.ntua.ivml.athena.db.DB;
import gr.ntua.ivml.athena.db.StatisticsDAO;
import gr.ntua.ivml.athena.persistent.DataUpload;
import gr.ntua.ivml.athena.persistent.XmlObject;
import gr.ntua.ivml.athena.persistent.XpathHolder;
import gr.ntua.ivml.athena.xml.Statistics;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import org.apache.log4j.Logger;
import org.hibernate.StatelessSession;
public class StatisticTests extends TestCase {
public static final Logger log = Logger.getLogger(StatisticTests.class);
public void notestNameSpaces() {
XmlObject xo = getExample();
StatisticsDAO stats = new StatisticsDAO();
Map<String, String> nameSpaces = stats.getNameSpaces(xo);
assertTrue( nameSpaces.containsValue("mets"));
assertTrue( nameSpaces.containsValue("xsi"));
assertTrue( nameSpaces.size() == 5 );
}
public void notestElements() {
XmlObject xo = getExample();
StatisticsDAO stats = new StatisticsDAO();
List<String> l = stats.getElements(xo, "http://www.w3.org/2001/XMLSchema-instance");
assertTrue( l.size()==1 );
l = stats.getElements( xo, "http://www.loc.gov/METS/" );
assertTrue( l.size() == 17 );
l = stats.getElementsPrefix( xo, "mets" );
assertTrue( l.size() == 17 );
}
public void notestXpathStats() {
XmlObject xo = getExample();
StatisticsDAO stats = new StatisticsDAO();
XpathHolder xp = xo.getRoot().getByRelativePath("/OAI-PMH/GetRecord/record/metadata/mets");
List<? extends XpathHolder> l = xp.getAttributes();
assertTrue( l.size() == 3 );
xp = xo.getRoot().getByRelativePath("/OAI-PMH/GetRecord/record/metadata/mets/dmdSec/@ID");
log.debug( xp.getDistinctCount() + " " + xp.getCount());
XpathHolder xp2 = xo.getRoot().getByRelativePathQuick("/OAI-PMH/GetRecord/record/metadata/mets/dmdSec/@ID");
assertEquals( xp.getDbID(), xp2.getDbID());
xp = xo.getRoot().getByRelativePath("/OAI-PMH/GetRecord/record/metadata/mets/dmdSec/mdWrap/xmlData/note/@type");
List<Object[]> res = xp.getCountByValue(100);
assertEquals( res.size(), 4 );
}
public void testStatisticsObject() {
XmlObject xo = getExample();
Statistics s = xo.getStats();
log.debug( "namespaces " + s.getNameSpaces());
log.debug( "Elements for URIprefix" + s.getElements( "mets"));
log.debug( "Attributes " + s.getAttributes("identifier"));
log.debug( "ElemAttrFreq " + s.getElementAttrFreqs("@ID")[0] + " " + s.getElementAttrFreqs("@ID")[1]);
log.debug( "Elem Values " + s.getElementValues("identifier"));
log.debug( "Avg length " + s.getAverageLength("identifier"));
}
public void testSlowQueries() {
XmlObject xo = DB.getXmlObjectDAO().getById( 1003l, false );
List<XpathHolder> l = DB.getXpathHolderDAO().getByUri(xo, "");
for( XpathHolder xp: l ) {
long start = System.currentTimeMillis();
Long count = xp.getDistinctCount();
log.debug( "Frequencies " + ( System.currentTimeMillis()-start ));
start = System.currentTimeMillis();
float len2 = xp.getAvgLength();
log.debug( "AvgLen " + ( System.currentTimeMillis()-start ));
}
/*
Statistics st = xo.getStats();
LinkedHashMap<String, String> res = st.getNameSpaces();
for( String uri: res.keySet()) {
List<String> elements = st.getElements(uri);
for( String elem: elements ) {
long start = System.currentTimeMillis();
long[] res1 = st.getElementAttrFreqs(elem);
log.debug( "Frequencies " + ( System.currentTimeMillis()-start ));
start = System.currentTimeMillis();
float len2 = st.getMedianLength(elem);
log.debug( "Median " + ( System.currentTimeMillis()-start ));
}
}
*/
}
public void testAllStats() {
XmlObject xo = DB.getXmlObjectDAO().getById( 1001l, false );
Map<Long, Object[]> stats = DB.getXMLNodeDAO().getStatsForXpaths(xo);
assertTrue( stats.size()>0);
}
public void testDirectJdbc() {
StatelessSession ss = DB.getStatelessSession();
Connection c = ss.connection();
try {
PreparedStatement st1 = c.prepareStatement(
"select xpathholde0_.name as col_0_0_ from xpath_summary xpathholde0_ " +
"where xpathholde0_.xml_object_id=? " +
" and xpathholde0_.uri=? " +
" and xpathholde0_.name<>'text()' " +
" and substring(xpathholde0_.name, 1, 1)<>'@' " +
"group by " +
" xpathholde0_.name " );
st1.setLong(1, 1003l);
st1.setString( 2, "" );
ResultSet rs = st1.executeQuery();
List<String> elements = new ArrayList<String>();
while( rs.next()) {
elements.add( rs.getString(1));
}
for( int i=0; i<elements.size(); i++ ) {
long start = System.currentTimeMillis();
PreparedStatement st = c.prepareStatement("select " +
"avg(length(xmlnode0_.content)) as col_0_0_ " +
" from " +
" xml_node_master xmlnode0_, " +
" xpath_summary xpathholde1_, " +
" xpath_summary xpathholde2_ " +
" where xmlnode0_.xpath_summary_id=xpathholde1_.xpath_summary_id and xpathholde1_.parent_summary_id=xpathholde2_.xpath_summary_id " +
" and xmlnode0_.xml_object_id= 1003 " +
" and xpathholde2_.name= '"+ elements.get(i) + "'" +
" and xpathholde1_.name='text()'" );
st.execute();
log.debug( "Time passed " + (System.currentTimeMillis() - start ) );
}
} catch( Exception e ) {
log.error( e );
}
}
public XmlObject getExample() {
DataUpload du = DB.getDataUploadDAO().simpleGet("originalFilename='example.zip'");
assertNotNull( "DataUpload 'example.zip' not found, run test UploadIndexer to create it", du );
return du.getXmlObject();
}
}