/*
***************************************************************************************
* 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.rowregex;
import com.espertech.esper.epl.parse.EPLTreeWalkerListener;
import com.espertech.esper.epl.spec.StatementSpecRaw;
import com.espertech.esper.supportunit.epl.parse.SupportParserHelper;
import junit.framework.TestCase;
import java.util.*;
public class TestEventRowRegexHelper extends TestCase {
public void testVariableAnalysis() throws Exception {
String[][] patternTests = new String[][]{
{"A", "[A]", "[]"},
{"A B", "[A, B]", "[]"},
{"A B*", "[A]", "[B]"},
{"A B B", "[A]", "[B]"},
{"A B A", "[B]", "[A]"},
{"A B+ C", "[A, C]", "[B]"},
{"A B?", "[A, B]", "[]"},
{"(A B)* C", "[C]", "[A, B]"},
{"D (A B)+ (G H)? C", "[D, G, H, C]", "[A, B]"},
{"A B | A C", "[A, B, C]", "[]"},
{"(A B*) | (A+ C)", "[C]", "[B, A]"},
{"(A | B) | (C | A)", "[A, B, C]", "[]"},
};
for (int i = 0; i < patternTests.length; i++) {
String pattern = patternTests[i][0];
String expression = "select * from MyEvent#keepall match_recognize (" +
" partition by string measures A.string as a_string pattern ( " + pattern + ") define A as (A.value = 1) )";
EPLTreeWalkerListener walker = SupportParserHelper.parseAndWalkEPL(expression);
StatementSpecRaw raw = walker.getStatementSpec();
RowRegexExprNode parent = raw.getMatchRecognizeSpec().getPattern();
LinkedHashSet<String> singles = new LinkedHashSet<String>();
LinkedHashSet<String> multiples = new LinkedHashSet<String>();
EventRowRegexHelper.recursiveInspectVariables(parent, false, singles, multiples);
String outText = "Failed in :" + pattern +
" result is : single " + Arrays.toString(singles.toArray()) +
" multiple " + Arrays.toString(multiples.toArray());
assertEquals(outText, patternTests[i][1], Arrays.toString(singles.toArray()));
assertEquals(outText, patternTests[i][2], Arrays.toString(multiples.toArray()));
}
}
public void testVisibilityAnalysis() throws Exception {
String[][] patternTests = new String[][]{
{"A", "{}"},
{"A B", "{B=[A]}"},
{"A B*", "{B=[A]}"},
{"A B B", "{B=[A]}"},
{"A B A", "{A=[B], B=[A]}"},
{"A B+ C", "{B=[A], C=[A, B]}"},
{"(A B)+ C", "{B=[A], C=[A, B]}"},
{"D (A B)+ (G H)? C", "{A=[D], B=[A, D], C=[A, B, D, G, H], G=[A, B, D], H=[A, B, D, G]}"},
{"A B | A C", "{B=[A], C=[A]}"},
{"(A B*) | (A+ C)", "{B=[A], C=[A]}"},
{"A (B | C) D", "{B=[A], C=[A], D=[A, B, C]}"},
{"(((A))) (((B))) (( C | (D E)))", "{B=[A], C=[A, B], D=[A, B], E=[A, B, D]}"},
{"(A | B) C", "{C=[A, B]}"},
{"(A | B) (C | A)", "{A=[B], C=[A, B]}"},
};
for (int i = 0; i < patternTests.length; i++) {
String pattern = patternTests[i][0];
String expected = patternTests[i][1];
String expression = "select * from MyEvent#keepall match_recognize (" +
" partition by string measures A.string as a_string pattern ( " + pattern + ") define A as (A.value = 1) )";
EPLTreeWalkerListener walker = SupportParserHelper.parseAndWalkEPL(expression);
StatementSpecRaw raw = walker.getStatementSpec();
RowRegexExprNode parent = raw.getMatchRecognizeSpec().getPattern();
Map<String, Set<String>> visibility = EventRowRegexHelper.determineVisibility(parent);
// sort, for comparing
Map<String, List<String>> visibilitySorted = new LinkedHashMap<String, List<String>>();
List<String> tagsSorted = new ArrayList<String>(visibility.keySet());
Collections.sort(tagsSorted);
for (String tag : tagsSorted) {
List<String> sorted = new ArrayList<String>(visibility.get(tag));
Collections.sort(sorted);
visibilitySorted.put(tag, sorted);
}
assertEquals("Failed in :" + pattern, expected, visibilitySorted.toString());
}
}
}