Let's assume you can't control complexity and frequency of change at all.
One thing you are responsible for, though, is to make those expressions behave.
Simply rewriting them can increase maintainability:
Code:
false
|| cat.equalsIgnoreCase("StoreTx")
|| cat.equalsIgnoreCase("PushNotification")
|| cat.equalsIgnoreCase("LocalNotifiaction")
|| cat.equalsIgnoreCase("LocationRequest")
|| cat.equalsIgnoreCase("GameCenter")
|| cat.equalsIgnoreCase("Check-in")
|| cat.equalsIgnoreCase("BusinessMgmt")
|| cat.equalsIgnoreCase("HotBiz")
|| cat.equalsIgnoreCase("Location")
|| cat.equalsIgnoreCase("NetPromoter")
|| cat.equalsIgnoreCase("Flurry")
|| cat.equalsIgnoreCase("SlotMachine")
|| cat.equalsIgnoreCase("Application")
|| cat.equalsIgnoreCase("Facebook") && act != null && act.equalsIgnoreCase("UserInfo")
|| cat.equalsIgnoreCase("Progression") && act != null && act.equalsIgnoreCase("LevelUp")
|| cat.equalsIgnoreCase("GameTx") && !act.equalsIgnoreCase("BuyShift")
|| app.equalsIgnoreCase("MT2") && !(cat.equalsIgnoreCase("Session")
|| (Integer.parseInt(uid) % 997) < 200)
This filtering expression already is in disjunctive form and consists mostly of simple terms, that could also be used for a JOIN.
The conjunctive terms at the end could easily be handled by that UDJE step Darrell already mentioned - after further normalization, that is.
As a side-effect you get unhindered sight of typos ("LocalNotifiaction") and consistency errors (missing null checks).
Eventually a simplified Filter step would tailor your result set as needed.
pdi-ce-4.3.0-stable
OpenJDK IcedTea 2.3.7 (7u21)
ubuntu 12.04 LTS (x86_64)