[ 
https://issues.apache.org/jira/browse/S4-5?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13171944#comment-13171944
 ] 

Leo Neumeyer commented on S4-5:
-------------------------------

I pushed a new version that seems to be working. I created a new Counter 
example using the Fluent API. The maker class tries to infer all the required 
info and if it cant, it exits with a message. The main ambiguity happens when a 
PE has more than one stream field with the same EventType. In that case, the 
user must provide the field name using the method withField(). Anyway, 
implementing and debugging was quite a bit of work. Hope this is useful! The 
Fluent API is completely independent and optional. Should be a good example for 
others who may want to write a DSL. Doing a DSL in Java is quite cumbersome. 

This is what the example looks like:

{code:title=S4 Fluent API|borderStyle=dashed}
    @Override
    public void configure() {

        /* PE that prints counts to console. */
        PEMaker printPE = addPE(PrintPE.class).asSingleton();

        /* PEs that count events by user, gender, and age. */
        PEMaker userCountPE = addPE(CounterPE.class);
        userCountPE.addTrigger().fireOn(Event.class).ifInterval(100l, 
TimeUnit.MILLISECONDS);

        PEMaker genderCountPE = addPE(CounterPE.class);
        genderCountPE.addTrigger().fireOn(Event.class).ifInterval(100l, 
TimeUnit.MILLISECONDS);

        PEMaker ageCountPE = addPE(CounterPE.class);
        ageCountPE.addTrigger().fireOn(Event.class).ifInterval(100l, 
TimeUnit.MILLISECONDS);

        /* PE that generates random events. */
        generateUserEventPE = addPE(GenerateUserEventPE.class).asSingleton();
        generateUserEventPE.addTimer().withDuration(1, TimeUnit.MILLISECONDS);

        /* Create the application graph. */
        ageCountPE.emit(CountEvent.class).onKey(new 
CountKeyFinder()).to(printPE);
        genderCountPE.emit(CountEvent.class).onKey(new 
CountKeyFinder()).to(printPE);
        userCountPE.emit(CountEvent.class).onKey(new 
CountKeyFinder()).to(printPE);

        generateUserEventPE.emit(UserEvent.class).onKey(new 
AgeKeyFinder()).to(ageCountPE);
        generateUserEventPE.emit(UserEvent.class).onKey(new 
GenderKeyFinder()).to(genderCountPE);
        generateUserEventPE.emit(UserEvent.class).onKey(new 
UserIDKeyFinder()).to(userCountPE);
    }
{code} 

I made a few additional changes:

* Removed the SingletonPE class because it was complicating the API. Instead I 
added a method setSingleton() that creates an eagerly singleton in the app. 
That is, the PE instance is created and initialized just before the app starts 
and before events arrive. 
* I improved initialization coordination.
* Started to use the Guava Precondition class because it makes the code 
cleaner. Please look at ProcessingElement and use a similar pattern.
* Fixed some bugs.

                
> Prototype app builder
> ---------------------
>
>                 Key: S4-5
>                 URL: https://issues.apache.org/jira/browse/S4-5
>             Project: Apache S4
>          Issue Type: New Feature
>    Affects Versions: 0.5
>            Reporter: Leo Neumeyer
>            Priority: Minor
>             Fix For: 0.5
>
>
> Extend Guice AbstractModule to create a simple application builder layer. The 
> idea is to evaluate if we can use Guice to do all the wiring including PEs 
> and Streams and Apps.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to