2828import java .util .ArrayList ;
2929import java .util .Arrays ;
3030import java .util .Collection ;
31- import java .util .Iterator ;
3231import java .util .LinkedList ;
3332import java .util .List ;
3433
@@ -54,60 +53,67 @@ public FilterSQLTemplate(ColumnAttributeMapping columnAttributeMapping, Class<?>
5453 setType (SQLType .QUERY );
5554 }
5655
57- @ SuppressWarnings ("unchecked" )
56+ /**
57+ * process the first head QueryFilter and iterate the next element;<BR>
58+ * it will go to add default QueryFilterConnect between two AbstractQueryFilter;<BR>
59+ * after the above operations, it will return the last element QueryFilter.
60+ * @param first QueryFilter the head of QueryFilter
61+ * @return QueryFilter
62+ */
5863 protected QueryFilter getProcessNext (QueryFilter first ) {
5964 QueryFilter next = null ;
6065 if (first == null )
6166 return next ;
6267
63- if (first instanceof QueryFilterGroup ) {//process group
64- final List <QueryFilter > filters = ((QueryFilterGroup ) first ).getQueryFilters ();
65- LinkedList <QueryFilter > filtersTemp = new LinkedList <QueryFilter >();
66- for (Iterator <QueryFilter > it = filters .iterator (); it .hasNext ();) {
67- QueryFilter e = it .next ();
68- getProcessNext (e );
69- filtersTemp .add (e );
70- filtersTemp .add (QueryFilterConnects .and ());
71- }
72- if (filtersTemp .getLast () instanceof QueryFilterConnect ) {
73- filtersTemp .removeLast ();
74- }
75- filters .clear ();
76- filters .addAll (filtersTemp );
68+ if (first instanceof QueryFilterGroup ) {//process group add query filter connect between abstract query filters
69+ processGroup ((QueryFilterGroup ) first );
7770 }
7871
79- while (first .hasNext ()) {
72+ while (first .hasNext ()) {//iterate the next element
8073 next = first .next ();
8174 if (first instanceof QueryFilterConnect && next instanceof QueryFilterConnect )
8275 throw new IllegalQueryFilterException ();
8376
84- // add QueryFilterConnect between AbstractQueryFilters
77+ // add AndFilterConnect between AbstractQueryFilters
8578 if (!(first instanceof QueryFilterConnect ) && !(next instanceof QueryFilterConnect )) {
8679 QueryFilter qf = QueryFilterConnects .and ().append (next );
87- ((AbstractQueryFilter <QueryFilter >) first ).appenedFilter = qf ;
80+ ((AbstractQueryFilter <? >) first ).appenedFilter = qf ;
8881 }
8982 first = next ;
9083
9184 if (first instanceof QueryFilterGroup ) {
92- final List <QueryFilter > filters = ((QueryFilterGroup ) first ).getQueryFilters ();
93- LinkedList <QueryFilter > filtersTemp = new LinkedList <QueryFilter >();
94- for (Iterator <QueryFilter > it = filters .iterator (); it .hasNext ();) {
95- QueryFilter e = it .next ();
96- getProcessNext (e );
97- filtersTemp .add (e );
98- filtersTemp .add (QueryFilterConnects .and ());
99- }
100- if (filtersTemp .getLast () instanceof QueryFilterConnect ) {
101- filtersTemp .removeLast ();
102- }
103- filters .clear ();
104- filters .addAll (filtersTemp );
85+ processGroup ((QueryFilterGroup ) first );
10586 }
10687
10788 }
10889 return next ;
10990 }
11091
92+ /**
93+ * process the QueryFilterGroup element;<BR>
94+ * it will go to add default QueryFilterConnect between two AbstractQueryFilter in this group;<BR>
95+ * @param filterGroup QueryFilterGroup
96+ */
97+ protected void processGroup (QueryFilterGroup filterGroup ) {
98+ final List <QueryFilter > filters = filterGroup .getQueryFilters ();
99+ LinkedList <QueryFilter > filtersTemp = new LinkedList <QueryFilter >();
100+ for (int index = 0 , next_index = index + 1 , count = filters .size (); index < count ; index ++) {
101+ QueryFilter e = filters .get (index );
102+ QueryFilter next_e = next_index < count ? filters .get (next_index ) : null ;
103+ getProcessNext (e );
104+ filtersTemp .add (e );
105+ //only add default AndFilterConnect when current and next element are both AbstractQueryFilter
106+ if (e instanceof AbstractQueryFilter && next_e instanceof AbstractQueryFilter ) {
107+ filtersTemp .add (QueryFilterConnects .and ());
108+ }
109+ }
110+ if (filtersTemp .getLast () instanceof QueryFilterConnect ) {
111+ filtersTemp .removeLast ();
112+ }
113+ filters .clear ();
114+ filters .addAll (filtersTemp );
115+ }
116+
111117 @ Override
112118 public String generateSQL () {
113119 if (this .queryFilter == null ) {
@@ -117,22 +123,6 @@ public String generateSQL() {
117123 buffer .append (super .generateSQL ());
118124 buffer .append (" WHERE " );
119125 QueryFilter first = this .queryFilter ;
120- // QueryFilter next;
121- // TODO
122- // if (first != null)
123- // while (first.hasNext()) {
124- // next = first.next();
125- // if (first instanceof QueryFilterConnect
126- // && next instanceof QueryFilterConnect)
127- // throw new IllegalQueryFilterException();
128- // // add QueryFilterConnect between AbstractQueryFilters
129- // if (!(first instanceof QueryFilterConnect)
130- // && !(next instanceof QueryFilterConnect)) {
131- // QueryFilter qf = QueryFilterConnects.and().append(next);
132- // ((AbstractQueryFilter<QueryFilter>) first).appenedFilter = qf;
133- // }
134- // first = next;
135- // }
136126
137127 getProcessNext (first );
138128
0 commit comments