flink-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dawidwys <...@git.apache.org>
Subject [GitHub] flink issue #4296: [FLINK-7147] [cep] Support greedy quantifier in CEP
Date Mon, 07 Aug 2017 11:36:27 GMT
Github user dawidwys commented on the issue:

    https://github.com/apache/flink/pull/4296
  
    There is also one more problem. When we have optional after `greedy` it does not work
well. E.g. have a look at this test case:
    
    	@Test
    	public void testGreedyZeroOrMoreBeforeOptional2() {
    		List<StreamRecord<Event>> inputEvents = new ArrayList<>();
    
    		Event c = new Event(40, "c", 1.0);
    		Event a1 = new Event(41, "a", 2.0);
    		Event a2 = new Event(42, "a", 2.0);
    		Event d = new Event(43, "d", 3.0);
    		Event a3 = new Event(42, "a", 2.0);
    		Event e = new Event(44, "e", 3.0);
    
    		inputEvents.add(new StreamRecord<>(c, 1));
    		inputEvents.add(new StreamRecord<>(a1, 2));
    		inputEvents.add(new StreamRecord<>(a2, 3));
    		inputEvents.add(new StreamRecord<>(d, 4));
    		inputEvents.add(new StreamRecord<>(a3, 5));
    		inputEvents.add(new StreamRecord<>(e, 6));
    
    		// c a* d e
    		Pattern<Event, ?> pattern = Pattern.<Event>begin("start").where(new SimpleCondition<Event>()
{
    			private static final long serialVersionUID = 5726188262756267490L;
    
    			@Override
    			public boolean filter(Event value) throws Exception {
    				return value.getName().equals("c");
    			}
    		}).followedBy("middle1").where(new SimpleCondition<Event>() {
    			private static final long serialVersionUID = 5726188262756267490L;
    
    			@Override
    			public boolean filter(Event value) throws Exception {
    				return value.getName().equals("a");
    			}
    		}).oneOrMore().optional().greedy().followedBy("middle2").where(new SimpleCondition<Event>()
{
    			private static final long serialVersionUID = 5726188262756267490L;
    
    			@Override
    			public boolean filter(Event value) throws Exception {
    				return value.getName().equals("d");
    			}
    		}).optional().followedBy("end").where(new SimpleCondition<Event>() {
    			private static final long serialVersionUID = 5726188262756267490L;
    
    			@Override
    			public boolean filter(Event value) throws Exception {
    				return value.getName().equals("e");
    			}
    		});
    
    		NFA<Event> nfa = NFACompiler.compile(pattern, Event.createTypeSerializer(), false);
    
    		final List<List<Event>> resultingPatterns = feedNFA(inputEvents, nfa);
    
    		compareMaps(resultingPatterns, Lists.<List<Event>>newArrayList(
    			Lists.newArrayList(c, a1, a2, a3, e),
    			Lists.newArrayList(c, a1, a2, d, e)
    		));
    	}
    
    Right know it also returns `c a1 a2 e`, which I think is not correct. I don't think there
is an easy way to fix it right now. I would suggest restricting on the Pattern level that
greedy must not be followed by an `Optional` patten. I would like to hear opinions on that,
@kl0u.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

Mime
View raw message