/* *************************************************************************************** * Copyright (C) 2006 EsperTech, Inc. All rights reserved. * * http://www.espertech.com/esper * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * *************************************************************************************** */ package com.espertech.esper.example.namedwinquery; import com.espertech.esper.client.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; public class NamedWindowQueryMain { private static final Logger log = LoggerFactory.getLogger(NamedWindowQueryMain.class); public static void main(String[] args) { NamedWindowQueryMain main = new NamedWindowQueryMain(); try { main.runExample(false, "NamedWindowQuery"); } catch (Exception ex) { log.error("Unexpected error occured running example:" + ex.getMessage(), ex); } } public void runExample(boolean isRunFromUnitTest, String engineURI) { int numEventsToLoad = 100000; int numFireAndForgetExecutions = 100; int numOnEventQueryExecutions = 100000; if (isRunFromUnitTest) { numEventsToLoad = 1000; numFireAndForgetExecutions = 5; numOnEventQueryExecutions = 5; } EPServiceProvider epService = EPServiceProviderManager.getProvider(engineURI); // This example initializes the engine instance as it is running within an overall test suite. // This step would not be required unless re-using the same engine instance with different configurations. epService.initialize(); // define event type - this example uses Map event representation // Map<String, Object> definition = new LinkedHashMap<String, Object>(); definition.put("sensor", String.class); definition.put("temperature", double.class); epService.getEPAdministrator().getConfiguration().addEventType("SensorEvent", definition); // define a named window to hold the last 1000000 (1M) events // String stmtText = "create window SensorWindow#keepall as select * from SensorEvent"; log.info("Creating named window : " + stmtText); epService.getEPAdministrator().createEPL(stmtText); stmtText = "insert into SensorWindow select * from SensorEvent"; log.info("Creating insert statement for named window : " + stmtText); epService.getEPAdministrator().createEPL(stmtText); // load 1M events // Random random = new Random(); String[] sensors = "s1,s2,s3,s4,s5,s6".split(","); log.info("Generating " + numEventsToLoad + " sensor events for the named window"); List<Map<String, Object>> events = new ArrayList<Map<String, Object>>(); for (int i = 0; i < numEventsToLoad; i++) { double temperature = random.nextDouble() * 10 + 80; String sensor = sensors[random.nextInt(sensors.length)]; Map<String, Object> data = new LinkedHashMap<String, Object>(); data.put("temperature", temperature); data.put("sensor", sensor); events.add(data); } log.info("Completed generating sensor events"); log.info("Sending " + events.size() + " sensor events into engine"); for (Map<String, Object> theEvent : events) { epService.getEPRuntime().sendEvent(theEvent, "SensorEvent"); } log.info("Completed sending sensor events"); // prepare on-demand query // double sampleTemperature = (Double) events.get(0).get("temperature"); stmtText = "select * from SensorWindow where temperature = " + sampleTemperature; log.info("Preparing fire-and-forget query : " + stmtText); EPOnDemandPreparedQuery onDemandQuery = epService.getEPRuntime().prepareQuery(stmtText); log.info("Executing fire-and-forget query " + numFireAndForgetExecutions + " times"); long startTime = System.currentTimeMillis(); for (int i = 0; i < numFireAndForgetExecutions; i++) { EPOnDemandQueryResult result = onDemandQuery.execute(); if (result.getArray().length != 1) { throw new RuntimeException("Failed assertion of result, expected a single row returned from query"); } } long endTime = System.currentTimeMillis(); double deltaSec = (endTime - startTime) / 1000.0; log.info("Executing fire-and-forget query " + numFireAndForgetExecutions + " times took " + deltaSec + " seconds"); // prepare on-select // Map<String, Object> definitionQuery = new LinkedHashMap<String, Object>(); definitionQuery.put("querytemp", double.class); epService.getEPAdministrator().getConfiguration().addEventType("SensorQueryEvent", definitionQuery); stmtText = "on SensorQueryEvent select sensor from SensorWindow where temperature = querytemp"; log.info("Creating on-select statement for named window : " + stmtText); EPStatement onSelectStmt = epService.getEPAdministrator().createEPL(stmtText); onSelectStmt.setSubscriber(this); log.info("Executing on-select query " + numOnEventQueryExecutions + " times"); startTime = System.currentTimeMillis(); for (int i = 0; i < numOnEventQueryExecutions; i++) { Map<String, Object> queryParams = new HashMap<String, Object>(); queryParams.put("querytemp", sampleTemperature); epService.getEPRuntime().sendEvent(queryParams, "SensorQueryEvent"); } endTime = System.currentTimeMillis(); deltaSec = (endTime - startTime) / 1000.0; log.info("Executing on-select query " + numOnEventQueryExecutions + " times took " + deltaSec + " seconds"); } public void update(String result) { // No action taken here // System.out.println(result); } }