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 infrastruct...@apache.org or file a JIRA ticket
with INFRA.
---

Reply via email to