2017-06-27 5 views
0

J'ai quelques questions connexes:WSO2 DAS SiddhiQL: Initialiser une table d'événements et mettre à jour après

  1. Fisrt, je veux initialiser une table d'événements avec des valeurs par défaut et 100 lignes comme sur cette image:

How I want to initialize my event table named 'counterTable'.

  1. En second lieu, une fois que l'initialisation est fait, je voudrais mettre à jour ce tableau. Comment puis-je exécuter dans le même plan d'exécution une requête2 une fois l'exécution de la requête1 terminée? Pour finir, j'ai un événement avec l'attribut 'altitude'. Dans mon plan d'exécution, pour chaque événement, je veux incrémenter count1 de chaque ligne de ma table d'événements où la colonne num est plus petite que l'alitude. Je l'ai essayé mais cela n'incrémente pas le compte de toutes les lignes.

    FROM inputStream JOIN counterTable 
    SELECT count1+1 as count1, altitude as tempNum 
    update counterTable on counterTable.count1 < tempNum; 
    
    FROM inputStream JOIN counterTable 
    SELECT counterTable.num as theAltitude, counterTable.count1 as countAltitude 
    INSERT INTO outputStream; 
    

Répondre

0
  1. Si vous voulez initialiser chaque fois que le plan d'exécution se déploie, vous devez utiliser une table d'événements en mémoire (comme indiqué ci-dessous). Sinon, vous pouvez simplement utiliser un RDBMS event table, où il a déjà été initialisé.

  2. requêtes seront exécutées dans l'ordre qu'ils ont défini, mais ce processus se produira pour chaque événement (et non comme un lot, à savoir si là deux requêtes qui consomment de inputStream, lorsque l'événement 1 entre en inputStream il va interroger 1, puis pour interroger 2, puis seul l'événement 2 sera consommé ..).

  3. Reportez-vous à l'extrait ci-dessous;

    /* Define the trigger to be used with initialization */ 
    define trigger triggerStream at 'start'; 
    
    /* Define streams */ 
    define stream inputStream (altitude int); 
    define stream outputStream (theAltitude long, countAltitude int); 
    
    /* Define table */ 
    define table counterTable (num long, count1 int, count2 int, tempNum int); 
    
    /* Iterate and generate 100 events */ 
    from triggerStream[count() < 100] 
    insert into triggerStream; 
    
    /* Using above 100 events, initialize the event table */ 
    from triggerStream 
    select count() as num, 0 as count1, 0 as count2, 0 as tempNum 
    insert into counterTable; 
    
    /* Perform the update logic here */ 
    from inputStream as i join counterTable as c 
        on c.count1 < i.altitude 
    select c.num, (c.count1 + 1) as count1, c.count2, altitude as tempNum 
    insert into updateStream; 
    
    from updateStream 
    insert overwrite counterTable 
        on counterTable.num == num; 
    
    /* Join the table and get the updated results */ 
    from inputStream join counterTable as c 
    select c.num as theAltitude, c.count1 as countAltitude 
    insert into outputStream; 
    
+0

J'ai une autre question, puis-je insérer que la dernière mise à jour contreplateau (pour le dernier événement) dans le outputStream parce qu'actuellement j'ai 100 lignes pour chaque événement j'ai donc une énorme quantité de données dans mon persistante flux de données. Merci d'avance. – woofy

+0

J'ai finalement résolu mon problème en utilisant 'output X last events' avant 'insert in mon outputStream;' dans la dernière requête. – woofy

0

Les valeurs du tableau peuvent être initialisés comme suit.

@info(name='initialize table values') 
from inputStream[count()==1] 
select 1 as id, 0 as counter1, 0 as counter2, 0 as counter3 
insert into counterTable;