Index: lucene/queries/src/test/org/apache/lucene/queries/TermsFilterTest.java =================================================================== --- lucene/queries/src/test/org/apache/lucene/queries/TermsFilterTest.java (revision 1332052) +++ lucene/queries/src/test/org/apache/lucene/queries/TermsFilterTest.java (working copy) @@ -121,4 +121,12 @@ rd2.close(); } + public void testToString() { + TermsFilter termsFilter = new TermsFilter(); + termsFilter.addTerm(new Term("field1", "a")); + termsFilter.addTerm(new Term("field1", "b")); + termsFilter.addTerm(new Term("field1", "c")); + assertEquals("field1:a field1:b field1:c", termsFilter.toString()); + } + } Index: lucene/queries/src/test/org/apache/lucene/queries/BooleanFilterTest.java =================================================================== --- lucene/queries/src/test/org/apache/lucene/queries/BooleanFilterTest.java (revision 1332052) +++ lucene/queries/src/test/org/apache/lucene/queries/BooleanFilterTest.java (working copy) @@ -335,4 +335,34 @@ booleanFilter.add(getTermsFilter("accessRights", "admin"), Occur.MUST); tstFilterCard(">0 shoulds with no matches should return no docs", 0, booleanFilter); } + + public void testToStringOfBooleanFilterContainingTermsFilter() { + BooleanFilter booleanFilter = new BooleanFilter(); + booleanFilter.add(getTermsFilter("inStock", "N"), Occur.MUST); + booleanFilter.add(getTermsFilter("isFragile", "Y"), Occur.MUST); + + assertEquals("BooleanFilter(+inStock:N +isFragile:Y)", booleanFilter.toString()); + } + + public void testToStringOfWrappedBooleanFilters() { + BooleanFilter orFilter = new BooleanFilter(); + + BooleanFilter stockFilter = new BooleanFilter(); + stockFilter.add(new FilterClause(getTermsFilter("inStock", "Y"), Occur.MUST)); + stockFilter.add(new FilterClause(getTermsFilter("barCode", "12345678"), Occur.MUST)); + + orFilter.add(new FilterClause(stockFilter,Occur.SHOULD)); + + BooleanFilter productPropertyFilter = new BooleanFilter(); + productPropertyFilter.add(new FilterClause(getTermsFilter("isHeavy", "N"), Occur.MUST)); + productPropertyFilter.add(new FilterClause(getTermsFilter("isDamaged", "Y"), Occur.MUST)); + + orFilter.add(new FilterClause(productPropertyFilter,Occur.SHOULD)); + + BooleanFilter composedFilter = new BooleanFilter(); + composedFilter.add(new FilterClause(orFilter,Occur.MUST)); + + assertEquals("BooleanFilter(+BooleanFilter(BooleanFilter(+inStock:Y +barCode:12345678) BooleanFilter(+isHeavy:N +isDamaged:Y)))", + composedFilter.toString()); + } } Index: lucene/queries/src/java/org/apache/lucene/queries/TermsFilter.java =================================================================== --- lucene/queries/src/java/org/apache/lucene/queries/TermsFilter.java (revision 1332052) +++ lucene/queries/src/java/org/apache/lucene/queries/TermsFilter.java (working copy) @@ -114,4 +114,17 @@ return hash; } + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + boolean first = true; + for (Term term : terms) { + if (!first) { + builder.append(' '); + } + builder.append(term.field()).append(":").append(term.text()); + first = false; + } + return builder.toString(); + } }