|
This help topic assumes you are already familiar with the use of
SeekBy methods, and builds on the examples
in that other help topic.
|
|
The purpose of the SetFilter() method, is to have a way where end-users (not the
developer of the SDK application) would have a means to provide custom filtering
much in the same way as an end-user can filter a Venice worksheet, using a
syntax they are already familiar with.
|
|
If you use SetFilter() in an SDK application and are doing so with a hardcoded
expression, then you really should use a custom
SeekBy/GetNext loop with a
limit and/or a filter instead. The performance
gains will be noticeable. If you can use a limit, the performance difference and
network load improvement are very significant.
|
|
When you write the following bit of code:
|
|
ObjSales.SeekByClassCode(smFirst, ""); // set ordering only, position is irrelevant
bool more = ObjSales.SetFilter("@ASL.ClassCode=='WEBSHOP' && @ASL.Remark=='Gift'");
while (more)
{
DoSomething(ObjSales);
more = ObjSales.GetNext();
}
|
|
Then what it essentially does is:
|
|
ObjSales.SeekByClassCode(smFirst, ""); // set ordering only, position is irrelevant
string rawExpression = "@ASL.ClassCode=='WEBSHOP' && @ASL.Remark=='Gift'";
bool more = ObjSales.SeekBy<LastUsedKey>(smFirst);
while (more)
{
string expression = rawExpression;
ReplaceFields(expression, objSales); // Replace @-fields in the expression with the actual values from the file.
if (Evaluate(expression)==true) // Parse and evaluate the expression
{
DoSomething(objSales);
}
more = ObjSales.GetNext();
}
|
|
There are 3 places where noticeable performance is lost (there is a bit of overhead here and there not
shown in the above code, but it will barely make an impact):
|
|
ReplaceFields(): The way the Venice expressions work, field identifiers in the expression are
being replaced with the corresponding value from the record. This necessarily happens for ALL
fields, and there is no way to optimize this such that replacing only happens for fields that matter for a specific use
case.
Figuring out which fields there are and doing the actual replacements involves additional
string manipulations.
While this is efficient, if you are doing this for a few thousand records, this
will quickly add up to several seconds of additional processing work.
|
|
Evaluate(): The expression string is parsed and evaluated. Every part of the expression is fully evaluated.
A hardcoded filter in the programming language you are using the SDK in, may benefit from:
- short circuit evaluation
so not all fields are fetched from the record.
- Your programming language can be compiled into machine code, or translated into an intermediate
language allowing for faster evaluation.
Again, this is not dramatic, but if you are doing this for a few thousands records, this too will
add up to several seconds of processing work.
|
|
Fetching the entire file: SetFilter() always evaluates every record of the file.
This is sometimes unavoidable. But if a limit
is applied, this makes a very significant difference because not all records in
the file are fetched.
|
|