Reputation: 988
All I am trying to achieve is to replace comparative equals with ILIKE, but not assignment statements.
i.e.
SELECT * FROM db WHERE SUBJECT_TYPE = 'Person';
should be replaced as
SELECT * FROM db WHERE SUBJECT_TYPE ILIKE 'Person';
However
SET session ABC.VAR = 5;
should remain untouched.
For this I am trying to use lookahead such that there is no SET before equals (=).
Java
String str = "SELECT * FROM db WHERE SUBJECT_TYPE = 'Person' AND PREDICATE = 'name' AND OBJECT_VALUE = 'John' AND VERSION = '0' "
final Pattern EQUALS_ILIKE_PATTERN = Pattern.compile("(?i)((^((?!SET)[^=])+?)\\s*)=");
final Matcher matcher = EQUALS_ILIKE_PATTERN .matcher(str);
while (matcher.find())
{
final String fromString = matcher.group(0);
str = matcher.replaceAll("$1 ILIKE");
}
System.out.println(str);
Actual outcome:
SELECT * FROM db WHERE SUBJECT_TYPE ILIKE 'Person' AND PREDICATE = 'name' AND OBJECT_VALUE = 'John' AND VERSION = '0'
Expected outcome:
SELECT * FROM db WHERE SUBJECT_TYPE ILIKE 'Person' AND PREDICATE ILIKE 'name' AND OBJECT_VALUE ILIKE 'John' AND VERSION ILIKE '0'
The actual outcome here doesn't replace all necessary equals (=).
Upvotes: 1
Views: 79
Reputation: 521457
We can do this with a one-liner call to String#replaceAll
:
String str = "SELECT * FROM db WHERE SUBJECT_TYPE = 'Person' AND PREDICATE = 'name' AND OBJECT_VALUE = 'John' AND VERSION = '0' ";
str = str.replaceAll("(WHERE|AND)\\s+(\\S+)\\s+=(?=\\s*'[^'+]+')", "$1 $2 ILIKE");
System.out.println(str);
This outputs (formatted for readability):
SELECT *
FROM db
WHERE
SUBJECT_TYPE ILIKE 'Person' AND
PREDICATE ILIKE 'name' AND
OBJECT_VALUE ILIKE 'John' AND
VERSION ILIKE '0'
Upvotes: 1