package de.danielbasedow.prospecter.benchmark; import com.fasterxml.jackson.core.io.JsonStringEncoder; import de.danielbasedow.prospecter.core.*; import de.danielbasedow.prospecter.core.document.Document; import de.danielbasedow.prospecter.core.document.DocumentBuilder; import de.danielbasedow.prospecter.core.document.MalformedDocumentException; import de.danielbasedow.prospecter.core.query.InvalidQueryException; import de.danielbasedow.prospecter.core.schema.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Date; import java.util.List; public class Application { private static final Logger LOGGER = LoggerFactory.getLogger(Application.class); public static Schema buildSchema(String fileName) throws SchemaConfigurationError { SchemaBuilder schemaBuilder = new SchemaBuilderJSON(new File(fileName)); return schemaBuilder.getSchema(); } public static String buildJsonQuery(String queryString, long id) { JsonStringEncoder encoder = JsonStringEncoder.getInstance(); return "{" + "\"id\": " + String.valueOf(id) + "," + "\"query\": {" + "\"and\": [" + "{" + "\"field\": \"textField\"," + "\"condition\": \"match\"," + "\"value\": \"" + new String(encoder.quoteAsString(queryString)) + "\"" + "}" + "]" + "}" + "}"; } public static Document buildDoc(DocumentBuilder builder, String query) { JsonStringEncoder encoder = JsonStringEncoder.getInstance(); String json = "{\"textField\": \"" + new String(encoder.quoteAsString(query)) + "\"}"; try { return builder.build(json); } catch (MalformedDocumentException e) { e.printStackTrace(); } return new Document(); } public static void main(String[] args) { try { Schema schema = buildSchema(args[0]); String line; BufferedReader testDoc = new BufferedReader(new FileReader(new File(args[2]))); String queryStr = ""; while ((line = testDoc.readLine()) != null) { queryStr = queryStr + " " + line; } //Document testDocument = buildDoc(schema.getDocumentBuilder(), queryStr); BufferedReader br = new BufferedReader(new FileReader(new File(args[1]))); long i = 0; while ((line = br.readLine()) != null) { String[] columns = line.trim().split("\\t"); i++; if (columns.length == 3) { try { schema.addQuery(buildJsonQuery(columns[2].trim(), i)); } catch (MalformedQueryException mqe) { LOGGER.info("query could not be parsed.", mqe); } } if (i % 10000 == 0) { System.out.print(i); System.out.print(","); long sumTime = 0; for (int p = 0; p < 10; p++) { sumTime += testPerformance(schema, queryStr); } System.out.println(sumTime / 10.0); } } br.close(); /* //Insert some tweets here System.out.println("run tweets"); runMatching(schema, ""); runMatching(schema, ""); runMatching(schema, ""); runMatching(schema, ""); */ runMatching(schema, queryStr); runMatching(schema, queryStr); schema.close(); printVMStats(); } catch (Exception e) { e.printStackTrace(); } } public static long testPerformance(Schema schema, String doc) { long start = (new Date()).getTime(); Document document = buildDoc(schema.getDocumentBuilder(), doc); Matcher matcher = schema.matchDocument(document); List queries = matcher.getMatchedQueries(); long end = (new Date()).getTime(); //System.out.print(queries.size()); //System.out.print(" "); //System.out.println(end - start); return end - start; } public static void runMatching(Schema schema, String queryStr) { System.out.println("start matching " + (new Date()).getTime()); Document doc = buildDoc(schema.getDocumentBuilder(), queryStr); Matcher matcher = schema.matchDocument(doc); System.out.println("matching done " + (new Date()).getTime()); System.out.println("start testing " + (new Date()).getTime()); List queries = matcher.getMatchedQueries(); System.out.println("testing done " + (new Date()).getTime()); System.out.println("Queries returned: " + Integer.toString(queries.size())); } public static void printVMStats() { Runtime runtime = Runtime.getRuntime(); System.out.println("used: " + (runtime.totalMemory() - runtime.freeMemory())); runtime.gc(); System.out.println("used: " + (runtime.totalMemory() - runtime.freeMemory())); } }