public void TestVisibilityAnalysis() { var patternTests = new String[][] { new [] { "A", "[]" }, new [] { "A B", "[B=[A]]" }, new [] { "A B*", "[B=[A]]" }, new [] { "A B B", "[B=[A]]" }, new [] { "A B A", "[A=[B], B=[A]]" }, new [] { "A B+ C", "[B=[A], C=[A, B]]" }, new [] { "(A B)+ C", "[B=[A], C=[A, B]]" }, new [] { "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]]" }, new [] { "A B | A C", "[B=[A], C=[A]]" }, new [] { "(A B*) | (A+ C)", "[B=[A], C=[A]]" }, new [] { "A (B | C) D", "[B=[A], C=[A], D=[A, B, C]]" }, new [] { "(((A))) (((B))) (( C | (D E)))", "[B=[A], C=[A, B], D=[A, B], E=[A, B, D]]" }, new [] { "(A | B) C", "[C=[A, B]]" }, new [] { "(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.win: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.MatchRecognizeSpec.Pattern; IDictionary <String, ISet <String> > visibility = EventRowRegexHelper.DetermineVisibility(parent); // sort, for comparing var visibilitySorted = new LinkedHashMap <String, IList <String> >(); var tagsSorted = new List <String>(visibility.Keys); tagsSorted.Sort(); foreach (string tag in tagsSorted) { var sorted = new List <String>(visibility.Get(tag)); sorted.Sort(); visibilitySorted.Put(tag, sorted); } Assert.AreEqual(expected, visibilitySorted.Render(), "Failed in :" + pattern); } }