cancel
Showing results for 
Search instead for 
Did you mean: 

Performing an Action when there is no data

ncrouch
Former Employee

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:
0009551e1aa0ae88952d21fed89d11c27601ac83.png

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):
9d8ad9e24b2954b4dc66922f66f086d20b03fb6f.png
73eeae9d226276e393707cc64ae6c08873b03b7b.png
3a494da1ff3b5a4737a8f7ccd3ccf70903ec211a.png
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) )

14 REPLIES 14

murphy-brian
New Contributor III

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?

Ksivagurunathan
Contributor

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

tk42
New Contributor III

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

sanam
New Contributor

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.
router pipeline

somdas
New Contributor

Seems like typo. Its hasOwnProperty()