04-25-2017 10:07 PM
A common integration pattern is to do something when no data is received. For example, we might read a file, parse it, and find that no records meet some filter criteria. As a result, we might send an email, or insert a ticket into a ticket management system like ServiceNOW.
However, in SnapLogic, this can be somewhat more difficult than it seems initially because of the streaming architecture. In fact, many snaps will not execute without input documents - rather hard to accomplish when there is no document to flow through:
So, how can we take an action, even though there’s no document to run the snap?
The trick is to make a document and force it into the stream with a Join Snap
(set to Merge):
Note in this figure that even though nothing flows into the top view of the Join
Snap, it still produces an output.
This enables us to use the Router
snap to check whether or not a field that we know will exist in the source does in fact exist. If it does, we know that data has passed through the Filter
snap and then been merged with the Sequence
data. If it does not, we know that only the Sequence
data has been passed through and therefore nothing made it through the Filter
. Only one of these views will have anything pass through it.
The magic here is in the Merge option in the Join
snap. As long as it is receiving data on a view, it will output - even if it has nothing to ‘join’ to. Meanwhile, the Sequence
snap will always output the number of documents that you set it to. In this case, only one is required.
(This pipeline here: Do something after no doc filter_2017_04_26.slp (11.1 KB) )
12-24-2017 04:11 AM
I tried the Sequence with a Joiner and have found the Joiner adds about 200-300ms to my pipeline, just to handle no results from a filter? Seems like a lot of overhead to overcome an issue from the filter pausing the pipeline flow. Naveen, I saw your comment on just using a router, but not sure how that would solve this if we are trying to create a single stream of data with less documents. I’d rather solve this in the source snap, but right now looking for an option that does not add a lot of overhead or pause the pipeline if the filter removes all documents. I was expecting the filter to be the bottleneck not the Joiner, if I use a union the performance is fine, but it won’t work because the first document is alway the output of sequence. Any ideas?
02-02-2018 06:20 PM
We have started utilizing this tool in some of our ETL process and we are facing the exact same problem. If we are adding workaround like this, we may to need to add it more than once in each and every pipeline we develop. I sincerely hope Snaplogic take some quick action to handle situation like this across the platform. Adding workaround is not best option in this case. I wonder how others are handling this issue
02-16-2018 12:14 PM
In the past we had used a Script Snap to detect/notify of the “nothing to do” condition. But it turns out that there are far less than 1% of our processes that the business required this information and, further, we recently discovered that no one that expressed the requirement is actually paying attention to the notifications.
Short version: It’s not as big of an issue as people make it out to be.
TK
08-29-2019 09:54 AM
Hi All,
I have a similar requirement.
I want to send email only if there is data output from the query and if there is no output I need to exit.
I am not able to configure the router.
I have select column_name from source where count=0
if there is output sent mail
below is the query
Select tablename, record_count from audit where record_count=0.
below is the screenshot of mapping and router config.
11-27-2019 08:16 AM
Seems like typo. Its hasOwnProperty()