How to manage statement execution order in esper - esper

There is an issue with following code. before A gets incremented or decremented....finalstatement gets executed. Why does this happen.. how can we manage the execution order of statements.
create variable Integer A=0;
on pattern[every a=EventCreated(a.type ='C')]
set A= A+1;
on pattern[every a=EventCreated(a.type ='EOD')]
set A= A-1;
select
"R" as type,
"R" as text,
e.time as time,
e.source as source
from EventCreated e where A=0 ;

Technically the input for the first statement also fits into the last statement that is why it can happen that esper is first triggering the last one.
You can force esper to prioritise your first statement higher with an annotation #Priority
#Priority(1)
#Name("ReplaceCarCounterAdd")
on pattern[every a=EventCreated(a.type ='Charging')]
set ReplaceCar = ReplaceCar+1;
The highest priority is executed first and by default it is zero for all statements. With that change it should work because then when the last statement is triggered the variable is no longer 0.
Documentation in esper:
http://esper.espertech.com/release-7.1.0/esper-reference/html/epl_clauses.html#epl-syntax-annotation

Related

We giving a task for Lua table but it is not working as expectable

Our task is create a table, and read values to the table using a loop. Print the values after the process is complete. - Create a table. - Read the number of values to be read to the table. - Read the values to the table using a loop. - Print the values in the table using another loop. for this we had written code as
local table = {}
for value in ipairs(table) do
io.read()
end
for value in ipairs(table) do
print(value)
end
not sure where we went wrong please help us. Our exception is
Input (stdin)
3
11
22
abc
Your Output (stdout)
~ no output ~
Expected Output
11
22
abc
Correct Code is
local table1 = {}
local x = io.read()
for line in io.lines() do
table.insert(table1, line)
end
for K, value in ipairs(table1) do
print(value)
end
Let's walk through this step-by-step.
Create a table.
Though the syntax is correct, table is a reserved pre-defined global name in Lua, and thus cannot should not be declared a variable name to avoid future issues. Instead, you'll need to want to use a different name. If you're insistent on using the word table, you'll have to distinguish it from the function global table. The easiest way to do this is change it to Table, as Lua is a case-sensitive language. Therefore, your table creation should look something like:
local Table = {}
Read values to the table using a loop.
Though Table is now established as a table, your for loop is only iterating through an empty table. It seems your goal is to iterate through the io.read() instead. But io.read() is probably not what you want here, though you can utilize a repeat loop if you wish to use io.read() via table.insert. However, repeat requires a condition that must be met for it to terminate, such as the length of the table reaching a certain amount (in your example, it would be until (#Table == 4)). Since this is a task you are given, I will not provide an example, but allow you to research this method and use it to your advantage.
Print the values after the process is complete.
You are on the right track with your printing loop. However, it must be noted that iterating through a table always returns two results, an index and a value. In your code, you would only return the index number, so your output would simply return:
1
2
3
4
If you are wanting the actual values, you'll need a placeholder for the index. Oftentimes, the placeholder for an unneeded variable in Lua is the underscore (_). Modify your for loop to account for the index, and you should be set.
Try modifying your code with the suggestions I've given and see if you can figure out how to achieve your end result.
Edited:
Thanks, Piglet, for corrections on the insight! I'd forgotten table itself wasn't a function, and wasn't reserved, but still bad form to use it as a variable name whether local or global. At least, it's how I was taught, but your comment is correct!

SPSS variable scope in nested if

How would you do the following in spss:
var participant_number = 0.
DO IF (condition =1 AND trial_order = 1).
participant_number = ppnr.
DO IF (ppnr = participant_number).
COMPUTE start_condition = 1.
END IF.
ELSE.
participant_number = ppnr.
DO IF (ppnr = participant_number).
COMPUTE start_condition = 0.
END IF.
END IF.
The variable participant_number needs to be defined for the inner loops and not change throughout the inner if. I am just trying to set a value for all the participant cases if the participant fulfills a condition.
In SPSS, in general, (with exceptions, but let's keep things simple for now), variables are global. If they come from the dataset, they can be used in syntaxes without fear of going out of scope.
Note that variables need to be "computed"/created first, before being used. You can do that with syntax or manually in the Data window.
DO IF is useful if you want to perform multiple transformations. Otherwise, a structure like
IF [condition][transformation].
EXECUTE.
would do the trick.
If I understood your goal correctly, you can re-write your code like this:
***create a temporary variable, to check each case if your condition is met. Set the temporary variable to 0 as default value.
compute tempvar=0.
***then set it to 1, if condition is met.
***This is at case level, not participant level.
if condition=1 and trial_order=1 tempvar=1.
exe.
***aggregate the temp variable, from case level at participant level.
***for each participant (ppnr), it will look at all values of tempvar, and set the start_condition as the maximum of tempvar - either 0 or 1.
AGGREGATE
/OUTFILE=* MODE=ADDVARIABLES
/BREAK=ppnr
/start_condition=MAX(tempvar).
***optional.
delete variable tempvar.
At the end, start_condition will be 1 for each case of a participant if (condition =1 AND trial_order = 1) is met for at least one case of that participant; otherwise, it will be 0.

write a query in esper for time frame checking values for each event..

I am trying to write a query for events , and the even has a Boolean value .
I want to write a query that checks the value of that Boolean status in last five seconds ..
passing criteria:- the value of Boolean must be false at all the occurrence within last 5 seconds.
Something along the lines of select * from Event.win:time(5) having count(*, value=false) = count(*) and count(*) > 0 The EPL allows you to add some expression to the "count(*)" counting only those events that satisfy the expression.

Can you use the JD Edwards Update command to change a field that is also part of the WHERE clause?

In JD Edward's One World (E1) package, is it possible to use the built in Update table function to update a particular field that is also used in the where clause?
The use case is that I am executing a batch process that loops through a series of "unprocessed" records and after processing them, updates the table to show a "processed" status. There are three statuses (Processed, Unprocessed, and Ignored). During my update, I can't simply update all flags to "Processed" without accidentally updating the ones labeled "Ignored".
If PO cProcessedFlag is equal to "U"
Table1.Select
Table1.Fetch Next
While SV File_IO_Status is equal to CO SUCCESS
...
Table1.Fetch Next
End While
End If
Table1.Update
I need to be able to update the processed field here (Table1.Update) while also being able to specify where the field is not "I".
You can select and update records at the same time. No problem doing this (Assuming that DOCO is the primary key of Table1):
Table1.Select
PO cProcessedFlag = BC cProcessedFlag
Table1.Fetch Next
VA mnOrderNumber[DOCO] <- BC mnOrderNumber[DOCO]
While SV File_IO_Status is equal to CO SUCCESS
...
Table1.Update
VA mnOrderNumber[DOCO] = VA mnOrderNumber[DOCO]
ā€œPā€ -> BC cProcessedFlag
Table1.Fetch Next
VA mnOrderNumber[DOCO] <- BC mnOrderNumber[DOCO]
End While
When you write code in ER, the middleware will actually perform an open, select, close etc. for each tableIO. So the handle for the second Table1.FetchNext is very different to the open, select, update, close generated for the Table1.Update

Forcing output in Esper

I have a non real time Esper configuration where I feed a stream that I read from a file. I'm trying to create an expression that computes a statistic over the entire stream and outputs one value at the very end. Esper has semantics for forcing a view to output every X seconds, for instance, but is there a semantic for asking the view or the engine to "flush" the output when you know there are no more events to feed.
Turns out that at least one way to do this is to use the output clause with a variable trigger.
The expression would be:
select count(*) as totalCount from events output last when OutputSummary = true
The OutputSummary variable would be initialized like so:
epConfiguration.addVariable("OutputSummary", Boolean.class, "false");
When you're ready to flush, set the variable to true like so:
epRuntime.setVariableValue("OutputSummary", true);
long currentTime = epService.getEPRuntime().getCurrentTime();
epRuntime.sendEvent(new CurrentTimeEvent(currentTime));
It's necessary to send another time event to force the expression to evaluate.
When output requires at every 60 sec then the expression would be:
select emplyee_id from employees output snapshot every 60 sec
and when the output requires at every 10000 events then the expression would be:
select emplyee_id from employees output snapshot every 10000 events

Resources