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 }