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;
}
}