View Javadoc
1   /*
2    * Copyright 2009-2013 the original author or authors.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package com.orangesignal.csv.filters;
18  
19  import java.util.List;
20  import java.util.regex.Pattern;
21  
22  /**
23   * DSL (Domain Specific Language) 形式でスマートなフィルタ条件の定義が可能な {@link CsvValueFilter} の実装クラスを提供します。
24   * 
25   * @author Koji Sugisawa
26   * @since 1.2.3
27   */
28  public class SimpleCsvValueFilter implements CsvValueFilter {
29  
30  	private CsvValueLogicalExpression expr;
31  
32  	/**
33  	 * デフォルトコンストラクタです。
34  	 */
35  	public SimpleCsvValueFilter() {
36  		this(new CsvValueAndExpression());
37  	}
38  
39  	/**
40  	 * コンストラクタです。
41  	 * 
42  	 * @param expr 区切り文字形式データフィルタ
43  	 * @throws IllegalArgumentException <code>expr</code> が <code>null</code> の場合
44  	 */
45  	public SimpleCsvValueFilter(final CsvValueLogicalExpression expr) {
46  		if (expr == null) {
47  			throw new IllegalArgumentException(String.format("%s must not be null", CsvValueLogicalExpression.class.getSimpleName()));
48  		}
49  		this.expr = expr;
50  	}
51  
52  	/**
53  	 * 指定された区切り文字形式データの値リストでフィルタする区切り文字形式データフィルタを追加します。
54  	 * 
55  	 * @param filter 区切り文字形式データフィルタ
56  	 * @return このオブジェクトへの参照
57  	 */
58  	public SimpleCsvValueFilter add(final CsvValueFilter filter) {
59  		expr.add(filter);
60  		return this;
61  	}
62  
63  	/**
64  	 * 指定された項目位置に対応する区切り文字形式データの値が <code>null</code> であるかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
65  	 * 
66  	 * @param position 項目位置
67  	 * @return このオブジェクトへの参照
68  	 */
69  	public SimpleCsvValueFilter isNull(final int position) {
70  		expr.add(CsvExpressions.isNull(position));
71  		return this;
72  	}
73  
74  	/**
75  	 * 指定された項目位置に対応する区切り文字形式データの値が <code>null</code> でないかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
76  	 * 
77  	 * @param position 項目位置
78  	 * @return このオブジェクトへの参照
79  	 */
80  	public SimpleCsvValueFilter isNotNull(final int position) {
81  		expr.add(CsvExpressions.isNotNull(position));
82  		return this;
83  	}
84  
85  	/**
86  	 * 指定された項目位置に対応する区切り文字形式データの値が空かどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
87  	 * 
88  	 * @param position 項目位置
89  	 * @return このオブジェクトへの参照
90  	 */
91  	public SimpleCsvValueFilter isEmpty(final int position) {
92  		expr.add(CsvExpressions.isEmpty(position));
93  		return this;
94  	}
95  
96  	/**
97  	 * 指定された項目位置に対応する区切り文字形式データの値が空でないかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
98  	 * 
99  	 * @param position 項目位置
100 	 * @return このオブジェクトへの参照
101 	 */
102 	public SimpleCsvValueFilter isNotEmpty(final int position) {
103 		expr.add(CsvExpressions.isNotEmpty(position));
104 		return this;
105 	}
106 
107 	/**
108 	 * 指定された項目位置に対応する区切り文字形式データの値が判定基準値と等しいかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
109 	 * 
110 	 * @param position 項目位置
111 	 * @param criteria 判定基準値
112 	 * @return このオブジェクトへの参照
113 	 * @throws IllegalArgumentException <code>criteria</code> が <code>null</code> の場合
114 	 */
115 	public SimpleCsvValueFilter eq(final int position, final String criteria) {
116 		expr.add(CsvExpressions.eq(position, criteria));
117 		return this;
118 	}
119 
120 	/**
121 	 * 指定された項目位置に対応する区切り文字形式データの値が判定基準値と等しいかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
122 	 * 
123 	 * @param position 項目位置
124 	 * @param criteria 判定基準値
125 	 * @param ignoreCase 大文字と小文字を区別するかどうか
126 	 * @return このオブジェクトへの参照
127 	 * @throws IllegalArgumentException <code>criteria</code> が <code>null</code> の場合
128 	 */
129 	public SimpleCsvValueFilter eq(final int position, final String criteria, final boolean ignoreCase) {
130 		expr.add(CsvExpressions.eq(position, criteria, ignoreCase));
131 		return this;
132 	}
133 
134 	/**
135 	 * 指定された項目位置に対応する区切り文字形式データの値が判定基準値と等しくないかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
136 	 * 
137 	 * @param position 項目値
138 	 * @param criteria 判定基準値
139 	 * @return このオブジェクトへの参照
140 	 * @throws IllegalArgumentException <code>criteria</code> が <code>null</code> の場合
141 	 */
142 	public SimpleCsvValueFilter ne(final int position, final String criteria) {
143 		expr.add(CsvExpressions.ne(position, criteria));
144 		return this;
145 	}
146 
147 	/**
148 	 * 指定された項目位置に対応する区切り文字形式データの値が判定基準値と等しくないかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
149 	 * 
150 	 * @param position 項目値
151 	 * @param criteria 判定基準値
152 	 * @param ignoreCase 大文字と小文字を区別するかどうか
153 	 * @return このオブジェクトへの参照
154 	 * @throws IllegalArgumentException <code>criteria</code> が <code>null</code> の場合
155 	 */
156 	public SimpleCsvValueFilter ne(final int position, final String criteria, final boolean ignoreCase) {
157 		expr.add(CsvExpressions.ne(position, criteria, ignoreCase));
158 		return this;
159 	}
160 
161 	/**
162 	 * 指定された項目位置に対応する区切り文字形式データの値が判定基準値群のいずれかと等しいかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
163 	 * 
164 	 * @param position 項目値
165 	 * @param criterias 判定基準値群
166 	 * @return このオブジェクトへの参照
167 	 * @throws IllegalArgumentException <code>criterias</code> が <code>null</code> の場合
168 	 */
169 	public SimpleCsvValueFilter in(final int position, final String... criterias) {
170 		expr.add(CsvExpressions.in(position, criterias));
171 		return this;
172 	}
173 
174 	/**
175 	 * 指定された項目位置に対応する区切り文字形式データの値が判定基準値群のいずれかと等しいかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
176 	 * 
177 	 * @param position 項目値
178 	 * @param criterias 判定基準値群
179 	 * @param ignoreCase 大文字と小文字を区別するかどうか
180 	 * @return このオブジェクトへの参照
181 	 * @throws IllegalArgumentException <code>criterias</code> が <code>null</code> の場合
182 	 */
183 	public SimpleCsvValueFilter in(final int position, final String[] criterias, final boolean ignoreCase) {
184 		expr.add(CsvExpressions.in(position, criterias, ignoreCase));
185 		return this;
186 	}
187 
188 	/**
189 	 * 指定された項目位置に対応する区切り文字形式データの値が判定基準値群のいずれとも等しくないかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
190 	 * 
191 	 * @param position 項目値
192 	 * @param criterias 判定基準値群
193 	 * @return このオブジェクトへの参照
194 	 * @throws IllegalArgumentException <code>criterias</code> が <code>null</code> の場合
195 	 */
196 	public SimpleCsvValueFilter notIn(final int position, final String... criterias) {
197 		expr.add(CsvExpressions.notIn(position, criterias));
198 		return this;
199 	}
200 
201 	/**
202 	 * 指定された項目位置に対応する区切り文字形式データの値が判定基準値群のいずれとも等しくないかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
203 	 * 
204 	 * @param position 項目値
205 	 * @param criterias 判定基準値群
206 	 * @param ignoreCase 大文字と小文字を区別するかどうか
207 	 * @return このオブジェクトへの参照
208 	 * @throws IllegalArgumentException <code>criterias</code> が <code>null</code> の場合
209 	 */
210 	public SimpleCsvValueFilter notIn(final int position, final String[] criterias, final boolean ignoreCase) {
211 		expr.add(CsvExpressions.notIn(position, criterias, ignoreCase));
212 		return this;
213 	}
214 
215 	/**
216 	 * 指定された項目位置に対応する区切り文字形式データの値が正規表現パターンとマッチするかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
217 	 * 
218 	 * @param position 項目位置
219 	 * @param pattern 正規表現パターン
220 	 * @return このオブジェクトへの参照
221 	 * @throws IllegalArgumentException <code>pattern</code> が <code>null</code> の場合
222 	 */
223 	public SimpleCsvValueFilter regex(final int position, final String pattern) {
224 		expr.add(CsvExpressions.regex(position, pattern));
225 		return this;
226 	}
227 
228 	/**
229 	 * 指定された項目位置に対応する区切り文字形式データの値が正規表現パターンとマッチするかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
230 	 * 
231 	 * @param position 項目位置
232 	 * @param pattern 正規表現パターン
233 	 * @param ignoreCase 大文字と小文字を区別するかどうか
234 	 * @return このオブジェクトへの参照
235 	 * @throws IllegalArgumentException <code>pattern</code> が <code>null</code> の場合
236 	 */
237 	public SimpleCsvValueFilter regex(final int position, final String pattern, final boolean ignoreCase) {
238 		expr.add(CsvExpressions.regex(position, pattern, ignoreCase));
239 		return this;
240 	}
241 
242 	/**
243 	 * 指定された項目位置に対応する区切り文字形式データの値が正規表現パターンとマッチするかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
244 	 * 
245 	 * @param position 項目位置
246 	 * @param pattern 正規表現パターン
247 	 * @param flags マッチフラグ
248 	 * @return このオブジェクトへの参照
249 	 * @throws IllegalArgumentException <code>pattern</code> が <code>null</code> の場合
250 	 */
251 	public SimpleCsvValueFilter regex(final int position, final String pattern, final int flags) {
252 		expr.add(CsvExpressions.regex(position, pattern, flags));
253 		return this;
254 	}
255 
256 	/**
257 	 * 指定された項目位置に対応する区切り文字形式データの値が正規表現パターンとマッチするかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
258 	 * 
259 	 * @param position 項目位置
260 	 * @param pattern 正規表現パターン
261 	 * @return このオブジェクトへの参照
262 	 * @throws IllegalArgumentException <code>pattern</code> が <code>null</code> の場合
263 	 */
264 	public SimpleCsvValueFilter regex(final int position, final Pattern pattern) {
265 		expr.add(CsvExpressions.regex(position, pattern));
266 		return this;
267 	}
268 
269 	/**
270 	 * 指定された項目位置に対応する区切り文字形式データの値が判定基準値より大きいかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
271 	 * 
272 	 * @param position 項目値
273 	 * @param criteria 判定基準値
274 	 * @return このオブジェクトへの参照
275 	 * @throws IllegalArgumentException <code>criteria</code> が <code>null</code> の場合
276 	 */
277 	public SimpleCsvValueFilter gt(final int position, final String criteria) {
278 		expr.add(CsvExpressions.gt(position, criteria));
279 		return this;
280 	}
281 
282 	/**
283 	 * 指定された項目位置に対応する区切り文字形式データの値が判定基準値より小さいかどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
284 	 * 
285 	 * @param position 項目値
286 	 * @param criteria 判定基準値
287 	 * @return このオブジェクトへの参照
288 	 * @throws IllegalArgumentException <code>criteria</code> が <code>null</code> の場合
289 	 */
290 	public SimpleCsvValueFilter lt(final int position, final String criteria) {
291 		expr.add(CsvExpressions.lt(position, criteria));
292 		return this;
293 	}
294 
295 	/**
296 	 * 指定された項目位置に対応する区切り文字形式データの値が判定基準値以上かどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
297 	 * 
298 	 * @param position 項目値
299 	 * @param criteria 判定基準値
300 	 * @return このオブジェクトへの参照
301 	 * @throws IllegalArgumentException <code>criteria</code> が <code>null</code> の場合
302 	 */
303 	public SimpleCsvValueFilter ge(final int position, final String criteria) {
304 		expr.add(CsvExpressions.ge(position, criteria));
305 		return this;
306 	}
307 
308 	/**
309 	 * 指定された項目位置に対応する区切り文字形式データの値が判定基準値以下かどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
310 	 * 
311 	 * @param position 項目値
312 	 * @param criteria 判定基準値
313 	 * @return このオブジェクトへの参照
314 	 * @throws IllegalArgumentException <code>criteria</code> が <code>null</code> の場合
315 	 */
316 	public SimpleCsvValueFilter le(final int position, final String criteria) {
317 		expr.add(CsvExpressions.le(position, criteria));
318 		return this;
319 	}
320 
321 	/**
322 	 * 指定された項目位置に対応する区切り文字形式データの値が下限値から上限値の範囲かどうかでフィルタを適用する区切り文字形式データフィルタを追加します。
323 	 * 
324 	 * @param position 項目値
325 	 * @param low 下限値
326 	 * @param high 上限値
327 	 * @return このオブジェクトへの参照
328 	 * @throws IllegalArgumentException <code>low</code> または <code>high</code> が <code>null</code> の場合
329 	 */
330 	public SimpleCsvValueFilter between(final int position, final String low, final String high) {
331 		expr.add(CsvExpressions.between(position, low, high));
332 		return this;
333 	}
334 
335 	/**
336 	 * 指定された区切り文字形式データの値リストでフィルタする区切り文字形式データフィルタの論理否定でフィルタを適用する区切り文字形式データフィルタを追加します。
337 	 * 
338 	 * @param filter 論理否定する区切り文字形式データフィルタ
339 	 * @return このオブジェクトへの参照
340 	 * @throws IllegalArgumentException <code>filter</code> が <code>null</code> の場合
341 	 */
342 	public SimpleCsvValueFilter not(final CsvValueFilter filter) {
343 		expr.add(CsvExpressions.not(filter));
344 		return this;
345 	}
346 
347 	@Override
348 	public boolean accept(final List<String> values) {
349 		return expr.accept(values);
350 	}
351 
352 	@Override
353 	public String toString() {
354 		final String name = getClass().getName();
355 		final int period = name.lastIndexOf('.');
356 		return period > 0 ? name.substring(period + 1) : name;
357 	}
358 
359 }