2017-09-03 1 views
0

Ich versuche, das letzte Ereignis von einem time_length_batch zu bekommen, aber ich bin ratlos WRT, wie man das macht.Letztes Ereignis von einem Esper-Fenster, das Zeit und Länge hat

Zum Beispiel ... gibt es ein Inventory Event und möchte die neuesten Updates von jedem verfügbaren Produkt erhalten. Die folgende Abfrage liefert vor allem, was benötigt wird:

SELECT product, inventory FROM 
InventoryEvents.std:groupwin(name).win:time_length_batch(1 min, 2); 

außer dass innerhalb des Fensters ich jedes Ereignis in der letzten Minute oder 2 Veranstaltungen. Ich interessiere mich nur für das letzte Ereignis für dieses Fenster. (Verwenden Sie 2, um die Ergebnisse einfach zu testen.)

Als Ergebnis muss ich im UpdateListener das letzte Ereignis aus dem Array ausgeben. Aber da ich diese Ereignisse nicht benötige und am liebsten zu einem Abonnenten wechseln würde, suche ich nach dem letzten Event. Darüber hinaus sind Abonnenten viel mehr performant so statt dessen:

public static class EveryListener implements UpdateListener { 

    public void update(EventBean[] newData, EventBean[] oldData) { 

     out.println("* Window received: " + " " + 
      newData.length + " " + newData[newData.length - 1].getUnderlying()); 
    } 

    } 

Gerade

public void update(String product, int inventory) { 
     out.println("** Explicit event received: " + " " + product + " " + inventory); 
    } 

aber die Ergebnisse sind ...

* Window received: 2 {product=A, inventory=-10} 
** Explicit event received: A 20 
** Explicit event received: A -10 

ich versucht habe

SELECT product, inventory FROM 
InventoryEvents.std:groupwin(name).win:time_length_batch(1 min, 1000) 
    .std:win:lastevent(); 

aber das gibt nicht die erwartete ted Ergebnisse.

Wie bekomme ich nur das letzte Ereignis eines gruppierten Fensters?

Antwort

0

Es gibt die "letzte" Aggregationsfunktion. Da es sich um eine Aggregationsfunktion handelt, müssen Gruppenklauseln die Gruppierung angeben.

So ist die Abfrage ....

SELECT last(inventory) FROM 
InventoryEvents.std:groupwin(name).win:time_length_batch(1 min, 2) 
group by name 

Es gibt auch so „zurück“ -Funktion, die das Ergebnis der Sie suchen und welche nicht braucht die „Gruppe“ geben kann.

Verwandte Themen