1 /***********************************************************************
2  * Copyright (c) 2013-2024 Commonwealth Computer Research, Inc.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Apache License, Version 2.0
5  * which accompanies this distribution and is available at
6  * http://www.opensource.org/licenses/apache2.0.php.
7  ***********************************************************************/
8 
9 package org.locationtech.geomesa.filter.factory
10 
11 import org.geotools.api.feature.`type`.Name
12 import org.geotools.api.feature.simple.SimpleFeatureType
13 import org.geotools.api.filter.MultiValuedFilter.MatchAction
14 import org.geotools.api.filter._
15 import org.geotools.api.filter.expression.{Expression, PropertyName}
16 import org.geotools.api.filter.spatial.DWithin
17 import org.geotools.api.filter.temporal.{After, Before, During}
18 import org.geotools.feature.simple.SimpleFeatureBuilder
19 import org.geotools.filter.text.ecql.ECQL
20 import org.geotools.filter.visitor.DuplicatingFilterVisitor
21 import org.locationtech.geomesa.filter.FilterHelper
22 import org.locationtech.geomesa.filter.expression.AttributeExpression.{FunctionLiteral, PropertyLiteral}
23 import org.locationtech.geomesa.filter.expression.FastDWithin.DWithinLiteral
24 import org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.{FastIsEqualTo, FastIsEqualToIgnoreCase, FastListIsEqualToAny}
25 import org.locationtech.geomesa.filter.expression.FastPropertyName.{FastPropertyNameAccessor, FastPropertyNameAttribute}
26 import org.locationtech.geomesa.filter.expression.OrHashEquality.OrHashListEquality
27 import org.locationtech.geomesa.filter.expression.OrSequentialEquality.OrSequentialListEquality
28 import org.locationtech.geomesa.filter.expression._
29 import org.locationtech.geomesa.filter.visitor.QueryPlanFilterVisitor
30 import org.locationtech.geomesa.utils.geotools.SimpleFeaturePropertyAccessor
31 import org.locationtech.jts.geom.Geometry
32 import org.xml.sax.helpers.NamespaceSupport
33 
34 /**
35   * Filter factory that creates optimized filters
36   *
37   * Note: usage expects the sft to be set in FastFilterFactory.sfts
38   * FastFilterFactory.toFilter will handle this for you
39  */
40 class FastFilterFactory private extends org.geotools.filter.FilterFactoryImpl with FilterFactory {
41 
42   import org.locationtech.geomesa.utils.geotools.RichAttributeDescriptors.RichAttributeDescriptor
43 
44   import scala.collection.JavaConverters._
45 
46   override def after(exp1: Expression, exp2: Expression): After = after(exp1, exp2, MatchAction.ANY)
47 
48   override def after(exp1: Expression, exp2: Expression, matchAction: MatchAction): After = {
49     if (matchAction != MatchAction.ANY) {
50       super.after(exp1, exp2, matchAction)
51     } else {
52       org.locationtech.geomesa.filter.checkOrder(exp1, exp2) match {
53         case None =>
54           super.after(exp1, exp2, matchAction)
55 
56         case Some(prop) =>
57           val exp1 = prop match {
58             case p: PropertyLiteral => property(p.name)
59             case p: FunctionLiteral => p.function
60           }
61           val descriptor = FastFilterFactory.sfts.get.getDescriptor(prop.name)
62           if (descriptor != null && classOf[java.util.Date].isAssignableFrom(descriptor.getType.getBinding)) {
63             if (prop.flipped) {
64               FastTemporalOperator.after(prop.literal, exp1)
65             } else {
66               FastTemporalOperator.after(exp1, prop.literal)
67             }
68           } else {
69             super.after(exp1, exp2, matchAction)
70           }
71       }
72     }
73   }
74 
75   override def before(exp1: Expression, exp2: Expression): Before = before(exp1, exp2, MatchAction.ANY)
76 
77   override def before(exp1: Expression, exp2: Expression, matchAction: MatchAction): Before = {
78     if (matchAction != MatchAction.ANY) {
79       super.before(exp1, exp2, matchAction)
80     } else {
81       org.locationtech.geomesa.filter.checkOrder(exp1, exp2) match {
82         case None =>
83           super.before(exp1, exp2, matchAction)
84 
85         case Some(prop) =>
86           val exp1 = prop match {
87             case p: PropertyLiteral => property(p.name)
88             case p: FunctionLiteral => p.function
89           }
90           val descriptor = FastFilterFactory.sfts.get.getDescriptor(prop.name)
91           if (descriptor != null && classOf[java.util.Date].isAssignableFrom(descriptor.getType.getBinding)) {
92             if (prop.flipped) {
93               FastTemporalOperator.before(prop.literal, exp1)
94             } else {
95               FastTemporalOperator.before(exp1, prop.literal)
96             }
97           } else {
98             super.before(exp1, exp2, matchAction)
99           }
100       }
101     }
102   }
103 
104   override def greater(exp1: Expression, exp2: Expression): PropertyIsGreaterThan =
105     greater(exp1, exp2, matchCase = false)
106 
107   override def greater(exp1: Expression,
108                        exp2: Expression,
109                        matchCase: Boolean): PropertyIsGreaterThan = greater(exp1, exp2, matchCase, MatchAction.ANY)
110 
111   override def greater(exp1: Expression,
112                        exp2: Expression,
113                        matchCase: Boolean,
114                        matchAction: MatchAction): PropertyIsGreaterThan = {
115     if (matchAction != MatchAction.ANY) {
116       super.greater(exp1, exp2, matchCase, matchAction)
117     } else {
118       org.locationtech.geomesa.filter.checkOrder(exp1, exp2) match {
119         case None =>
120           super.greater(exp1, exp2, matchCase, matchAction)
121 
122         case Some(prop) =>
123           val exp1 = prop match {
124             case p: PropertyLiteral => property(p.name)
125             case p: FunctionLiteral => p.function
126           }
127           val descriptor = FastFilterFactory.sfts.get.getDescriptor(prop.name)
128           if (descriptor != null && classOf[Comparable[_]].isAssignableFrom(descriptor.getType.getBinding)) {
129             if (prop.flipped) {
130               FastComparisonOperator.greaterThan(prop.literal, exp1)
131             } else {
132               FastComparisonOperator.greaterThan(exp1, prop.literal)
133             }
134           } else {
135             super.greater(exp1, exp2, matchCase, matchAction)
136           }
137       }
138     }
139   }
140 
141   override def greaterOrEqual(exp1: Expression, exp2: Expression): PropertyIsGreaterThanOrEqualTo =
142     greaterOrEqual(exp1, exp2, matchCase = false)
143 
144   override def greaterOrEqual(exp1: Expression,
145                               exp2: Expression,
146                               matchCase: Boolean): PropertyIsGreaterThanOrEqualTo =
147     greaterOrEqual(exp1, exp2, matchCase, MatchAction.ANY)
148 
149   override def greaterOrEqual(exp1: Expression,
150                               exp2: Expression,
151                               matchCase: Boolean,
152                               matchAction: MatchAction): PropertyIsGreaterThanOrEqualTo = {
153     if (matchAction != MatchAction.ANY) {
154       super.greaterOrEqual(exp1, exp2, matchCase, matchAction)
155     } else {
156       org.locationtech.geomesa.filter.checkOrder(exp1, exp2) match {
157         case None =>
158           super.greaterOrEqual(exp1, exp2, matchCase, matchAction)
159 
160         case Some(prop) =>
161           val exp1 = prop match {
162             case p: PropertyLiteral => property(p.name)
163             case p: FunctionLiteral => p.function
164           }
165           val descriptor = FastFilterFactory.sfts.get.getDescriptor(prop.name)
166           if (descriptor != null && classOf[Comparable[_]].isAssignableFrom(descriptor.getType.getBinding)) {
167             if (prop.flipped) {
168               FastComparisonOperator.greaterThanOrEqual(prop.literal, exp1)
169             } else {
170               FastComparisonOperator.greaterThanOrEqual(exp1, prop.literal)
171             }
172           } else {
173             super.greaterOrEqual(exp1, exp2, matchCase, matchAction)
174           }
175       }
176     }
177   }
178 
179   override def less(exp1: Expression, exp2: Expression): PropertyIsLessThan = less(exp1, exp2, matchCase = false)
180 
181   override def less(exp1: Expression,
182                     exp2: Expression,
183                     matchCase: Boolean): PropertyIsLessThan = less(exp1, exp2, matchCase, MatchAction.ANY)
184 
185   override def less(exp1: Expression,
186                     exp2: Expression,
187                     matchCase: Boolean,
188                     matchAction: MatchAction): PropertyIsLessThan = {
189     if (matchAction != MatchAction.ANY) {
190       super.less(exp1, exp2, matchCase, matchAction)
191     } else {
192       org.locationtech.geomesa.filter.checkOrder(exp1, exp2) match {
193         case None =>
194           super.less(exp1, exp2, matchCase, matchAction)
195 
196         case Some(prop) =>
197           val exp1 = prop match {
198             case p: PropertyLiteral => property(p.name)
199             case p: FunctionLiteral => p.function
200           }
201           val descriptor = FastFilterFactory.sfts.get.getDescriptor(prop.name)
202           if (descriptor != null && classOf[Comparable[_]].isAssignableFrom(descriptor.getType.getBinding)) {
203             if (prop.flipped) {
204               FastComparisonOperator.lessThan(prop.literal, exp1)
205             } else {
206               FastComparisonOperator.lessThan(exp1, prop.literal)
207             }
208           } else {
209             super.less(exp1, exp2, matchCase, matchAction)
210           }
211       }
212     }
213   }
214 
215   override def lessOrEqual(exp1: Expression, exp2: Expression): PropertyIsLessThanOrEqualTo =
216     lessOrEqual(exp1, exp2, matchCase = false)
217 
218   override def lessOrEqual(exp1: Expression,
219                            exp2: Expression,
220                            matchCase: Boolean): PropertyIsLessThanOrEqualTo =
221     lessOrEqual(exp1, exp2, matchCase, MatchAction.ANY)
222 
223   override def lessOrEqual(exp1: Expression,
224                            exp2: Expression,
225                            matchCase: Boolean,
226                            matchAction: MatchAction): PropertyIsLessThanOrEqualTo = {
227     if (matchAction != MatchAction.ANY) {
228       super.lessOrEqual(exp1, exp2, matchCase, matchAction)
229     } else {
230       org.locationtech.geomesa.filter.checkOrder(exp1, exp2) match {
231         case None =>
232           super.lessOrEqual(exp1, exp2, matchCase, matchAction)
233 
234         case Some(prop) =>
235           val exp1 = prop match {
236             case p: PropertyLiteral => property(p.name)
237             case p: FunctionLiteral => p.function
238           }
239           val descriptor = FastFilterFactory.sfts.get.getDescriptor(prop.name)
240           if (descriptor != null && classOf[Comparable[_]].isAssignableFrom(descriptor.getType.getBinding)) {
241             if (prop.flipped) {
242               FastComparisonOperator.lessThanOrEqual(prop.literal, exp1)
243             } else {
244               FastComparisonOperator.lessThanOrEqual(exp1, prop.literal)
245             }
246           } else {
247             super.lessOrEqual(exp1, exp2, matchCase, matchAction)
248           }
249       }
250     }
251   }
252 
253   override def property(name: String): PropertyName = {
254     val sft = FastFilterFactory.sfts.get
255     val colon = name.indexOf(":")
256     val local = if (colon == -1) { name } else { name.substring(colon + 1) }
257     val index = sft.indexOf(local)
258     if (index != -1) {
259       new FastPropertyNameAttribute(name, index)
260     } else {
261       val sf = new SimpleFeatureBuilder(sft).buildFeature("")
262       val accessor = SimpleFeaturePropertyAccessor.getAccessor(sf, name).getOrElse {
263         throw new IllegalArgumentException(s"Property '$name' does not exist in feature type ${sft.getTypeName}")
264       }
265       new FastPropertyNameAccessor(name, accessor)
266     }
267   }
268 
269   override def property(name: Name): PropertyName = property(name.getLocalPart)
270 
271   override def property(name: String, namespaceContext: NamespaceSupport): PropertyName = property(name)
272 
273   override def or(f: Filter, g: Filter): Or = or(java.util.Arrays.asList(f, g))
274 
275   override def or(filters: java.util.List[Filter]): Or = {
276     if (filters.isEmpty) {
277       return super.or(filters)
278     }
279 
280     val predicates = FilterHelper.flattenOr(filters.asScala.toSeq)
281 
282     val props = scala.collection.mutable.HashSet.empty[String]
283     val literals = scala.collection.immutable.HashSet.newBuilder[AnyRef]
284     literals.sizeHint(predicates.length)
285 
286     val iter = predicates.iterator
287     while (iter.hasNext) {
288       iter.next() match {
289         case p: PropertyIsEqualTo if p.getMatchAction == MatchAction.ANY && p.isMatchingCase =>
290           org.locationtech.geomesa.filter.checkOrder(p.getExpression1, p.getExpression2) match {
291             case Some(PropertyLiteral(name, lit, _)) if !props.add(name) || props.size == 1 => literals += lit.getValue
292             case _ => return super.or(filters)
293           }
294 
295         case _ => return super.or(filters)
296       }
297     }
298 
299     // if we've reached here, we have verified that all the child filters are equality matches on the same property
300     val prop = property(props.head)
301     val values = literals.result
302     val isListType = Option(FastFilterFactory.sfts.get.getDescriptor(props.head)).exists(_.isList)
303 
304     if (values.size >= OrHashEquality.OrHashThreshold.get.toInt) {
305       if (isListType) {
306         new OrHashListEquality(prop, values)
307       } else {
308         new OrHashEquality(prop, values)
309       }
310     } else if (isListType) {
311       new OrSequentialListEquality(prop, values.toSeq)
312     } else {
313       new OrSequentialEquality(prop, values.toSeq)
314     }
315   }
316 
317   override def equals(exp1: Expression, exp2: Expression): PropertyIsEqualTo =
318     equal(exp1, exp2, matchCase = true, MatchAction.ANY)
319 
320   override def equal(exp1: Expression, exp2: Expression, matchCase: Boolean): PropertyIsEqualTo =
321     equal(exp1, exp2, matchCase, MatchAction.ANY)
322 
323   override def equal(exp1: Expression, exp2: Expression, matchCase: Boolean, matchAction: MatchAction): PropertyIsEqualTo = {
324     if (matchAction != MatchAction.ANY) {
325       super.equal(exp1, exp2, matchCase, matchAction)
326     } else {
327       org.locationtech.geomesa.filter.checkOrder(exp1, exp2) match {
328         case None =>
329           super.equal(exp1, exp2, matchCase, matchAction)
330 
331         case Some(prop) =>
332           val exp1 = prop match {
333             case p: PropertyLiteral => property(p.name)
334             case p: FunctionLiteral => p.function
335           }
336           val descriptor = FastFilterFactory.sfts.get.getDescriptor(prop.name)
337           if (descriptor != null && descriptor.isList) {
338             new FastListIsEqualToAny(exp1, prop.literal)
339           } else if (matchCase) {
340             new FastIsEqualTo(exp1, prop.literal)
341           } else {
342             new FastIsEqualToIgnoreCase(exp1, prop.literal)
343           }
344       }
345     }
346   }
347 
348   override def during(exp1: Expression, exp2: Expression): During = during(exp1, exp2, MatchAction.ANY)
349 
350   override def during(exp1: Expression, exp2: Expression, matchAction: MatchAction): During = {
351     if (matchAction != MatchAction.ANY) {
352       super.during(exp1, exp2, matchAction)
353     } else {
354       org.locationtech.geomesa.filter.checkOrder(exp1, exp2).filterNot(_.flipped) match {
355         case None =>
356           super.during(exp1, exp2, matchAction)
357 
358         case Some(prop) =>
359           val exp1 = prop match {
360             case p: PropertyLiteral => property(p.name)
361             case p: FunctionLiteral => p.function
362           }
363           val descriptor = FastFilterFactory.sfts.get.getDescriptor(prop.name)
364           if (descriptor != null && classOf[java.util.Date].isAssignableFrom(descriptor.getType.getBinding)) {
365             FastTemporalOperator.during(exp1, prop.literal)
366           } else {
367             super.during(exp1, exp2, matchAction)
368           }
369       }
370     }
371   }
372 
373   override def dwithin(name: String, geom: Geometry, distance: Double, units: String): DWithin =
374     dwithin(property(name), literal(geom), distance, units)
375 
376   override def dwithin(name: String, geom: Geometry, distance: Double, units: String, action: MatchAction): DWithin =
377     dwithin(property(name), literal(geom), distance, units, action)
378 
379   override def dwithin(exp1: Expression, exp2: Expression, distance: Double, units: String): DWithin =
380     dwithin(exp1, exp2, distance, units, MatchAction.ANY)
381 
382   override def dwithin(exp1: Expression, exp2: Expression, distance: Double, units: String, action: MatchAction): DWithin = {
383     if (action != MatchAction.ANY) {
384       super.dwithin(exp1, exp2, distance, units, action)
385     } else {
386       org.locationtech.geomesa.filter.checkOrder(exp1, exp2) match {
387         case Some(PropertyLiteral(name, lit, _))  => new DWithinLiteral(property(name), lit, distance, units)
388         case Some(FunctionLiteral(_, fn, lit, _)) => new DWithinLiteral(fn, lit, distance, units)
389         case _ => super.dwithin(exp1, exp2, distance, units, action)
390       }
391     }
392   }
393 }
394 
395 object FastFilterFactory {
396 
397   val factory = new FastFilterFactory
398 
399   val sfts = new ThreadLocal[SimpleFeatureType]()
400 
401   def toFilter(sft: SimpleFeatureType, ecql: String): Filter = optimize(sft, ECQL.toFilter(ecql))
402 
403   def toExpression(sft: SimpleFeatureType, ecql: String): Expression = {
404     sfts.set(sft)
405     try { ECQL.toExpression(ecql, factory) } finally {
406       sfts.remove()
407     }
408   }
409 
410   def optimize(sft: SimpleFeatureType, filter: Filter): Filter = {
411     sfts.set(sft)
412     try { QueryPlanFilterVisitor(sft, filter, factory) } finally {
413       sfts.remove()
414     }
415   }
416 
417   def copy(sft: SimpleFeatureType, filter: Filter): Filter = {
418     sfts.set(sft)
419     try { filter.accept(new DuplicatingFilterVisitor(factory), null).asInstanceOf[Filter] } finally {
420       sfts.remove()
421     }
422   }
423 }
Line Stmt Id Pos Tree Symbol Tests Code
46 25706 2498 - 2532 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.after FastFilterFactory.this.after(exp1, exp2, ANY)
49 25707 2636 - 2666 Apply java.lang.Object.!= matchAction.!=(ANY)
50 25708 2676 - 2712 Apply org.geotools.filter.FilterFactoryImpl.after FastFilterFactory.super.after(exp1, exp2, matchAction)
50 25709 2676 - 2712 Block org.geotools.filter.FilterFactoryImpl.after FastFilterFactory.super.after(exp1, exp2, matchAction)
52 25710 2732 - 2786 Apply org.locationtech.geomesa.filter.checkOrder org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2)
52 25736 2732 - 3509 Match <nosymbol> org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2) match { case scala.None => FastFilterFactory.super.after(exp1, exp2, matchAction) case (value: org.locationtech.geomesa.filter.expression.AttributeExpression)Some[org.locationtech.geomesa.filter.expression.AttributeExpression]((prop @ _)) => { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(classOf[java.util.Date].isAssignableFrom(descriptor.getType().getBinding()))) if (prop.flipped) org.locationtech.geomesa.filter.expression.FastTemporalOperator.after(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastTemporalOperator.after(exp1, prop.literal) else FastFilterFactory.super.after(exp1, exp2, matchAction) } }
54 25711 2826 - 2862 Apply org.geotools.filter.FilterFactoryImpl.after FastFilterFactory.super.after(exp1, exp2, matchAction)
54 25712 2826 - 2862 Block org.geotools.filter.FilterFactoryImpl.after FastFilterFactory.super.after(exp1, exp2, matchAction)
56 25735 2888 - 3501 Block <nosymbol> { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(classOf[java.util.Date].isAssignableFrom(descriptor.getType().getBinding()))) if (prop.flipped) org.locationtech.geomesa.filter.expression.FastTemporalOperator.after(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastTemporalOperator.after(exp1, prop.literal) else FastFilterFactory.super.after(exp1, exp2, matchAction) }
58 25713 2973 - 2979 Select org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral.name p.name
58 25714 2964 - 2980 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
58 25715 2964 - 2980 Block org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
59 25716 3020 - 3030 Select org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
59 25717 3020 - 3030 Block org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
61 25718 3111 - 3120 Select org.locationtech.geomesa.filter.expression.AttributeExpression.name prop.name
61 25719 3070 - 3121 Apply org.geotools.api.feature.simple.SimpleFeatureType.getDescriptor FastFilterFactory.sfts.get().getDescriptor(prop.name)
62 25720 3150 - 3154 Literal <nosymbol> null
62 25721 3158 - 3181 Literal <nosymbol> classOf[java.util.Date]
62 25722 3199 - 3228 Apply org.geotools.api.feature.type.PropertyType.getBinding descriptor.getType().getBinding()
62 25723 3158 - 3229 Apply java.lang.Class.isAssignableFrom classOf[java.util.Date].isAssignableFrom(descriptor.getType().getBinding())
62 25724 3136 - 3229 Apply scala.Boolean.&& descriptor.!=(null).&&(classOf[java.util.Date].isAssignableFrom(descriptor.getType().getBinding()))
63 25725 3249 - 3261 Select org.locationtech.geomesa.filter.expression.AttributeExpression.flipped prop.flipped
63 25732 3245 - 3421 If <nosymbol> if (prop.flipped) org.locationtech.geomesa.filter.expression.FastTemporalOperator.after(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastTemporalOperator.after(exp1, prop.literal)
64 25726 3306 - 3318 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
64 25727 3279 - 3325 Apply org.locationtech.geomesa.filter.expression.FastTemporalOperator.after org.locationtech.geomesa.filter.expression.FastTemporalOperator.after(prop.literal, exp1)
64 25728 3279 - 3325 Block org.locationtech.geomesa.filter.expression.FastTemporalOperator.after org.locationtech.geomesa.filter.expression.FastTemporalOperator.after(prop.literal, exp1)
66 25729 3394 - 3406 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
66 25730 3361 - 3407 Apply org.locationtech.geomesa.filter.expression.FastTemporalOperator.after org.locationtech.geomesa.filter.expression.FastTemporalOperator.after(exp1, prop.literal)
66 25731 3361 - 3407 Block org.locationtech.geomesa.filter.expression.FastTemporalOperator.after org.locationtech.geomesa.filter.expression.FastTemporalOperator.after(exp1, prop.literal)
69 25733 3453 - 3489 Apply org.geotools.filter.FilterFactoryImpl.after FastFilterFactory.super.after(exp1, exp2, matchAction)
69 25734 3453 - 3489 Block org.geotools.filter.FilterFactoryImpl.after FastFilterFactory.super.after(exp1, exp2, matchAction)
75 25737 3589 - 3624 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.before FastFilterFactory.this.before(exp1, exp2, ANY)
78 25738 3730 - 3760 Apply java.lang.Object.!= matchAction.!=(ANY)
79 25739 3770 - 3807 Apply org.geotools.filter.FilterFactoryImpl.before FastFilterFactory.super.before(exp1, exp2, matchAction)
79 25740 3770 - 3807 Block org.geotools.filter.FilterFactoryImpl.before FastFilterFactory.super.before(exp1, exp2, matchAction)
81 25741 3827 - 3881 Apply org.locationtech.geomesa.filter.checkOrder org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2)
81 25767 3827 - 4608 Match <nosymbol> org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2) match { case scala.None => FastFilterFactory.super.before(exp1, exp2, matchAction) case (value: org.locationtech.geomesa.filter.expression.AttributeExpression)Some[org.locationtech.geomesa.filter.expression.AttributeExpression]((prop @ _)) => { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(classOf[java.util.Date].isAssignableFrom(descriptor.getType().getBinding()))) if (prop.flipped) org.locationtech.geomesa.filter.expression.FastTemporalOperator.before(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastTemporalOperator.before(exp1, prop.literal) else FastFilterFactory.super.before(exp1, exp2, matchAction) } }
83 25742 3921 - 3958 Apply org.geotools.filter.FilterFactoryImpl.before FastFilterFactory.super.before(exp1, exp2, matchAction)
83 25743 3921 - 3958 Block org.geotools.filter.FilterFactoryImpl.before FastFilterFactory.super.before(exp1, exp2, matchAction)
85 25766 3984 - 4600 Block <nosymbol> { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(classOf[java.util.Date].isAssignableFrom(descriptor.getType().getBinding()))) if (prop.flipped) org.locationtech.geomesa.filter.expression.FastTemporalOperator.before(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastTemporalOperator.before(exp1, prop.literal) else FastFilterFactory.super.before(exp1, exp2, matchAction) }
87 25744 4069 - 4075 Select org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral.name p.name
87 25745 4060 - 4076 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
87 25746 4060 - 4076 Block org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
88 25747 4116 - 4126 Select org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
88 25748 4116 - 4126 Block org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
90 25749 4207 - 4216 Select org.locationtech.geomesa.filter.expression.AttributeExpression.name prop.name
90 25750 4166 - 4217 Apply org.geotools.api.feature.simple.SimpleFeatureType.getDescriptor FastFilterFactory.sfts.get().getDescriptor(prop.name)
91 25751 4246 - 4250 Literal <nosymbol> null
91 25752 4254 - 4277 Literal <nosymbol> classOf[java.util.Date]
91 25753 4295 - 4324 Apply org.geotools.api.feature.type.PropertyType.getBinding descriptor.getType().getBinding()
91 25754 4254 - 4325 Apply java.lang.Class.isAssignableFrom classOf[java.util.Date].isAssignableFrom(descriptor.getType().getBinding())
91 25755 4232 - 4325 Apply scala.Boolean.&& descriptor.!=(null).&&(classOf[java.util.Date].isAssignableFrom(descriptor.getType().getBinding()))
92 25756 4345 - 4357 Select org.locationtech.geomesa.filter.expression.AttributeExpression.flipped prop.flipped
92 25763 4341 - 4519 If <nosymbol> if (prop.flipped) org.locationtech.geomesa.filter.expression.FastTemporalOperator.before(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastTemporalOperator.before(exp1, prop.literal)
93 25757 4403 - 4415 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
93 25758 4375 - 4422 Apply org.locationtech.geomesa.filter.expression.FastTemporalOperator.before org.locationtech.geomesa.filter.expression.FastTemporalOperator.before(prop.literal, exp1)
93 25759 4375 - 4422 Block org.locationtech.geomesa.filter.expression.FastTemporalOperator.before org.locationtech.geomesa.filter.expression.FastTemporalOperator.before(prop.literal, exp1)
95 25760 4492 - 4504 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
95 25761 4458 - 4505 Apply org.locationtech.geomesa.filter.expression.FastTemporalOperator.before org.locationtech.geomesa.filter.expression.FastTemporalOperator.before(exp1, prop.literal)
95 25762 4458 - 4505 Block org.locationtech.geomesa.filter.expression.FastTemporalOperator.before org.locationtech.geomesa.filter.expression.FastTemporalOperator.before(exp1, prop.literal)
98 25764 4551 - 4588 Apply org.geotools.filter.FilterFactoryImpl.before FastFilterFactory.super.before(exp1, exp2, matchAction)
98 25765 4551 - 4588 Block org.geotools.filter.FilterFactoryImpl.before FastFilterFactory.super.before(exp1, exp2, matchAction)
105 25768 4708 - 4746 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.greater FastFilterFactory.this.greater(exp1, exp2, false)
109 25769 4898 - 4945 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.greater FastFilterFactory.this.greater(exp1, exp2, matchCase, ANY)
115 25770 5156 - 5186 Apply java.lang.Object.!= matchAction.!=(ANY)
116 25771 5196 - 5245 Apply org.geotools.filter.FilterFactoryImpl.greater FastFilterFactory.super.greater(exp1, exp2, matchCase, matchAction)
116 25772 5196 - 5245 Block org.geotools.filter.FilterFactoryImpl.greater FastFilterFactory.super.greater(exp1, exp2, matchCase, matchAction)
118 25773 5265 - 5319 Apply org.locationtech.geomesa.filter.checkOrder org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2)
118 25799 5265 - 6083 Match <nosymbol> org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2) match { case scala.None => FastFilterFactory.super.greater(exp1, exp2, matchCase, matchAction) case (value: org.locationtech.geomesa.filter.expression.AttributeExpression)Some[org.locationtech.geomesa.filter.expression.AttributeExpression]((prop @ _)) => { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding()))) if (prop.flipped) org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThan(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThan(exp1, prop.literal) else FastFilterFactory.super.greater(exp1, exp2, matchCase, matchAction) } }
120 25774 5359 - 5408 Apply org.geotools.filter.FilterFactoryImpl.greater FastFilterFactory.super.greater(exp1, exp2, matchCase, matchAction)
120 25775 5359 - 5408 Block org.geotools.filter.FilterFactoryImpl.greater FastFilterFactory.super.greater(exp1, exp2, matchCase, matchAction)
122 25798 5434 - 6075 Block <nosymbol> { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding()))) if (prop.flipped) org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThan(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThan(exp1, prop.literal) else FastFilterFactory.super.greater(exp1, exp2, matchCase, matchAction) }
124 25776 5519 - 5525 Select org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral.name p.name
124 25777 5510 - 5526 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
124 25778 5510 - 5526 Block org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
125 25779 5566 - 5576 Select org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
125 25780 5566 - 5576 Block org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
127 25781 5657 - 5666 Select org.locationtech.geomesa.filter.expression.AttributeExpression.name prop.name
127 25782 5616 - 5667 Apply org.geotools.api.feature.simple.SimpleFeatureType.getDescriptor FastFilterFactory.sfts.get().getDescriptor(prop.name)
128 25783 5696 - 5700 Literal <nosymbol> null
128 25784 5704 - 5726 Literal <nosymbol> classOf[java.lang.Comparable]
128 25785 5744 - 5773 Apply org.geotools.api.feature.type.PropertyType.getBinding descriptor.getType().getBinding()
128 25786 5704 - 5774 Apply java.lang.Class.isAssignableFrom classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding())
128 25787 5682 - 5774 Apply scala.Boolean.&& descriptor.!=(null).&&(classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding()))
129 25788 5794 - 5806 Select org.locationtech.geomesa.filter.expression.AttributeExpression.flipped prop.flipped
129 25795 5790 - 5982 If <nosymbol> if (prop.flipped) org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThan(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThan(exp1, prop.literal)
130 25789 5859 - 5871 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
130 25790 5824 - 5878 Apply org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThan org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThan(prop.literal, exp1)
130 25791 5824 - 5878 Block org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThan org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThan(prop.literal, exp1)
132 25792 5955 - 5967 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
132 25793 5914 - 5968 Apply org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThan org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThan(exp1, prop.literal)
132 25794 5914 - 5968 Block org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThan org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThan(exp1, prop.literal)
135 25796 6014 - 6063 Apply org.geotools.filter.FilterFactoryImpl.greater FastFilterFactory.super.greater(exp1, exp2, matchCase, matchAction)
135 25797 6014 - 6063 Block org.geotools.filter.FilterFactoryImpl.greater FastFilterFactory.super.greater(exp1, exp2, matchCase, matchAction)
142 25800 6199 - 6244 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.greaterOrEqual FastFilterFactory.this.greaterOrEqual(exp1, exp2, false)
147 25801 6430 - 6484 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.greaterOrEqual FastFilterFactory.this.greaterOrEqual(exp1, exp2, matchCase, ANY)
153 25802 6732 - 6762 Apply java.lang.Object.!= matchAction.!=(ANY)
154 25803 6772 - 6828 Apply org.geotools.filter.FilterFactoryImpl.greaterOrEqual FastFilterFactory.super.greaterOrEqual(exp1, exp2, matchCase, matchAction)
154 25804 6772 - 6828 Block org.geotools.filter.FilterFactoryImpl.greaterOrEqual FastFilterFactory.super.greaterOrEqual(exp1, exp2, matchCase, matchAction)
156 25805 6848 - 6902 Apply org.locationtech.geomesa.filter.checkOrder org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2)
156 25831 6848 - 7694 Match <nosymbol> org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2) match { case scala.None => FastFilterFactory.super.greaterOrEqual(exp1, exp2, matchCase, matchAction) case (value: org.locationtech.geomesa.filter.expression.AttributeExpression)Some[org.locationtech.geomesa.filter.expression.AttributeExpression]((prop @ _)) => { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding()))) if (prop.flipped) org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThanOrEqual(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThanOrEqual(exp1, prop.literal) else FastFilterFactory.super.greaterOrEqual(exp1, exp2, matchCase, matchAction) } }
158 25806 6942 - 6998 Apply org.geotools.filter.FilterFactoryImpl.greaterOrEqual FastFilterFactory.super.greaterOrEqual(exp1, exp2, matchCase, matchAction)
158 25807 6942 - 6998 Block org.geotools.filter.FilterFactoryImpl.greaterOrEqual FastFilterFactory.super.greaterOrEqual(exp1, exp2, matchCase, matchAction)
160 25830 7024 - 7686 Block <nosymbol> { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding()))) if (prop.flipped) org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThanOrEqual(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThanOrEqual(exp1, prop.literal) else FastFilterFactory.super.greaterOrEqual(exp1, exp2, matchCase, matchAction) }
162 25808 7109 - 7115 Select org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral.name p.name
162 25809 7100 - 7116 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
162 25810 7100 - 7116 Block org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
163 25811 7156 - 7166 Select org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
163 25812 7156 - 7166 Block org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
165 25813 7247 - 7256 Select org.locationtech.geomesa.filter.expression.AttributeExpression.name prop.name
165 25814 7206 - 7257 Apply org.geotools.api.feature.simple.SimpleFeatureType.getDescriptor FastFilterFactory.sfts.get().getDescriptor(prop.name)
166 25815 7286 - 7290 Literal <nosymbol> null
166 25816 7294 - 7316 Literal <nosymbol> classOf[java.lang.Comparable]
166 25817 7334 - 7363 Apply org.geotools.api.feature.type.PropertyType.getBinding descriptor.getType().getBinding()
166 25818 7294 - 7364 Apply java.lang.Class.isAssignableFrom classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding())
166 25819 7272 - 7364 Apply scala.Boolean.&& descriptor.!=(null).&&(classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding()))
167 25820 7384 - 7396 Select org.locationtech.geomesa.filter.expression.AttributeExpression.flipped prop.flipped
167 25827 7380 - 7586 If <nosymbol> if (prop.flipped) org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThanOrEqual(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThanOrEqual(exp1, prop.literal)
168 25821 7456 - 7468 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
168 25822 7414 - 7475 Apply org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThanOrEqual org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThanOrEqual(prop.literal, exp1)
168 25823 7414 - 7475 Block org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThanOrEqual org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThanOrEqual(prop.literal, exp1)
170 25824 7559 - 7571 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
170 25825 7511 - 7572 Apply org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThanOrEqual org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThanOrEqual(exp1, prop.literal)
170 25826 7511 - 7572 Block org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThanOrEqual org.locationtech.geomesa.filter.expression.FastComparisonOperator.greaterThanOrEqual(exp1, prop.literal)
173 25828 7618 - 7674 Apply org.geotools.filter.FilterFactoryImpl.greaterOrEqual FastFilterFactory.super.greaterOrEqual(exp1, exp2, matchCase, matchAction)
173 25829 7618 - 7674 Block org.geotools.filter.FilterFactoryImpl.greaterOrEqual FastFilterFactory.super.greaterOrEqual(exp1, exp2, matchCase, matchAction)
179 25832 7784 - 7819 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.less FastFilterFactory.this.less(exp1, exp2, false)
183 25833 7959 - 8003 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.less FastFilterFactory.this.less(exp1, exp2, matchCase, ANY)
189 25834 8199 - 8229 Apply java.lang.Object.!= matchAction.!=(ANY)
190 25835 8239 - 8285 Apply org.geotools.filter.FilterFactoryImpl.less FastFilterFactory.super.less(exp1, exp2, matchCase, matchAction)
190 25836 8239 - 8285 Block org.geotools.filter.FilterFactoryImpl.less FastFilterFactory.super.less(exp1, exp2, matchCase, matchAction)
192 25837 8305 - 8359 Apply org.locationtech.geomesa.filter.checkOrder org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2)
192 25863 8305 - 9111 Match <nosymbol> org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2) match { case scala.None => FastFilterFactory.super.less(exp1, exp2, matchCase, matchAction) case (value: org.locationtech.geomesa.filter.expression.AttributeExpression)Some[org.locationtech.geomesa.filter.expression.AttributeExpression]((prop @ _)) => { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding()))) if (prop.flipped) org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThan(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThan(exp1, prop.literal) else FastFilterFactory.super.less(exp1, exp2, matchCase, matchAction) } }
194 25838 8399 - 8445 Apply org.geotools.filter.FilterFactoryImpl.less FastFilterFactory.super.less(exp1, exp2, matchCase, matchAction)
194 25839 8399 - 8445 Block org.geotools.filter.FilterFactoryImpl.less FastFilterFactory.super.less(exp1, exp2, matchCase, matchAction)
196 25862 8471 - 9103 Block <nosymbol> { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding()))) if (prop.flipped) org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThan(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThan(exp1, prop.literal) else FastFilterFactory.super.less(exp1, exp2, matchCase, matchAction) }
198 25840 8556 - 8562 Select org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral.name p.name
198 25841 8547 - 8563 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
198 25842 8547 - 8563 Block org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
199 25843 8603 - 8613 Select org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
199 25844 8603 - 8613 Block org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
201 25845 8694 - 8703 Select org.locationtech.geomesa.filter.expression.AttributeExpression.name prop.name
201 25846 8653 - 8704 Apply org.geotools.api.feature.simple.SimpleFeatureType.getDescriptor FastFilterFactory.sfts.get().getDescriptor(prop.name)
202 25847 8733 - 8737 Literal <nosymbol> null
202 25848 8741 - 8763 Literal <nosymbol> classOf[java.lang.Comparable]
202 25849 8781 - 8810 Apply org.geotools.api.feature.type.PropertyType.getBinding descriptor.getType().getBinding()
202 25850 8741 - 8811 Apply java.lang.Class.isAssignableFrom classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding())
202 25851 8719 - 8811 Apply scala.Boolean.&& descriptor.!=(null).&&(classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding()))
203 25852 8831 - 8843 Select org.locationtech.geomesa.filter.expression.AttributeExpression.flipped prop.flipped
203 25859 8827 - 9013 If <nosymbol> if (prop.flipped) org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThan(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThan(exp1, prop.literal)
204 25853 8893 - 8905 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
204 25854 8861 - 8912 Apply org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThan org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThan(prop.literal, exp1)
204 25855 8861 - 8912 Block org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThan org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThan(prop.literal, exp1)
206 25856 8986 - 8998 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
206 25857 8948 - 8999 Apply org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThan org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThan(exp1, prop.literal)
206 25858 8948 - 8999 Block org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThan org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThan(exp1, prop.literal)
209 25860 9045 - 9091 Apply org.geotools.filter.FilterFactoryImpl.less FastFilterFactory.super.less(exp1, exp2, matchCase, matchAction)
209 25861 9045 - 9091 Block org.geotools.filter.FilterFactoryImpl.less FastFilterFactory.super.less(exp1, exp2, matchCase, matchAction)
216 25864 9221 - 9263 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.lessOrEqual FastFilterFactory.this.lessOrEqual(exp1, exp2, false)
221 25865 9437 - 9488 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.lessOrEqual FastFilterFactory.this.lessOrEqual(exp1, exp2, matchCase, ANY)
227 25866 9721 - 9751 Apply java.lang.Object.!= matchAction.!=(ANY)
228 25867 9761 - 9814 Apply org.geotools.filter.FilterFactoryImpl.lessOrEqual FastFilterFactory.super.lessOrEqual(exp1, exp2, matchCase, matchAction)
228 25868 9761 - 9814 Block org.geotools.filter.FilterFactoryImpl.lessOrEqual FastFilterFactory.super.lessOrEqual(exp1, exp2, matchCase, matchAction)
230 25869 9834 - 9888 Apply org.locationtech.geomesa.filter.checkOrder org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2)
230 25895 9834 - 10668 Match <nosymbol> org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2) match { case scala.None => FastFilterFactory.super.lessOrEqual(exp1, exp2, matchCase, matchAction) case (value: org.locationtech.geomesa.filter.expression.AttributeExpression)Some[org.locationtech.geomesa.filter.expression.AttributeExpression]((prop @ _)) => { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding()))) if (prop.flipped) org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThanOrEqual(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThanOrEqual(exp1, prop.literal) else FastFilterFactory.super.lessOrEqual(exp1, exp2, matchCase, matchAction) } }
232 25870 9928 - 9981 Apply org.geotools.filter.FilterFactoryImpl.lessOrEqual FastFilterFactory.super.lessOrEqual(exp1, exp2, matchCase, matchAction)
232 25871 9928 - 9981 Block org.geotools.filter.FilterFactoryImpl.lessOrEqual FastFilterFactory.super.lessOrEqual(exp1, exp2, matchCase, matchAction)
234 25894 10007 - 10660 Block <nosymbol> { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding()))) if (prop.flipped) org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThanOrEqual(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThanOrEqual(exp1, prop.literal) else FastFilterFactory.super.lessOrEqual(exp1, exp2, matchCase, matchAction) }
236 25872 10092 - 10098 Select org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral.name p.name
236 25873 10083 - 10099 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
236 25874 10083 - 10099 Block org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
237 25875 10139 - 10149 Select org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
237 25876 10139 - 10149 Block org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
239 25877 10230 - 10239 Select org.locationtech.geomesa.filter.expression.AttributeExpression.name prop.name
239 25878 10189 - 10240 Apply org.geotools.api.feature.simple.SimpleFeatureType.getDescriptor FastFilterFactory.sfts.get().getDescriptor(prop.name)
240 25879 10269 - 10273 Literal <nosymbol> null
240 25880 10277 - 10299 Literal <nosymbol> classOf[java.lang.Comparable]
240 25881 10317 - 10346 Apply org.geotools.api.feature.type.PropertyType.getBinding descriptor.getType().getBinding()
240 25882 10277 - 10347 Apply java.lang.Class.isAssignableFrom classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding())
240 25883 10255 - 10347 Apply scala.Boolean.&& descriptor.!=(null).&&(classOf[java.lang.Comparable].isAssignableFrom(descriptor.getType().getBinding()))
241 25884 10367 - 10379 Select org.locationtech.geomesa.filter.expression.AttributeExpression.flipped prop.flipped
241 25891 10363 - 10563 If <nosymbol> if (prop.flipped) org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThanOrEqual(prop.literal, exp1) else org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThanOrEqual(exp1, prop.literal)
242 25885 10436 - 10448 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
242 25886 10397 - 10455 Apply org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThanOrEqual org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThanOrEqual(prop.literal, exp1)
242 25887 10397 - 10455 Block org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThanOrEqual org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThanOrEqual(prop.literal, exp1)
244 25888 10536 - 10548 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
244 25889 10491 - 10549 Apply org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThanOrEqual org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThanOrEqual(exp1, prop.literal)
244 25890 10491 - 10549 Block org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThanOrEqual org.locationtech.geomesa.filter.expression.FastComparisonOperator.lessThanOrEqual(exp1, prop.literal)
247 25892 10595 - 10648 Apply org.geotools.filter.FilterFactoryImpl.lessOrEqual FastFilterFactory.super.lessOrEqual(exp1, exp2, matchCase, matchAction)
247 25893 10595 - 10648 Block org.geotools.filter.FilterFactoryImpl.lessOrEqual FastFilterFactory.super.lessOrEqual(exp1, exp2, matchCase, matchAction)
254 25896 10750 - 10776 Apply java.lang.ThreadLocal.get FastFilterFactory.sfts.get()
255 25897 10793 - 10810 Apply java.lang.String.indexOf name.indexOf(":")
256 25898 10831 - 10842 Apply scala.Int.== colon.==(-1)
256 25899 10846 - 10850 Ident org.locationtech.geomesa.filter.factory.FastFilterFactory.name name
256 25900 10875 - 10884 Apply scala.Int.+ colon.+(1)
256 25901 10860 - 10885 Apply java.lang.String.substring name.substring(colon.+(1))
256 25902 10860 - 10885 Block java.lang.String.substring name.substring(colon.+(1))
257 25903 10904 - 10922 Apply org.geotools.api.feature.simple.SimpleFeatureType.indexOf sft.indexOf(local)
258 25904 10931 - 10942 Apply scala.Int.!= index.!=(-1)
259 25905 10952 - 10994 Apply org.locationtech.geomesa.filter.expression.FastPropertyName.FastPropertyNameAttribute.<init> new org.locationtech.geomesa.filter.expression.FastPropertyName.FastPropertyNameAttribute(name, index)
259 25906 10952 - 10994 Block org.locationtech.geomesa.filter.expression.FastPropertyName.FastPropertyNameAttribute.<init> new org.locationtech.geomesa.filter.expression.FastPropertyName.FastPropertyNameAttribute(name, index)
260 25911 11006 - 11333 Block <nosymbol> { val sf: org.geotools.api.feature.simple.SimpleFeature = new org.geotools.feature.simple.SimpleFeatureBuilder(sft).buildFeature(""); val accessor: org.geotools.filter.expression.PropertyAccessor = org.locationtech.geomesa.utils.geotools.SimpleFeaturePropertyAccessor.getAccessor(sf, name).getOrElse[org.geotools.filter.expression.PropertyAccessor](throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Property \'", "\' does not exist in feature type ", "").s(name, sft.getTypeName()))); new org.locationtech.geomesa.filter.expression.FastPropertyName.FastPropertyNameAccessor(name, accessor) }
261 25907 11023 - 11069 Apply org.geotools.feature.simple.SimpleFeatureBuilder.buildFeature new org.geotools.feature.simple.SimpleFeatureBuilder(sft).buildFeature("")
262 25909 11091 - 11276 Apply scala.Option.getOrElse org.locationtech.geomesa.utils.geotools.SimpleFeaturePropertyAccessor.getAccessor(sf, name).getOrElse[org.geotools.filter.expression.PropertyAccessor](throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Property \'", "\' does not exist in feature type ", "").s(name, sft.getTypeName())))
263 25908 11163 - 11268 Throw <nosymbol> throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Property \'", "\' does not exist in feature type ", "").s(name, sft.getTypeName()))
265 25910 11283 - 11327 Apply org.locationtech.geomesa.filter.expression.FastPropertyName.FastPropertyNameAccessor.<init> new org.locationtech.geomesa.filter.expression.FastPropertyName.FastPropertyNameAccessor(name, accessor)
269 25912 11400 - 11417 Apply org.geotools.api.feature.type.Name.getLocalPart name.getLocalPart()
269 25913 11391 - 11418 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(name.getLocalPart())
271 25914 11510 - 11524 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(name)
273 25915 11575 - 11604 Apply java.util.Arrays.asList java.util.Arrays.asList[org.geotools.api.filter.Filter](f, g)
273 25916 11572 - 11605 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.or FastFilterFactory.this.or(java.util.Arrays.asList[org.geotools.api.filter.Filter](f, g))
276 25917 11674 - 11689 Apply java.util.List.isEmpty filters.isEmpty()
276 25920 11670 - 11670 Literal <nosymbol> ()
276 25921 11670 - 11670 Block <nosymbol> ()
277 25918 11706 - 11723 Apply org.geotools.filter.FilterFactoryImpl.or FastFilterFactory.super.or(filters)
277 25919 11699 - 11723 Return org.locationtech.geomesa.filter.factory.FastFilterFactory.or return FastFilterFactory.super.or(filters)
280 25922 11775 - 11796 Select scala.collection.SeqLike.toSeq scala.collection.JavaConverters.asScalaBufferConverter[org.geotools.api.filter.Filter](filters).asScala.toSeq
280 25923 11752 - 11797 Apply org.locationtech.geomesa.filter.FilterHelper.flattenOr org.locationtech.geomesa.filter.FilterHelper.flattenOr(scala.collection.JavaConverters.asScalaBufferConverter[org.geotools.api.filter.Filter](filters).asScala.toSeq)
282 25924 11815 - 11861 TypeApply scala.collection.mutable.HashSet.empty scala.collection.mutable.HashSet.empty[String]
283 25925 11881 - 11934 TypeApply scala.collection.immutable.HashSet.newBuilder scala.collection.immutable.HashSet.newBuilder[AnyRef]
284 25926 11957 - 11974 Select scala.collection.mutable.ListBuffer.length predicates.length
284 25927 11939 - 11975 Apply scala.collection.mutable.Builder.sizeHint literals.sizeHint(predicates.length)
286 25928 11992 - 12011 Select scala.collection.mutable.ListBuffer.iterator predicates.iterator
287 25929 12023 - 12035 Select scala.collection.Iterator.hasNext iter.hasNext
287 25948 12045 - 12488 Block <nosymbol> { iter.next() match { case (p @ (_: org.geotools.api.filter.PropertyIsEqualTo)) if p.getMatchAction().==(ANY).&&(p.isMatchingCase()) => org.locationtech.geomesa.filter.`package`.checkOrder(p.getExpression1(), p.getExpression2()) match { case (value: org.locationtech.geomesa.filter.expression.AttributeExpression)Some[org.locationtech.geomesa.filter.expression.AttributeExpression]((name: String, literal: org.geotools.api.filter.expression.Literal, flipped: Boolean)org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral((name @ _), (lit @ _), _)) if props.add(name).unary_!.||(props.size.==(1)) => literals.+=(lit.getValue()) case _ => return FastFilterFactory.super.or(filters) } case _ => return FastFilterFactory.super.or(filters) }; while$1() }
287 25949 12016 - 12016 Literal <nosymbol> ()
287 25950 12016 - 12016 Block <nosymbol> ()
288 25930 12045 - 12056 Apply scala.collection.Iterator.next iter.next()
288 25947 12057 - 12057 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.while$1 while$1()
289 25931 12122 - 12137 Literal <nosymbol> ANY
289 25932 12141 - 12157 Apply org.geotools.api.filter.BinaryComparisonOperator.isMatchingCase p.isMatchingCase()
289 25933 12102 - 12157 Apply scala.Boolean.&& p.getMatchAction().==(ANY).&&(p.isMatchingCase())
290 25934 12214 - 12230 Apply org.geotools.api.filter.BinaryComparisonOperator.getExpression1 p.getExpression1()
290 25935 12232 - 12248 Apply org.geotools.api.filter.BinaryComparisonOperator.getExpression2 p.getExpression2()
290 25936 12171 - 12249 Apply org.locationtech.geomesa.filter.checkOrder org.locationtech.geomesa.filter.`package`.checkOrder(p.getExpression1(), p.getExpression2())
290 25944 12171 - 12436 Match <nosymbol> org.locationtech.geomesa.filter.`package`.checkOrder(p.getExpression1(), p.getExpression2()) match { case (value: org.locationtech.geomesa.filter.expression.AttributeExpression)Some[org.locationtech.geomesa.filter.expression.AttributeExpression]((name: String, literal: org.geotools.api.filter.expression.Literal, flipped: Boolean)org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral((name @ _), (lit @ _), _)) if props.add(name).unary_!.||(props.size.==(1)) => literals.+=(lit.getValue()) case _ => return FastFilterFactory.super.or(filters) }
291 25937 12334 - 12349 Apply scala.Int.== props.size.==(1)
291 25938 12314 - 12349 Apply scala.Boolean.|| props.add(name).unary_!.||(props.size.==(1))
291 25939 12365 - 12377 Apply org.geotools.api.filter.expression.Literal.getValue lit.getValue()
291 25940 12353 - 12377 Apply scala.collection.mutable.Builder.+= literals.+=(lit.getValue())
291 25941 12353 - 12377 Block scala.collection.mutable.Builder.+= literals.+=(lit.getValue())
292 25942 12407 - 12424 Apply org.geotools.filter.FilterFactoryImpl.or FastFilterFactory.super.or(filters)
292 25943 12400 - 12424 Return org.locationtech.geomesa.filter.factory.FastFilterFactory.or return FastFilterFactory.super.or(filters)
295 25945 12463 - 12480 Apply org.geotools.filter.FilterFactoryImpl.or FastFilterFactory.super.or(filters)
295 25946 12456 - 12480 Return org.locationtech.geomesa.filter.factory.FastFilterFactory.or return FastFilterFactory.super.or(filters)
300 25951 12636 - 12646 Select scala.collection.IterableLike.head props.head
300 25952 12627 - 12647 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(props.head)
301 25953 12665 - 12680 Apply scala.collection.mutable.Builder.result literals.result()
302 25954 12750 - 12760 Select scala.collection.IterableLike.head props.head
302 25955 12709 - 12761 Apply org.geotools.api.feature.simple.SimpleFeatureType.getDescriptor FastFilterFactory.sfts.get().getDescriptor(props.head)
302 25956 12770 - 12778 Select org.locationtech.geomesa.utils.geotools.RichAttributeDescriptors.RichAttributeDescriptor.isList org.locationtech.geomesa.utils.geotools.RichAttributeDescriptors.RichAttributeDescriptor(x$1).isList
302 25957 12702 - 12779 Apply scala.Option.exists scala.Option.apply[org.geotools.api.feature.type.AttributeDescriptor](FastFilterFactory.sfts.get().getDescriptor(props.head)).exists(((x$1: org.geotools.api.feature.type.AttributeDescriptor) => org.locationtech.geomesa.utils.geotools.RichAttributeDescriptors.RichAttributeDescriptor(x$1).isList))
304 25958 12804 - 12838 Select org.locationtech.geomesa.utils.conf.GeoMesaSystemProperties.SystemProperty.get org.locationtech.geomesa.filter.expression.OrHashEquality.OrHashThreshold.get
304 25959 12804 - 12844 Select scala.collection.immutable.StringLike.toInt scala.Predef.augmentString(org.locationtech.geomesa.filter.expression.OrHashEquality.OrHashThreshold.get).toInt
304 25960 12789 - 12844 Apply scala.Int.>= values.size.>=(scala.Predef.augmentString(org.locationtech.geomesa.filter.expression.OrHashEquality.OrHashThreshold.get).toInt)
305 25965 12854 - 12980 If <nosymbol> if (isListType) new org.locationtech.geomesa.filter.expression.OrHashEquality.OrHashListEquality(prop, values) else new org.locationtech.geomesa.filter.expression.OrHashEquality(prop, values)
306 25961 12880 - 12916 Apply org.locationtech.geomesa.filter.expression.OrHashEquality.OrHashListEquality.<init> new org.locationtech.geomesa.filter.expression.OrHashEquality.OrHashListEquality(prop, values)
306 25962 12880 - 12916 Block org.locationtech.geomesa.filter.expression.OrHashEquality.OrHashListEquality.<init> new org.locationtech.geomesa.filter.expression.OrHashEquality.OrHashListEquality(prop, values)
308 25963 12940 - 12972 Apply org.locationtech.geomesa.filter.expression.OrHashEquality.<init> new org.locationtech.geomesa.filter.expression.OrHashEquality(prop, values)
308 25964 12940 - 12972 Block org.locationtech.geomesa.filter.expression.OrHashEquality.<init> new org.locationtech.geomesa.filter.expression.OrHashEquality(prop, values)
310 25972 12992 - 13134 If <nosymbol> if (isListType) new org.locationtech.geomesa.filter.expression.OrSequentialEquality.OrSequentialListEquality(prop, values.toSeq) else new org.locationtech.geomesa.filter.expression.OrSequentialEquality(prop, values.toSeq)
311 25966 13051 - 13063 Select scala.collection.SetLike.toSeq values.toSeq
311 25967 13016 - 13064 Apply org.locationtech.geomesa.filter.expression.OrSequentialEquality.OrSequentialListEquality.<init> new org.locationtech.geomesa.filter.expression.OrSequentialEquality.OrSequentialListEquality(prop, values.toSeq)
311 25968 13016 - 13064 Block org.locationtech.geomesa.filter.expression.OrSequentialEquality.OrSequentialListEquality.<init> new org.locationtech.geomesa.filter.expression.OrSequentialEquality.OrSequentialListEquality(prop, values.toSeq)
313 25969 13115 - 13127 Select scala.collection.SetLike.toSeq values.toSeq
313 25970 13084 - 13128 Apply org.locationtech.geomesa.filter.expression.OrSequentialEquality.<init> new org.locationtech.geomesa.filter.expression.OrSequentialEquality(prop, values.toSeq)
313 25971 13084 - 13128 Block org.locationtech.geomesa.filter.expression.OrSequentialEquality.<init> new org.locationtech.geomesa.filter.expression.OrSequentialEquality(prop, values.toSeq)
318 25973 13223 - 13275 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.equal FastFilterFactory.this.equal(exp1, exp2, true, ANY)
321 25974 13379 - 13424 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.equal FastFilterFactory.this.equal(exp1, exp2, matchCase, ANY)
324 25975 13560 - 13590 Apply java.lang.Object.!= matchAction.!=(ANY)
325 25976 13600 - 13647 Apply org.geotools.filter.FilterFactoryImpl.equal FastFilterFactory.super.equal(exp1, exp2, matchCase, matchAction)
325 25977 13600 - 13647 Block org.geotools.filter.FilterFactoryImpl.equal FastFilterFactory.super.equal(exp1, exp2, matchCase, matchAction)
327 25978 13667 - 13721 Apply org.locationtech.geomesa.filter.checkOrder org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2)
327 26002 13667 - 14364 Match <nosymbol> org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2) match { case scala.None => FastFilterFactory.super.equal(exp1, exp2, matchCase, matchAction) case (value: org.locationtech.geomesa.filter.expression.AttributeExpression)Some[org.locationtech.geomesa.filter.expression.AttributeExpression]((prop @ _)) => { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(org.locationtech.geomesa.utils.geotools.RichAttributeDescriptors.RichAttributeDescriptor(descriptor).isList)) new org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastListIsEqualToAny(exp1, prop.literal) else if (matchCase) new org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastIsEqualTo(exp1, prop.literal) else new org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastIsEqualToIgnoreCase(exp1, prop.literal) } }
329 25979 13761 - 13808 Apply org.geotools.filter.FilterFactoryImpl.equal FastFilterFactory.super.equal(exp1, exp2, matchCase, matchAction)
329 25980 13761 - 13808 Block org.geotools.filter.FilterFactoryImpl.equal FastFilterFactory.super.equal(exp1, exp2, matchCase, matchAction)
331 26001 13834 - 14356 Block <nosymbol> { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(org.locationtech.geomesa.utils.geotools.RichAttributeDescriptors.RichAttributeDescriptor(descriptor).isList)) new org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastListIsEqualToAny(exp1, prop.literal) else if (matchCase) new org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastIsEqualTo(exp1, prop.literal) else new org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastIsEqualToIgnoreCase(exp1, prop.literal) }
333 25981 13919 - 13925 Select org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral.name p.name
333 25982 13910 - 13926 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
333 25983 13910 - 13926 Block org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
334 25984 13966 - 13976 Select org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
334 25985 13966 - 13976 Block org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
336 25986 14057 - 14066 Select org.locationtech.geomesa.filter.expression.AttributeExpression.name prop.name
336 25987 14016 - 14067 Apply org.geotools.api.feature.simple.SimpleFeatureType.getDescriptor FastFilterFactory.sfts.get().getDescriptor(prop.name)
337 25988 14096 - 14100 Literal <nosymbol> null
337 25989 14104 - 14121 Select org.locationtech.geomesa.utils.geotools.RichAttributeDescriptors.RichAttributeDescriptor.isList org.locationtech.geomesa.utils.geotools.RichAttributeDescriptors.RichAttributeDescriptor(descriptor).isList
337 25990 14082 - 14121 Apply scala.Boolean.&& descriptor.!=(null).&&(org.locationtech.geomesa.utils.geotools.RichAttributeDescriptors.RichAttributeDescriptor(descriptor).isList)
338 25991 14168 - 14180 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
338 25992 14137 - 14181 Apply org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastListIsEqualToAny.<init> new org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastListIsEqualToAny(exp1, prop.literal)
338 25993 14137 - 14181 Block org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastListIsEqualToAny.<init> new org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastListIsEqualToAny(exp1, prop.literal)
339 26000 14199 - 14356 If <nosymbol> if (matchCase) new org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastIsEqualTo(exp1, prop.literal) else new org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastIsEqualToIgnoreCase(exp1, prop.literal)
340 25994 14252 - 14264 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
340 25995 14228 - 14265 Apply org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastIsEqualTo.<init> new org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastIsEqualTo(exp1, prop.literal)
340 25996 14228 - 14265 Block org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastIsEqualTo.<init> new org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastIsEqualTo(exp1, prop.literal)
342 25997 14331 - 14343 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
342 25998 14297 - 14344 Apply org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastIsEqualToIgnoreCase.<init> new org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastIsEqualToIgnoreCase(exp1, prop.literal)
342 25999 14297 - 14344 Block org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastIsEqualToIgnoreCase.<init> new org.locationtech.geomesa.filter.expression.FastPropertyIsEqualTo.FastIsEqualToIgnoreCase(exp1, prop.literal)
348 26003 14444 - 14479 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.during FastFilterFactory.this.during(exp1, exp2, ANY)
351 26004 14585 - 14615 Apply java.lang.Object.!= matchAction.!=(ANY)
352 26005 14625 - 14662 Apply org.geotools.filter.FilterFactoryImpl.during FastFilterFactory.super.during(exp1, exp2, matchAction)
352 26006 14625 - 14662 Block org.geotools.filter.FilterFactoryImpl.during FastFilterFactory.super.during(exp1, exp2, matchAction)
354 26007 14747 - 14756 Select org.locationtech.geomesa.filter.expression.AttributeExpression.flipped x$2.flipped
354 26008 14682 - 14757 Apply scala.Option.filterNot org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2).filterNot(((x$2: org.locationtech.geomesa.filter.expression.AttributeExpression) => x$2.flipped))
354 26029 14682 - 15353 Match <nosymbol> org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2).filterNot(((x$2: org.locationtech.geomesa.filter.expression.AttributeExpression) => x$2.flipped)) match { case scala.None => FastFilterFactory.super.during(exp1, exp2, matchAction) case (value: org.locationtech.geomesa.filter.expression.AttributeExpression)Some[org.locationtech.geomesa.filter.expression.AttributeExpression]((prop @ _)) => { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(classOf[java.util.Date].isAssignableFrom(descriptor.getType().getBinding()))) org.locationtech.geomesa.filter.expression.FastTemporalOperator.during(exp1, prop.literal) else FastFilterFactory.super.during(exp1, exp2, matchAction) } }
356 26009 14797 - 14834 Apply org.geotools.filter.FilterFactoryImpl.during FastFilterFactory.super.during(exp1, exp2, matchAction)
356 26010 14797 - 14834 Block org.geotools.filter.FilterFactoryImpl.during FastFilterFactory.super.during(exp1, exp2, matchAction)
358 26028 14860 - 15345 Block <nosymbol> { val exp1: org.geotools.api.filter.expression.Expression = prop match { case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral)) => FastFilterFactory.this.property(p.name) case (p @ (_: org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral)) => p.function }; val descriptor: org.geotools.api.feature.type.AttributeDescriptor = FastFilterFactory.sfts.get().getDescriptor(prop.name); if (descriptor.!=(null).&&(classOf[java.util.Date].isAssignableFrom(descriptor.getType().getBinding()))) org.locationtech.geomesa.filter.expression.FastTemporalOperator.during(exp1, prop.literal) else FastFilterFactory.super.during(exp1, exp2, matchAction) }
360 26011 14945 - 14951 Select org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral.name p.name
360 26012 14936 - 14952 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
360 26013 14936 - 14952 Block org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(p.name)
361 26014 14992 - 15002 Select org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
361 26015 14992 - 15002 Block org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral.function p.function
363 26016 15083 - 15092 Select org.locationtech.geomesa.filter.expression.AttributeExpression.name prop.name
363 26017 15042 - 15093 Apply org.geotools.api.feature.simple.SimpleFeatureType.getDescriptor FastFilterFactory.sfts.get().getDescriptor(prop.name)
364 26018 15122 - 15126 Literal <nosymbol> null
364 26019 15130 - 15153 Literal <nosymbol> classOf[java.util.Date]
364 26020 15171 - 15200 Apply org.geotools.api.feature.type.PropertyType.getBinding descriptor.getType().getBinding()
364 26021 15130 - 15201 Apply java.lang.Class.isAssignableFrom classOf[java.util.Date].isAssignableFrom(descriptor.getType().getBinding())
364 26022 15108 - 15201 Apply scala.Boolean.&& descriptor.!=(null).&&(classOf[java.util.Date].isAssignableFrom(descriptor.getType().getBinding()))
365 26023 15251 - 15263 Select org.locationtech.geomesa.filter.expression.AttributeExpression.literal prop.literal
365 26024 15217 - 15264 Apply org.locationtech.geomesa.filter.expression.FastTemporalOperator.during org.locationtech.geomesa.filter.expression.FastTemporalOperator.during(exp1, prop.literal)
365 26025 15217 - 15264 Block org.locationtech.geomesa.filter.expression.FastTemporalOperator.during org.locationtech.geomesa.filter.expression.FastTemporalOperator.during(exp1, prop.literal)
367 26026 15296 - 15333 Apply org.geotools.filter.FilterFactoryImpl.during FastFilterFactory.super.during(exp1, exp2, matchAction)
367 26027 15296 - 15333 Block org.geotools.filter.FilterFactoryImpl.during FastFilterFactory.super.during(exp1, exp2, matchAction)
374 26030 15474 - 15488 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(name)
374 26031 15490 - 15503 Apply org.geotools.filter.FilterFactoryImpl.literal FastFilterFactory.this.literal(geom)
374 26032 15466 - 15521 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.dwithin FastFilterFactory.this.dwithin(FastFilterFactory.this.property(name), FastFilterFactory.this.literal(geom), distance, units)
377 26033 15653 - 15667 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(name)
377 26034 15669 - 15682 Apply org.geotools.filter.FilterFactoryImpl.literal FastFilterFactory.this.literal(geom)
377 26035 15645 - 15708 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.dwithin FastFilterFactory.this.dwithin(FastFilterFactory.this.property(name), FastFilterFactory.this.literal(geom), distance, units, action)
380 26036 15817 - 15870 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.dwithin FastFilterFactory.this.dwithin(exp1, exp2, distance, units, ANY)
383 26037 16006 - 16031 Apply java.lang.Object.!= action.!=(ANY)
384 26038 16041 - 16091 Apply org.geotools.filter.FilterFactoryImpl.dwithin FastFilterFactory.super.dwithin(exp1, exp2, distance, units, action)
384 26039 16041 - 16091 Block org.geotools.filter.FilterFactoryImpl.dwithin FastFilterFactory.super.dwithin(exp1, exp2, distance, units, action)
386 26040 16111 - 16165 Apply org.locationtech.geomesa.filter.checkOrder org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2)
386 26048 16111 - 16458 Match <nosymbol> org.locationtech.geomesa.filter.`package`.checkOrder(exp1, exp2) match { case (value: org.locationtech.geomesa.filter.expression.AttributeExpression)Some[org.locationtech.geomesa.filter.expression.AttributeExpression]((name: String, literal: org.geotools.api.filter.expression.Literal, flipped: Boolean)org.locationtech.geomesa.filter.expression.AttributeExpression.PropertyLiteral((name @ _), (lit @ _), _)) => new org.locationtech.geomesa.filter.expression.FastDWithin.DWithinLiteral(FastFilterFactory.this.property(name), lit, distance, units) case (value: org.locationtech.geomesa.filter.expression.AttributeExpression)Some[org.locationtech.geomesa.filter.expression.AttributeExpression]((name: String, function: org.geotools.api.filter.expression.Function, literal: org.geotools.api.filter.expression.Literal, flipped: Boolean)org.locationtech.geomesa.filter.expression.AttributeExpression.FunctionLiteral(_, (fn @ _), (lit @ _), _)) => new org.locationtech.geomesa.filter.expression.FastDWithin.DWithinLiteral(fn, lit, distance, units) case _ => FastFilterFactory.super.dwithin(exp1, exp2, distance, units, action) }
387 26041 16246 - 16260 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.property FastFilterFactory.this.property(name)
387 26042 16227 - 16283 Apply org.locationtech.geomesa.filter.expression.FastDWithin.DWithinLiteral.<init> new org.locationtech.geomesa.filter.expression.FastDWithin.DWithinLiteral(FastFilterFactory.this.property(name), lit, distance, units)
387 26043 16227 - 16283 Block org.locationtech.geomesa.filter.expression.FastDWithin.DWithinLiteral.<init> new org.locationtech.geomesa.filter.expression.FastDWithin.DWithinLiteral(FastFilterFactory.this.property(name), lit, distance, units)
388 26044 16337 - 16381 Apply org.locationtech.geomesa.filter.expression.FastDWithin.DWithinLiteral.<init> new org.locationtech.geomesa.filter.expression.FastDWithin.DWithinLiteral(fn, lit, distance, units)
388 26045 16337 - 16381 Block org.locationtech.geomesa.filter.expression.FastDWithin.DWithinLiteral.<init> new org.locationtech.geomesa.filter.expression.FastDWithin.DWithinLiteral(fn, lit, distance, units)
389 26046 16400 - 16450 Apply org.geotools.filter.FilterFactoryImpl.dwithin FastFilterFactory.super.dwithin(exp1, exp2, distance, units, action)
389 26047 16400 - 16450 Block org.geotools.filter.FilterFactoryImpl.dwithin FastFilterFactory.super.dwithin(exp1, exp2, distance, units, action)
397 26049 16516 - 16537 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.<init> new FastFilterFactory()
399 26050 16552 - 16588 Apply java.lang.ThreadLocal.<init> new ThreadLocal[org.geotools.api.feature.simple.SimpleFeatureType]()
401 26051 16667 - 16686 Apply org.geotools.filter.text.ecql.ECQL.toFilter org.geotools.filter.text.ecql.ECQL.toFilter(ecql)
401 26052 16653 - 16687 Apply org.locationtech.geomesa.filter.factory.FastFilterFactory.optimize FastFilterFactory.this.optimize(sft, org.geotools.filter.text.ecql.ECQL.toFilter(ecql))
404 26053 16766 - 16779 Apply java.lang.ThreadLocal.set FastFilterFactory.this.sfts.set(sft)
405 26054 16814 - 16821 Select org.locationtech.geomesa.filter.factory.FastFilterFactory.factory FastFilterFactory.this.factory
405 26055 16790 - 16822 Apply org.geotools.filter.text.ecql.ECQL.toExpression org.geotools.filter.text.ecql.ECQL.toExpression(ecql, FastFilterFactory.this.factory)
405 26056 16790 - 16822 Block org.geotools.filter.text.ecql.ECQL.toExpression org.geotools.filter.text.ecql.ECQL.toExpression(ecql, FastFilterFactory.this.factory)
406 26057 16841 - 16854 Apply java.lang.ThreadLocal.remove FastFilterFactory.this.sfts.remove()
406 26058 16841 - 16854 Block java.lang.ThreadLocal.remove FastFilterFactory.this.sfts.remove()
411 26059 16937 - 16950 Apply java.lang.ThreadLocal.set FastFilterFactory.this.sfts.set(sft)
412 26060 16997 - 17004 Select org.locationtech.geomesa.filter.factory.FastFilterFactory.factory FastFilterFactory.this.factory
412 26061 16961 - 17005 Apply org.locationtech.geomesa.filter.visitor.QueryPlanFilterVisitor.apply org.locationtech.geomesa.filter.visitor.QueryPlanFilterVisitor.apply(sft, filter, FastFilterFactory.this.factory)
412 26062 16961 - 17005 Block org.locationtech.geomesa.filter.visitor.QueryPlanFilterVisitor.apply org.locationtech.geomesa.filter.visitor.QueryPlanFilterVisitor.apply(sft, filter, FastFilterFactory.this.factory)
413 26063 17024 - 17037 Apply java.lang.ThreadLocal.remove FastFilterFactory.this.sfts.remove()
413 26064 17024 - 17037 Block java.lang.ThreadLocal.remove FastFilterFactory.this.sfts.remove()
418 26065 17116 - 17129 Apply java.lang.ThreadLocal.set FastFilterFactory.this.sfts.set(sft)
419 26066 17183 - 17190 Select org.locationtech.geomesa.filter.factory.FastFilterFactory.factory FastFilterFactory.this.factory
419 26067 17154 - 17191 Apply org.geotools.filter.visitor.DuplicatingFilterVisitor.<init> new org.geotools.filter.visitor.DuplicatingFilterVisitor(FastFilterFactory.this.factory)
419 26068 17193 - 17197 Literal <nosymbol> null
419 26069 17140 - 17219 TypeApply scala.Any.asInstanceOf filter.accept(new org.geotools.filter.visitor.DuplicatingFilterVisitor(FastFilterFactory.this.factory), null).asInstanceOf[org.geotools.api.filter.Filter]
419 26070 17140 - 17219 Block scala.Any.asInstanceOf filter.accept(new org.geotools.filter.visitor.DuplicatingFilterVisitor(FastFilterFactory.this.factory), null).asInstanceOf[org.geotools.api.filter.Filter]
420 26071 17238 - 17251 Apply java.lang.ThreadLocal.remove FastFilterFactory.this.sfts.remove()
420 26072 17238 - 17251 Block java.lang.ThreadLocal.remove FastFilterFactory.this.sfts.remove()