001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.kernel.search.filter;
016    
017    import com.liferay.portal.kernel.util.StringBundler;
018    import com.liferay.portal.kernel.util.StringPool;
019    
020    /**
021     * @author Michael C. Han
022     */
023    public class RangeTermFilter extends BaseFilter {
024    
025            public RangeTermFilter(
026                    String field, boolean includesLower, boolean includesUpper) {
027    
028                    _field = field;
029                    _includesLower = includesLower;
030                    _includesUpper = includesUpper;
031    
032                    setOperators(includesLower, includesUpper);
033            }
034    
035            public RangeTermFilter(
036                    String field, boolean includesLower, boolean includesUpper,
037                    String lowerBound, String upperBound) {
038    
039                    _field = field;
040                    _includesLower = includesLower;
041                    _includesUpper = includesUpper;
042                    _lowerBound = lowerBound;
043                    _upperBound = upperBound;
044    
045                    setOperators(includesLower, includesUpper);
046            }
047    
048            @Override
049            public <T> T accept(FilterVisitor<T> filterVisitor) {
050                    return filterVisitor.visit(this);
051            }
052    
053            public String getField() {
054                    return _field;
055            }
056    
057            public String getLowerBound() {
058                    return _lowerBound;
059            }
060    
061            public Operator getLowerBoundOperator() {
062                    return _lowerBoundOperator;
063            }
064    
065            @Override
066            public int getSortOrder() {
067                    return 20;
068            }
069    
070            public String getUpperBound() {
071                    return _upperBound;
072            }
073    
074            public Operator getUpperBoundOperator() {
075                    return _upperBoundOperator;
076            }
077    
078            public boolean isIncludesLower() {
079                    return _includesLower;
080            }
081    
082            public boolean isIncludesUpper() {
083                    return _includesUpper;
084            }
085    
086            public void setLowerBound(String lowerBound) {
087                    _lowerBound = lowerBound;
088            }
089    
090            public void setUpperBound(String upperBound) {
091                    _upperBound = upperBound;
092            }
093    
094            @Override
095            public String toString() {
096                    StringBundler sb = new StringBundler(9);
097    
098                    sb.append("{(");
099                    sb.append(_lowerBound);
100                    sb.append(_lowerBoundOperator);
101                    sb.append(_field);
102                    sb.append(_upperBoundOperator);
103                    sb.append(_upperBound);
104                    sb.append("), ");
105                    sb.append(super.toString());
106                    sb.append("}");
107    
108                    return sb.toString();
109            }
110    
111            public enum Operator {
112    
113                    GT, GTE, LT, LTE;
114    
115                    @Override
116                    public String toString() {
117                            String name = name();
118    
119                            if (name.equals(GT.name())) {
120                                    return StringPool.GREATER_THAN;
121                            }
122                            else if (name.equals(GTE.name())) {
123                                    return StringPool.GREATER_THAN_OR_EQUAL;
124                            }
125                            else if (name.equals(LT.name())) {
126                                    return StringPool.LESS_THAN;
127                            }
128                            else if (name.equals(LTE.name())) {
129                                    return StringPool.GREATER_THAN_OR_EQUAL;
130                            }
131    
132                            return StringPool.BLANK;
133                    }
134    
135            }
136    
137            protected void setOperators(boolean includesLower, boolean includesUpper) {
138                    if (includesLower) {
139                            _lowerBoundOperator = Operator.GTE;
140                    }
141                    else {
142                            _lowerBoundOperator = Operator.GT;
143                    }
144    
145                    if (includesUpper) {
146                            _upperBoundOperator = Operator.LTE;
147                    }
148                    else {
149                            _upperBoundOperator = Operator.LT;
150                    }
151            }
152    
153            private final String _field;
154            private final boolean _includesLower;
155            private final boolean _includesUpper;
156            private String _lowerBound;
157            private Operator _lowerBoundOperator;
158            private String _upperBound;
159            private Operator _upperBoundOperator;
160    
161    }