In Siddhi query with a JOIN is it better to put conditional criteria in the ON clause or in the filter criteria.
Criteria in the JOIN ON Clause
FROM Stroke_TPA_Ingest_Ras_eMar_Output_Stream as Tpa
JOIN PreAdmitADTTable as Adt
ON str:concat(Tpa.FacilityMnemonic,"-",Tpa.AccountNumber) == str:concat(Adt.FacilityMnemonic,"-",Adt.AccountNumber)
AND (
(
(str:contains(Tpa.TpaPharmacyCodesValueSet, "https://fhir.app.medcity.net/ValueSet/StrokeTpaPharmacyCodes|"))
AND
(convert(Tpa.AdministrationDosageFormId, 'int') > 40 AND convert(Tpa.AdministrationDosageFormId, 'int') <= 90)
)
OR
(
(str:contains(Tpa.TpaPharmacyCodesValueSet, "https://fhir.app.medcity.net/ValueSet/StrokeTpaBolusPharmacyCodes|"))
AND
(convert(Tpa.AdministrationDosageFormId, 'int') > 0 AND convert(Tpa.AdministrationDosageFormId, 'int') <= 9)
)
)
SELECT Tpa.meta_LinkId as meta_LinkId
INSERT INTO AlertStreamIntermediary;
Criteria in the Filter
FROM Stroke_TPA_Ingest_Ras_eMar_Output_Stream[
((str:contains(Tpa.TpaPharmacyCodesValueSet, "https://fhir.app.medcity.net/ValueSet/StrokeTpaPharmacyCodes|"))
AND
(convert(Tpa.AdministrationDosageFormId, 'int') > 40 AND convert(Tpa.AdministrationDosageFormId, 'int') <= 90))
OR
((str:contains(Tpa.TpaPharmacyCodesValueSet, "https://fhir.app.medcity.net/ValueSet/StrokeTpaBolusPharmacyCodes|"))
AND
(convert(Tpa.AdministrationDosageFormId, 'int') > 0 AND convert(Tpa.AdministrationDosageFormId, 'int') <= 9))
] as Tpa
JOIN PreAdmitADTTable as Adt
ON str:concat(Tpa.FacilityMnemonic,"-",Tpa.AccountNumber) == str:concat(Adt.FacilityMnemonic,"-",Adt.AccountNumber)
SELECT Tpa.meta_LinkId as meta_LinkId
INSERT INTO AlertStreamIntermediary;
Both queries seem to be equivalent, but wonder if there's a performance difference
Second query will perform better as by the time events reach the join query we have eliminated unwanted events using the filter query. As Siddhi works as a pipeline events that does not match the filter will be dropped at that layer. For more information about Siddhi architecture you can refer this.