summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Filter.java
blob: 4dbb461e4cadea58490816368c35aa8f590faa7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
package com.mapbox.mapboxsdk.style.layers;

import java.util.ArrayList;
import java.util.Collections;

/**
 * Utility to build filter expressions more easily.
 *
 * @see <a href="https://www.mapbox.com/mapbox-gl-style-spec/#types-filter">The online documentation</a>
 */
public class Filter {

  /**
   * Base Filter statement. Subclassed to provide concrete statements.
   */
  public abstract static class Statement {
    protected final String operator;

    public Statement(String operator) {
      this.operator = operator;
    }

    /**
     * Generate a raw array representation of the filter
     *
     * @return the filter represented as an array
     */
    public abstract Object[] toArray();
  }

  /**
   * Represents a {@link Filter} statement. Can be unary (eg `has()`, etc) or take any number of values.
   */
  private static class SimpleStatement extends Statement {
    private final String key;
    private final Object[] values;

    /**
     * @param operator the operator (eg `=`, etc)
     * @param key      the property key
     * @param values   the values to operate on, if any
     */
    SimpleStatement(String operator, String key, Object... values) {
      super(operator);
      this.key = key;
      this.values = values;
    }


    /**
     * {@inheritDoc}
     */
    @Override
    public Object[] toArray() {
      ArrayList<Object> array = new ArrayList<>(2 + values.length);
      array.add(operator);
      array.add(key);
      Collections.addAll(array, values);
      return array.toArray();
    }
  }

  /**
   * Represents a collection of {@link Statement}s with an operator that describes their relationship
   */
  private static class CompoundStatement extends Statement {
    private final Statement[] statements;

    /**
     * @param operator   the relationship operator
     * @param statements the statements to compound
     */
    CompoundStatement(String operator, Statement... statements) {
      super(operator);
      this.statements = statements;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Object[] toArray() {
      ArrayList<Object> array = new ArrayList<>(1 + statements.length);
      array.add(operator);
      for (Statement statement : statements) {
        array.add(statement.toArray());
      }
      return array.toArray();
    }
  }

  /**
   * Groups a collection of statements in an 'all' relationship
   *
   * @param statements the collection of statements
   * @return the statements compounded
   */
  public static Statement all(Statement... statements) {
    return new CompoundStatement("all", statements);
  }

  /**
   * Groups a collection of statements in an 'any' relationship
   *
   * @param statements the collection of statements
   * @return the statements compounded
   */
  public static Statement any(Statement... statements) {
    return new CompoundStatement("any", statements);
  }

  /**
   * Groups a collection of statements in an 'none' relationship
   *
   * @param statements the collection of statements
   * @return the statements compounded
   */
  public static Statement none(Statement... statements) {
    return new CompoundStatement("none", statements);
  }

  /**
   * Check the property's existence
   *
   * @param key the property key
   * @return the statement
   */
  public static Statement has(String key) {
    return new SimpleStatement("has", key);
  }

  /**
   * Check the property's existence, negated
   *
   * @param key the property key
   * @return the statement
   */
  public static Statement notHas(String key) {
    return new SimpleStatement("!has", key);
  }

  /**
   * Check the property equals the given value
   *
   * @param key   the property key
   * @param value the value to check against
   * @return the statement
   */
  public static Statement eq(String key, Object value) {
    return new SimpleStatement("==", key, value);
  }

  /**
   * Check the property does not equals the given value
   *
   * @param key   the property key
   * @param value the value to check against
   * @return the statement
   */
  public static Statement neq(String key, Object value) {
    return new SimpleStatement("!=", key, value);
  }

  /**
   * Check the property exceeds the given value
   *
   * @param key   the property key
   * @param value the value to check against
   * @return the statement
   */
  public static Statement gt(String key, Object value) {
    return new SimpleStatement(">", key, value);
  }

  /**
   * Check the property exceeds or equals the given value
   *
   * @param key   the property key
   * @param value the value to check against
   * @return the statement
   */
  public static Statement gte(String key, Object value) {
    return new SimpleStatement(">=", key, value);
  }

  /**
   * Check the property does not exceeds the given value
   *
   * @param key   the property key
   * @param value the value to check against
   * @return the statement
   */
  public static Statement lt(String key, Object value) {
    return new SimpleStatement("<", key, value);
  }

  /**
   * Check the property equals or does not exceeds the given value
   *
   * @param key   the property key
   * @param value the value to check against
   * @return the statement
   */
  public static Statement lte(String key, Object value) {
    return new SimpleStatement("<=", key, value);
  }

  /**
   * Check the property is within the given set
   *
   * @param key    the property key
   * @param values the set of values to check against
   * @return the statement
   */
  public static Statement in(String key, Object... values) {
    return new SimpleStatement("in", key, values);
  }

  /**
   * Check the property is not within the given set
   *
   * @param key    the property key
   * @param values the set of values to check against
   * @return the statement
   */
  public static Statement notIn(String key, Object... values) {
    return new SimpleStatement("!in", key, values);
  }

}