package timeflow.data.db.filter;
|
|
import timeflow.data.db.*;
|
import timeflow.data.time.*;
|
|
import java.util.regex.*;
|
|
public class StringMatchFilter extends ActFilter {
|
|
private Field[] textFields;
|
private Field[] listFields;
|
private String query="";
|
private boolean isRegex=false;
|
private Pattern pattern;
|
|
public StringMatchFilter(ActDB db, boolean isRegex)
|
{
|
this(db,"", isRegex);
|
}
|
|
public StringMatchFilter(ActDB db, String query, boolean isRegex)
|
{
|
textFields=(Field[])db.getFields(String.class).toArray(new Field[0]);
|
listFields=(Field[])db.getFields(String[].class).toArray(new Field[0]);
|
this.isRegex=isRegex;
|
setQuery(query);
|
}
|
|
public String getQuery()
|
{
|
return query;
|
}
|
|
public void setQuery(String query)
|
{
|
this.query=query;
|
if (isRegex)
|
{
|
pattern=Pattern.compile(query, Pattern.CASE_INSENSITIVE+Pattern.MULTILINE+Pattern.DOTALL);
|
}
|
else
|
this.query=query.toLowerCase();
|
}
|
|
@Override
|
public boolean accept(Act act) {
|
// check text fields
|
for (int i=0; i<textFields.length; i++)
|
{
|
String s=act.getString(textFields[i]);
|
if (s==null) continue;
|
if (isRegex ? pattern.matcher(s).find() : s.toLowerCase().contains(query))
|
return true;
|
}
|
// check list fields
|
for (int j=0; j<listFields.length; j++)
|
{
|
String[] m=act.getTextList(listFields[j]);
|
if (m!=null)
|
for (int i=0; i<m.length; i++)
|
{
|
String s=m[i];
|
if (isRegex ? pattern.matcher(s).find() : s.toLowerCase().contains(query))
|
return true;
|
}
|
}
|
return false;
|
}
|
}
|