Я пытаюсь отфильтровать данные из моей базы данных, которая состоит из статистики игр НХЛ.Я хочу создать FilteredRowSet, который содержит все игры между двумя конкретными командами.У меня есть фильтры, но фильтры не будут накапливаться.Когда я применяю второй фильтр, он отменяет первый.
Я пытался реализовать много разных видов фильтров, но всегда сталкиваюсь с проблемой, потому что команды могут находиться в одном из двух столбцов.Я не могу найти способ проверить, удовлетворяют ли оба столбца тому, что я ищу.
Это фильтр, который я использую
открытый класс TeamFilter реализует Predicate {
private int lo;
private int hi;
private String colName = null;
private int colNumber = -1;
public TeamFilter(int lo, int hi, int colNumber) {
this.lo = lo;
this.hi = hi;
this.colNumber = colNumber;
}
public TeamFilter(int lo, int hi, String colName) {
this.lo = lo;
this.hi = hi;
this.colName = colName;
}
@Override
public boolean evaluate(Object value, String columnName) {
boolean evaluation = true;
if (columnName.equalsIgnoreCase(this.colName)) {
int columnValue = ((Integer) value).intValue();
if ((columnValue == this.lo) || (columnValue == this.hi)) {
evaluation = true;
} else {
evaluation = false;
}
}
return evaluation;
}
@Override
public boolean evaluate(Object value, int columnNumber) {
boolean evaluation = true;
if (this.colNumber == columnNumber) {
int columnValue = ((Integer) value).intValue();
if ((columnValue == this.lo) || (columnValue == this.hi)) {
evaluation = true;
} else {
evaluation = false;
}
}
return evaluation;
}
@Override
public boolean evaluate(RowSet rs) {
CachedRowSet frs = (CachedRowSet) rs;
boolean evaluation = false;
try {
int columnValue = -1;
if (this.colNumber > 0) {
columnValue = frs.getInt(this.colNumber);
} else if (this.colName != null) {
columnValue = frs.getInt(this.colName);
} else {
return false;
}
if ((columnValue == this.lo) || (columnValue == this.hi)) {
evaluation = true;
}
} catch (SQLException e) {
e.printStackTrace();
} catch (NullPointerException npe) {
System.err.println("NullPointerException caught");
return false;
}
return evaluation;
}
}
Так я реализую фильтрына мой FilteredRowSet
TeamFilter fltr1 = new TeamFilter(homeID, awayID, 4);
TeamFilter fltr4 = new TeamFilter(homeID, awayID, 5);
FilteredRowSet trs = new FilteredRowSetImpl();
trs.setCommand("SELECT * FROM GAMES");
trs.setUsername("root");
trs.setPassword("rootpass");
trs.setUrl("jdbc:mysql://localhost:3306/" + "testData"
+ "?useUnicode=true&useJD"
+ "BCCompliantTimezoneShift=true&useLegacyDatetimeCode=fal"
+ "se&serverTimezone=EST");
trs.execute();
// filters the rowset
trs.beforeFirst();
trs.setFilter(fltr1);
while (trs.next()) {
System.out.println((long) trs.getDouble("GAMENUMBER") + ", "
+ trs.getString("HomeTeam") + ", "
+ trs.getString("AwayTeam") + ", "
+ trs.getInt("homeID") + ", " + trs.getInt("awayID"));
}
System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
trs.beforeFirst();
trs.setFilter(fltr4);
while (trs.next()) {
System.out.println((long) trs.getDouble("GAMENUMBER") + ", "
+ trs.getString("HomeTeam") + ", "
+ trs.getString("AwayTeam") + ", "
+ trs.getInt("homeID") + ", " + trs.getInt("awayID"));
}
trs.beforeFirst();
, и это то, что я получаю до и после второго фильтра.
Вывод FilteredRowSet до и после второго фильтра Первый фильтр фильтрует команду хозяев, а второй фильтр - команду гостей.Команды, которые я ищу, - это «Нью-Йорк Рейнджерс» и «Даллас Старз».Как вы можете видеть, после того, как я сделаю второй фильтр, появятся только те игры, в которых команда гостей - одна из этих двух.Первый фильтр только тогда, когда домашняя команда является одной из этих двух команд.Фильтры не будут применяться в совокупности, даже если это то, что, по словам оракула, произойдет.Чего мне не хватает?