package sushi.application.pages.querying; import java.util.ArrayList; import java.util.List; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.Form; import sushi.application.components.form.BlockingAjaxButton; import sushi.event.SushiEventType; import sushi.event.attribute.SushiAttribute; import sushi.query.SushiQuery; import sushi.query.SushiQueryTypeEnum; import com.espertech.esper.client.EPStatementException; /** * This page enables the creation and modification of On-Demand @see SushiQuery */ public class OnDemandQueryEditor extends QueryEditor { private static final long serialVersionUID = 1L; private static final String ON_DEMAND_QUERY_HELP_TEXT = "On-Demand Queries are always asked from a Window" + lineBreak + lineBreak + "Example-Query:" + lineBreak + "SELECT ValueName, Timestamp" + lineBreak + "FROM EventTypeWindow" + lineBreak + "WHERE ValueName = 'ValueX'"; private BlockingAjaxButton executeQueryButton; private AjaxButton editQueryButton, deleteQueryButton, saveQueryButton; public OnDemandQueryEditor() { super(); helpText = ON_DEMAND_QUERY_HELP_TEXT; updateQueryListChoice(); buildMainLayout(); buildFinalLayout(); } private void updateQueryListChoice() { queryTitles = SushiQuery.getAllTitlesOfOnDemandQueries(); if (!queryTitles.isEmpty()) { selectedQueryTitle = queryTitles.get(0); } } @SuppressWarnings("serial") private void buildFinalLayout() { saveQueryButton = new AjaxButton("saveQueryButton", layoutForm) { private static final long serialVersionUID = 1L; @Override public void onSubmit(AjaxRequestTarget target, Form<?> form) { super.onSubmit(target, form); try { String queryTitle = (String) queryNameTextField.getValue(); if (queryTitle.isEmpty()) { getFeedbackPanel().error("Please specify a name for the query!"); target.add(getFeedbackPanel()); return; } SushiQuery newQuery = SushiQuery.findQueryByTitle(queryTitle); if (newQuery == null) { newQuery = new SushiQuery(queryTitle, query, SushiQueryTypeEnum.ONDEMAND); queryTitles.add(queryTitle); } newQuery.setQueryString(query); newQuery.validate(); newQuery.save(); textFieldDefaultValues.setQueryNameTextField(""); query = ""; target.add(queryListChoice); target.add(queryNameTextField); target.add(queryTextArea); target.add(getFeedbackPanel()); } catch (EPStatementException e) { getFeedbackPanel().error(e.getMessage()); target.add(getFeedbackPanel()); } } }; layoutForm.add(saveQueryButton); editQueryButton = new AjaxButton("editQueryButton", layoutForm) { @Override public void onSubmit(AjaxRequestTarget target, Form<?> form) { super.onSubmit(target, form); String queryTitle = selectedQueryTitle; textFieldDefaultValues.setQueryNameTextField(queryTitle); query = SushiQuery.findQueryByTitle(queryTitle) .getQueryString(); target.add(queryNameTextField); target.add(queryTextArea); } }; layoutForm.add(editQueryButton); deleteQueryButton = new AjaxButton("deleteQueryButton", layoutForm) { @Override public void onSubmit(AjaxRequestTarget target, Form<?> form) { super.onSubmit(target, form); ; String queryTitle = selectedQueryTitle; if (!queryTitle.isEmpty()) { SushiQuery.removeQueryWithTitle(queryTitle); queryTitles.remove(queryTitle); target.add(queryListChoice); } } }; layoutForm.add(deleteQueryButton); //executes the on-demand query on the events in the windows executeQueryButton = new BlockingAjaxButton("executeQueryButton", layoutForm) { private static final long serialVersionUID = 1L; @Override public void onSubmit(AjaxRequestTarget target, Form<?> form) { super.onSubmit(target, form); System.out.println("Number of Events in Runtime before Query: " + sushiEsper.getEsperRuntime().getNumEventsEvaluated()); String queryTitle = selectedQueryTitle; SushiQuery query = SushiQuery.findQueryByTitle(queryTitle); queryResult = query.execute(); target.add(queryResultTextArea); } }; layoutForm.add(executeQueryButton); } /** * generates a preview of windows registered at esper for an easier query creation */ @Override protected ArrayList<SushiAttribute> generateNodesOfEventTypeTree() { ArrayList<SushiAttribute> treeElements = new ArrayList<SushiAttribute>(); String[] windowNames = sushiEsper.getWindowNames(); for (String windowName : windowNames) { SushiAttribute eventTypeRootElement = new SushiAttribute(windowName); treeElements.add(eventTypeRootElement); String eventTypeName = windowName.replace("Window", ""); SushiEventType eventType = SushiEventType.findByTypeName(eventTypeName); List<SushiAttribute> rootAttributes = eventType.getRootLevelValueTypes(); for (SushiAttribute rootAttribute : rootAttributes) { rootAttribute.setParent(eventTypeRootElement); } } return treeElements; } }