Search code examples
wso2siddhi

benefit to putting conditional in JOIN ON or Filter criteria


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


Solution

  • 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.