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.curve
10 
11 import org.locationtech.geomesa.curve.TimePeriod.TimePeriod
12 import org.locationtech.geomesa.curve.XZ3SFC.{QueryWindow, XElement}
13 import org.locationtech.geomesa.zorder.sfcurve.IndexRange
14 
15 import scala.collection.mutable.ArrayBuffer
16 
17 /**
18   * Extended Z-order curve implementation used for efficiently storing polygons.
19   *
20   * Based on 'XZ-Ordering: A Space-Filling Curve for Objects with Spatial Extension'
21   * by Christian Böhm, Gerald Klump  and Hans-Peter Kriegel, expanded to 3 dimensions
22   *
23   * @param g resolution level of the curve - i.e. how many times the space will be recursively split into eighths
24 
25   */
26 class XZ3SFC(val g: Short, val xBounds: (Double, Double), val yBounds: (Double, Double), val zBounds: (Double, Double)) {
27 
28   // TODO see what the max value of g can be where we can use Ints instead of Longs and possibly refactor to use Ints
29 
30   private val xLo = xBounds._1
31   private val xHi = xBounds._2
32   private val yLo = yBounds._1
33   private val yHi = yBounds._2
34   private val zLo = zBounds._1
35   private val zHi = zBounds._2
36 
37   private val xSize = xHi - xLo
38   private val ySize = yHi - yLo
39   private val zSize = zHi - zLo
40 
41   /**
42     * Index a polygon by it's bounding box
43     *
44     * @param xmin min x value in xBounds
45     * @param ymin min y value in yBounds
46     * @param zmin min z value in zBounds
47     * @param xmax max x value in xBounds, must be >= xmin
48     * @param ymax max y value in yBounds, must be >= ymin
49     * @param zmax max z value in zBounds, must be >= tmin
50     * @param lenient standardize boundaries to valid values, or raise an exception
51     * @return z value for the bounding box
52     */
53   def index(xmin: Double, ymin: Double, zmin: Double, xmax: Double, ymax: Double, zmax: Double, lenient: Boolean = false): Long = {
54     // normalize inputs to [0,1]
55     val (nxmin, nymin, nzmin, nxmax, nymax, nzmax) = normalize(xmin, ymin, zmin, xmax, ymax, zmax, lenient)
56 
57     // calculate the length of the sequence code (section 4.1 of XZ-Ordering paper)
58 
59     val maxDim = math.max(math.max(nxmax - nxmin, nymax - nymin), nzmax - nzmin)
60 
61     // l1 (el-one) is a bit confusing to read, but corresponds with the paper's definitions
62     val l1 = math.floor(math.log(maxDim) / XZSFC.LogPointFive).toInt
63 
64     // the length will either be (l1) or (l1 + 1)
65     val length = if (l1 >= g) { g } else {
66       val w2 = math.pow(0.5, l1 + 1) // width of an element at resolution l2 (l1 + 1)
67 
68       // predicate for checking how many axis the polygon intersects
69       // math.floor(min / w2) * w2 == start of cell containing min
70       def predicate(min: Double, max: Double): Boolean = max <= (math.floor(min / w2) * w2) + (2 * w2)
71 
72       if (predicate(nxmin, nxmax) && predicate(nymin, nymax) && predicate(nzmin, nzmax)) l1 + 1 else l1
73     }
74 
75     sequenceCode(nxmin, nymin, nzmin, length)
76   }
77 
78   /**
79     * Determine XZ-curve ranges that will cover a given query window
80     *
81     * @param query a window to cover in the form (xmin, ymin, zmin, xmax, ymax, zmax) where all values are in user space
82     * @return
83     */
84   def ranges(query: (Double, Double, Double, Double, Double, Double)): Seq[IndexRange] = ranges(Seq(query))
85 
86   /**
87     * Determine XZ-curve ranges that will cover a given query window
88     *
89     * @param query a window to cover in the form (xmin, ymin, zmin, xmax, ymax, zmax) where all values are in user space
90     * @param maxRanges a rough upper limit on the number of ranges to generate
91     * @return
92     */
93   def ranges(query: (Double, Double, Double, Double, Double, Double), maxRanges: Option[Int]): Seq[IndexRange] =
94     ranges(Seq(query), maxRanges)
95 
96   /**
97     * Determine XZ-curve ranges that will cover a given query window
98     *
99     * @param xmin min x value in user space
100     * @param ymin min y value in user space
101     * @param zmin min z value in user space
102     * @param xmax max x value in user space, must be >= xmin
103     * @param ymax max y value in user space, must be >= ymin
104     * @param zmax max z value in user space, must be >= zmin
105     * @return
106     */
107   def ranges(xmin: Double, ymin: Double, zmin: Double, xmax: Double, ymax: Double, zmax: Double): Seq[IndexRange] =
108     ranges(Seq((xmin, ymin, zmin, xmax, ymax, zmax)))
109 
110   /**
111     * Determine XZ-curve ranges that will cover a given query window
112     *
113     * @param xmin min x value in user space
114     * @param ymin min y value in user space
115     * @param zmin min z value in user space
116     * @param xmax max x value in user space, must be >= xmin
117     * @param ymax max y value in user space, must be >= ymin
118     * @param zmax max z value in user space, must be >= zmin
119     * @param maxRanges a rough upper limit on the number of ranges to generate
120     * @return
121     */
122   def ranges(xmin: Double,
123              ymin: Double,
124              zmin: Double,
125              xmax: Double,
126              ymax: Double,
127              zmax: Double,
128              maxRanges: Option[Int]): Seq[IndexRange] =
129     ranges(Seq((xmin, ymin, zmin, xmax, ymax, zmax)), maxRanges)
130 
131   /**
132     * Determine XZ-curve ranges that will cover a given query window
133     *
134     * @param queries a sequence of OR'd windows to cover. Each window is in the form
135     *                (xmin, ymin, zmin, xmax, ymax, zmax) where all values are in user space
136     * @param maxRanges a rough upper limit on the number of ranges to generate
137     * @return
138     */
139   def ranges(queries: Seq[(Double, Double, Double, Double, Double, Double)],
140              maxRanges: Option[Int] = None): Seq[IndexRange] = {
141     // normalize inputs to [0,1]
142     val windows = queries.map { case (xmin, ymin, zmin, xmax, ymax, zmax) =>
143       val (nxmin, nymin, nzmin, nxmax, nymax, nzmax) = normalize(xmin, ymin, zmin, xmax, ymax, zmax, lenient = false)
144       QueryWindow(nxmin, nymin, nzmin, nxmax, nymax, nzmax)
145     }
146     ranges(windows.toArray, maxRanges.getOrElse(Int.MaxValue))
147   }
148 
149   /**
150     * Determine XZ-curve ranges that will cover a given query window
151     *
152     * @param query a sequence of OR'd windows to cover, normalized to [0,1]
153     * @param rangeStop a rough max value for the number of ranges to return
154     * @return
155     */
156   private def ranges(query: Array[QueryWindow], rangeStop: Int): Seq[IndexRange] = {
157 
158     import XZ3SFC.{LevelOneElements, LevelTerminator}
159 
160     // stores our results - initial size of 100 in general saves us some re-allocation
161     val ranges = new java.util.ArrayList[IndexRange](100)
162 
163     // values remaining to process - initial size of 100 in general saves us some re-allocation
164     val remaining = new java.util.ArrayDeque[XElement](100)
165 
166     // checks if a quad is contained in the search space
167     def isContained(oct: XElement): Boolean = {
168       var i = 0
169       while (i < query.length) {
170         if (oct.isContained(query(i))) {
171           return true
172         }
173         i += 1
174       }
175       false
176     }
177 
178     // checks if a quad overlaps the search space
179     def isOverlapped(oct: XElement): Boolean = {
180       var i = 0
181       while (i < query.length) {
182         if (oct.overlaps(query(i))) {
183           return true
184         }
185         i += 1
186       }
187       false
188     }
189 
190     // checks a single value and either:
191     //   eliminates it as out of bounds
192     //   adds it to our results as fully matching, or
193     //   adds it to our results as partial matching and queues up it's children for further processing
194     def checkValue(oct: XElement, level: Short): Unit = {
195       if (isContained(oct)) {
196         // whole range matches, happy day
197         val (min, max) = sequenceInterval(oct.xmin, oct.ymin, oct.zmin, level, partial = false)
198         ranges.add(IndexRange(min, max, contained = true))
199       } else if (isOverlapped(oct)) {
200         // some portion of this range is excluded
201         // add the partial match and queue up each sub-range for processing
202         val (min, max) = sequenceInterval(oct.xmin, oct.ymin, oct.zmin, level, partial = true)
203         ranges.add(IndexRange(min, max, contained = false))
204         oct.children.foreach(remaining.add)
205       }
206     }
207 
208     // initial level
209     LevelOneElements.foreach(remaining.add)
210     remaining.add(LevelTerminator)
211 
212     // level of recursion
213     var level: Short = 1
214 
215     while (level < g && !remaining.isEmpty && ranges.size < rangeStop) {
216       val next = remaining.poll
217       if (next.eq(LevelTerminator)) {
218         // we've fully processed a level, increment our state
219         if (!remaining.isEmpty) {
220           level = (level + 1).toShort
221           remaining.add(LevelTerminator)
222         }
223       } else {
224         checkValue(next, level)
225       }
226     }
227 
228     // bottom out and get all the ranges that partially overlapped but we didn't fully process
229     while (!remaining.isEmpty) {
230       val oct = remaining.poll
231       if (oct.eq(LevelTerminator)) {
232         level = (level + 1).toShort
233       } else {
234         val (min, max) = sequenceInterval(oct.xmin, oct.ymin, oct.zmin, level, partial = false)
235         ranges.add(IndexRange(min, max, contained = false))
236       }
237     }
238 
239     // we've got all our ranges - now reduce them down by merging overlapping values
240     // note: we don't bother reducing the ranges as in the XZ paper, as accumulo handles lots of ranges fairly well
241     ranges.sort(IndexRange.IndexRangeIsOrdered)
242 
243     var current = ranges.get(0) // note: should always be at least one range
244     val result = ArrayBuffer.empty[IndexRange]
245     var i = 1
246     while (i < ranges.size()) {
247       val range = ranges.get(i)
248       if (range.lower <= current.upper + 1) {
249         // merge the two ranges
250         current = IndexRange(current.lower, math.max(current.upper, range.upper), current.contained && range.contained)
251       } else {
252         // append the last range and set the current range for future merging
253         result.append(current)
254         current = range
255       }
256       i += 1
257     }
258     // append the last range - there will always be one left that wasn't added
259     result.append(current)
260 
261     result.toSeq
262   }
263 
264   /**
265     * Computes the sequence code for a given point - for polygons this is the lower-left corner.
266     *
267     * Based on Definition 2 from the XZ-Ordering paper
268     *
269     * @param x normalized x value [0,1]
270     * @param y normalized y value [0,1]
271     * @param z normalized z value [0,1]
272     * @param length length of the sequence code that will be generated
273     * @return
274     */
275   private def sequenceCode(x: Double, y: Double, z: Double, length: Int): Long = {
276     var xmin = 0.0
277     var ymin = 0.0
278     var zmin = 0.0
279     var xmax = 1.0
280     var ymax = 1.0
281     var zmax = 1.0
282 
283     var cs = 0L
284 
285     var i = 0
286     while (i < length) {
287       val xCenter = (xmin + xmax) / 2.0
288       val yCenter = (ymin + ymax) / 2.0
289       val zCenter = (zmin + zmax) / 2.0
290       (x < xCenter, y < yCenter, z < zCenter) match {
291         case (true,  true, true)   => cs += 1L                                             ; xmax = xCenter; ymax = yCenter; zmax = zCenter
292         case (false, true, true)   => cs += 1L + 1L * (math.pow(8, g - i).toLong - 1L) / 7L; xmin = xCenter; ymax = yCenter; zmax = zCenter
293         case (true,  false, true)  => cs += 1L + 2L * (math.pow(8, g - i).toLong - 1L) / 7L; xmax = xCenter; ymin = yCenter; zmax = zCenter
294         case (false, false, true)  => cs += 1L + 3L * (math.pow(8, g - i).toLong - 1L) / 7L; xmin = xCenter; ymin = yCenter; zmax = zCenter
295         case (true,  true, false)  => cs += 1L + 4L * (math.pow(8, g - i).toLong - 1L) / 7L; xmax = xCenter; ymax = yCenter; zmin = zCenter
296         case (false, true, false)  => cs += 1L + 5L * (math.pow(8, g - i).toLong - 1L) / 7L; xmin = xCenter; ymax = yCenter; zmin = zCenter
297         case (true,  false, false) => cs += 1L + 6L * (math.pow(8, g - i).toLong - 1L) / 7L; xmax = xCenter; ymin = yCenter; zmin = zCenter
298         case (false, false, false) => cs += 1L + 7L * (math.pow(8, g - i).toLong - 1L) / 7L; xmin = xCenter; ymin = yCenter; zmin = zCenter
299       }
300       i += 1
301     }
302 
303     cs
304   }
305 
306   /**
307     * Computes an interval of sequence codes for a given point - for polygons this is the lower-left corner.
308     *
309     * @param x normalized x value [0,1]
310     * @param y normalized y value [0,1]
311     * @param length length of the sequence code that will used as the basis for this interval
312     * @param partial true if the element partially intersects the query window, false if it is fully contained
313     * @return
314     */
315   private def sequenceInterval(x: Double, y: Double, z: Double, length: Short, partial: Boolean): (Long, Long) = {
316     val min = sequenceCode(x, y, z, length)
317     // if a partial match, we just use the single sequence code as an interval
318     // if a full match, we have to match all sequence codes starting with the single sequence code
319     val max = if (partial) { min } else {
320       // from lemma 3 in the XZ-Ordering paper
321       min + (math.pow(8, g - length + 1).toLong - 1L) / 7L
322     }
323     (min, max)
324   }
325 
326   /**
327     * Normalize user space values to [0,1]
328     *
329     * @param xmin min x value in user space
330     * @param ymin min y value in user space
331     * @param zmin min z value in user space
332     * @param xmax max x value in user space, must be >= xmin
333     * @param ymax max y value in user space, must be >= ymin
334     * @param zmax max z value in user space, must be >= zmin
335     * @param lenient standardize boundaries to valid values, or raise an exception
336     * @return
337     */
338   protected def normalize(
339       xmin: Double,
340       ymin: Double,
341       zmin: Double,
342       xmax: Double,
343       ymax: Double,
344       zmax: Double,
345       lenient: Boolean): (Double, Double, Double, Double, Double, Double) = {
346     require(xmin <= xmax && ymin <= ymax && zmin <= zmax,
347       s"Bounds must be ordered: [$xmin $xmax] [$ymin $ymax] [$zmin $zmax]")
348 
349     try {
350       require(xmin >= xLo && xmax <= xHi && ymin >= yLo && ymax <= yHi && zmin >= zLo && zmax <= zHi,
351         s"Values out of bounds ([$xLo $xHi] [$yLo $yHi] [$zLo $zHi]): [$xmin $xmax] [$ymin $ymax] [$zmin $zmax]")
352 
353       val nxmin = (xmin - xLo) / xSize
354       val nymin = (ymin - yLo) / ySize
355       val nzmin = (zmin - zLo) / zSize
356       val nxmax = (xmax - xLo) / xSize
357       val nymax = (ymax - yLo) / ySize
358       val nzmax = (zmax - zLo) / zSize
359 
360       (nxmin, nymin, nzmin, nxmax, nymax, nzmax)
361     } catch {
362       case _: IllegalArgumentException if lenient =>
363 
364         val bxmin = if (xmin < xLo) { xLo } else if (xmin > xHi) { xHi } else { xmin }
365         val bymin = if (ymin < yLo) { yLo } else if (ymin > yHi) { yHi } else { ymin }
366         val bzmin = if (zmin < zLo) { zLo } else if (zmin > zHi) { zHi } else { zmin }
367         val bxmax = if (xmax < xLo) { xLo } else if (xmax > xHi) { xHi } else { xmax }
368         val bymax = if (ymax < yLo) { yLo } else if (ymax > yHi) { yHi } else { ymax }
369         val bzmax = if (zmax < zLo) { zLo } else if (zmax > zHi) { zHi } else { zmax }
370 
371         val nxmin = (bxmin - xLo) / xSize
372         val nymin = (bymin - yLo) / ySize
373         val nzmin = (bzmin - zLo) / zSize
374         val nxmax = (bxmax - xLo) / xSize
375         val nymax = (bymax - yLo) / ySize
376         val nzmax = (bzmax - zLo) / zSize
377 
378         (nxmin, nymin, nzmin, nxmax, nymax, nzmax)
379     }
380   }
381 }
382 
383 object XZ3SFC {
384 
385   // the initial level of octs
386   private val LevelOneElements = XElement(0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0).children
387 
388   // indicator that we have searched a full level of the oct tree
389   private val LevelTerminator = XElement(-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 0.0)
390 
391   private val cache = new java.util.concurrent.ConcurrentHashMap[(Short, TimePeriod), XZ3SFC]()
392 
393   def apply(g: Short, period: TimePeriod): XZ3SFC = {
394     var sfc = cache.get((g, period))
395     if (sfc == null) {
396       sfc = new XZ3SFC(g, (-180.0, 180.0), (-90.0, 90.0), (0.0, BinnedTime.maxOffset(period).toDouble))
397       cache.put((g, period), sfc)
398     }
399     sfc
400   }
401 
402   /**
403     * Region being queried. Bounds are normalized to [0-1].
404     *
405     * @param xmin x lower bound in [0-1]
406     * @param ymin y lower bound in [0-1]
407     * @param zmin z lower bound in [0-1]
408     * @param xmax x upper bound in [0-1], must be >= xmin
409     * @param ymax y upper bound in [0-1], must be >= ymin
410     * @param zmax z upper bound in [0-1], must be >= zmin
411     */
412   private case class QueryWindow(xmin: Double, ymin: Double, zmin: Double, xmax: Double, ymax: Double, zmax: Double)
413 
414   /**
415     * An extended Z curve element. Bounds refer to the non-extended z element for simplicity of calculation.
416     *
417     * An extended Z element refers to a normal Z curve element that has it's upper bounds expanded by double it's
418     * width/length/height. By convention, an element is always a cube.
419     *
420     * @param xmin x lower bound in [0-1]
421     * @param ymin y lower bound in [0-1]
422     * @param zmin z lower bound in [0-1]
423     * @param xmax x upper bound in [0-1], must be >= xmin
424     * @param ymax y upper bound in [0-1], must be >= ymin
425     * @param zmax z upper bound in [0-1], must be >= zmin
426     * @param length length of the non-extended side (note: by convention width should be equal to height and depth)
427     */
428   private case class XElement(xmin: Double,
429                               ymin: Double,
430                               zmin: Double,
431                               xmax: Double,
432                               ymax: Double,
433                               zmax: Double,
434                               length: Double) {
435 
436     // extended x and y bounds
437     lazy val xext = xmax + length
438     lazy val yext = ymax + length
439     lazy val zext = zmax + length
440 
441     def isContained(window: QueryWindow): Boolean =
442       window.xmin <= xmin && window.ymin <= ymin && window.zmin <= zmin &&
443           window.xmax >= xext && window.ymax >= yext && window.zmax >= zext
444 
445     def overlaps(window: QueryWindow): Boolean =
446       window.xmax >= xmin && window.ymax >= ymin && window.zmax >= zmin &&
447           window.xmin <= xext && window.ymin <= yext && window.zmin <= zext
448 
449     def children: Seq[XElement] = {
450       val xCenter = (xmin + xmax) / 2.0
451       val yCenter = (ymin + ymax) / 2.0
452       val zCenter = (zmin + zmax) / 2.0
453       val len = length / 2.0
454       val c0 = copy(xmax = xCenter, ymax = yCenter, zmax = zCenter, length = len)
455       val c1 = copy(xmin = xCenter, ymax = yCenter, zmax = zCenter, length = len)
456       val c2 = copy(xmax = xCenter, ymin = yCenter, zmax = zCenter, length = len)
457       val c3 = copy(xmin = xCenter, ymin = yCenter, zmax = zCenter, length = len)
458       val c4 = copy(xmax = xCenter, ymax = yCenter, zmin = zCenter, length = len)
459       val c5 = copy(xmin = xCenter, ymax = yCenter, zmin = zCenter, length = len)
460       val c6 = copy(xmax = xCenter, ymin = yCenter, zmin = zCenter, length = len)
461       val c7 = copy(xmin = xCenter, ymin = yCenter, zmin = zCenter, length = len)
462       Seq(c0, c1, c2, c3, c4, c5, c6, c7)
463     }
464   }
465 }
Line Stmt Id Pos Tree Symbol Tests Code
30 882 1384 - 1394 Select scala.Tuple2._1 XZ3SFC.this.xBounds._1
31 883 1415 - 1425 Select scala.Tuple2._2 XZ3SFC.this.xBounds._2
32 884 1446 - 1456 Select scala.Tuple2._1 XZ3SFC.this.yBounds._1
33 885 1477 - 1487 Select scala.Tuple2._2 XZ3SFC.this.yBounds._2
34 886 1508 - 1518 Select scala.Tuple2._1 XZ3SFC.this.zBounds._1
35 887 1539 - 1549 Select scala.Tuple2._2 XZ3SFC.this.zBounds._2
37 888 1579 - 1582 Select org.locationtech.geomesa.curve.XZ3SFC.xLo XZ3SFC.this.xLo
37 889 1573 - 1582 Apply scala.Double.- XZ3SFC.this.xHi.-(XZ3SFC.this.xLo)
38 890 1611 - 1614 Select org.locationtech.geomesa.curve.XZ3SFC.yLo XZ3SFC.this.yLo
38 891 1605 - 1614 Apply scala.Double.- XZ3SFC.this.yHi.-(XZ3SFC.this.yLo)
39 892 1643 - 1646 Select org.locationtech.geomesa.curve.XZ3SFC.zLo XZ3SFC.this.zLo
39 893 1637 - 1646 Apply scala.Double.- XZ3SFC.this.zHi.-(XZ3SFC.this.zLo)
55 894 2307 - 2307 Select scala.Tuple6._1 x$1._1
55 895 2314 - 2314 Select scala.Tuple6._2 x$1._2
55 896 2321 - 2321 Select scala.Tuple6._3 x$1._3
55 897 2328 - 2328 Select scala.Tuple6._4 x$1._4
55 898 2335 - 2335 Select scala.Tuple6._5 x$1._5
55 899 2342 - 2342 Select scala.Tuple6._6 x$1._6
59 900 2527 - 2540 Apply scala.Double.- nxmax.-(nxmin)
59 901 2542 - 2555 Apply scala.Double.- nymax.-(nymin)
59 902 2518 - 2556 Apply scala.math.max scala.math.`package`.max(nxmax.-(nxmin), nymax.-(nymin))
59 903 2558 - 2571 Apply scala.Double.- nzmax.-(nzmin)
59 904 2509 - 2572 Apply scala.math.max scala.math.`package`.max(scala.math.`package`.max(nxmax.-(nxmin), nymax.-(nymin)), nzmax.-(nzmin))
62 905 2709 - 2727 Select org.locationtech.geomesa.curve.XZSFC.LogPointFive XZSFC.LogPointFive
62 906 2690 - 2727 Apply scala.Double./ scala.math.`package`.log(maxDim)./(XZSFC.LogPointFive)
62 907 2679 - 2734 Select scala.Double.toInt scala.math.`package`.floor(scala.math.`package`.log(maxDim)./(XZSFC.LogPointFive)).toInt
65 908 2813 - 2814 Select org.locationtech.geomesa.curve.XZ3SFC.g XZ3SFC.this.g
65 909 2807 - 2814 Apply scala.Int.>= l1.>=(XZ3SFC.this.g)
65 910 2818 - 2819 Select scala.Short.toInt XZ3SFC.this.g.toInt
65 911 2818 - 2819 Block scala.Short.toInt XZ3SFC.this.g.toInt
65 926 2827 - 3265 Block <nosymbol> { val w2: Double = scala.math.`package`.pow(0.5, l1.+(1).toDouble); def predicate(min: Double, max: Double): Boolean = max.<=(scala.math.`package`.floor(min./(w2)).*(w2).+(2.*(w2))); if (predicate(nxmin, nxmax).&&(predicate(nymin, nymax)).&&(predicate(nzmin, nzmax))) l1.+(1) else l1 }
66 912 2853 - 2856 Literal <nosymbol> 0.5
66 913 2863 - 2864 Literal <nosymbol> 1
66 914 2858 - 2864 Select scala.Int.toDouble l1.+(1).toDouble
66 915 2844 - 2865 Apply scala.math.pow scala.math.`package`.pow(0.5, l1.+(1).toDouble)
70 916 3128 - 3136 Apply scala.Double./ min./(w2)
70 917 3147 - 3153 Apply scala.Int.* 2.*(w2)
70 918 3116 - 3154 Apply scala.Double.+ scala.math.`package`.floor(min./(w2)).*(w2).+(2.*(w2))
70 919 3109 - 3154 Apply scala.Double.<= max.<=(scala.math.`package`.floor(min./(w2)).*(w2).+(2.*(w2)))
72 920 3193 - 3216 Apply org.locationtech.geomesa.curve.XZ3SFC.predicate predicate(nymin, nymax)
72 921 3220 - 3243 Apply org.locationtech.geomesa.curve.XZ3SFC.predicate predicate(nzmin, nzmax)
72 922 3166 - 3243 Apply scala.Boolean.&& predicate(nxmin, nxmax).&&(predicate(nymin, nymax)).&&(predicate(nzmin, nzmax))
72 923 3245 - 3251 Apply scala.Int.+ l1.+(1)
72 924 3245 - 3251 Block scala.Int.+ l1.+(1)
72 925 3257 - 3259 Ident org.locationtech.geomesa.curve.XZ3SFC.l1 l1
75 927 3271 - 3312 Apply org.locationtech.geomesa.curve.XZ3SFC.sequenceCode XZ3SFC.this.sequenceCode(nxmin, nymin, nzmin, length)
84 928 3637 - 3647 Apply scala.collection.generic.GenericCompanion.apply scala.collection.Seq.apply[(Double, Double, Double, Double, Double, Double)](query)
84 929 3630 - 3648 Apply org.locationtech.geomesa.curve.XZ3SFC.ranges XZ3SFC.this.ranges(scala.collection.Seq.apply[(Double, Double, Double, Double, Double, Double)](query), XZ3SFC.this.ranges$default$2)
94 930 4076 - 4086 Apply scala.collection.generic.GenericCompanion.apply scala.collection.Seq.apply[(Double, Double, Double, Double, Double, Double)](query)
94 931 4069 - 4098 Apply org.locationtech.geomesa.curve.XZ3SFC.ranges XZ3SFC.this.ranges(scala.collection.Seq.apply[(Double, Double, Double, Double, Double, Double)](query), maxRanges)
108 932 4648 - 4684 Apply scala.Tuple6.apply scala.Tuple6.apply[Double, Double, Double, Double, Double, Double](xmin, ymin, zmin, xmax, ymax, zmax)
108 933 4644 - 4685 Apply scala.collection.generic.GenericCompanion.apply scala.collection.Seq.apply[(Double, Double, Double, Double, Double, Double)](scala.Tuple6.apply[Double, Double, Double, Double, Double, Double](xmin, ymin, zmin, xmax, ymax, zmax))
108 934 4637 - 4686 Apply org.locationtech.geomesa.curve.XZ3SFC.ranges XZ3SFC.this.ranges(scala.collection.Seq.apply[(Double, Double, Double, Double, Double, Double)](scala.Tuple6.apply[Double, Double, Double, Double, Double, Double](xmin, ymin, zmin, xmax, ymax, zmax)), XZ3SFC.this.ranges$default$2)
129 935 5417 - 5453 Apply scala.Tuple6.apply scala.Tuple6.apply[Double, Double, Double, Double, Double, Double](xmin, ymin, zmin, xmax, ymax, zmax)
129 936 5413 - 5454 Apply scala.collection.generic.GenericCompanion.apply scala.collection.Seq.apply[(Double, Double, Double, Double, Double, Double)](scala.Tuple6.apply[Double, Double, Double, Double, Double, Double](xmin, ymin, zmin, xmax, ymax, zmax))
129 937 5406 - 5466 Apply org.locationtech.geomesa.curve.XZ3SFC.ranges XZ3SFC.this.ranges(scala.collection.Seq.apply[(Double, Double, Double, Double, Double, Double)](scala.Tuple6.apply[Double, Double, Double, Double, Double, Double](xmin, ymin, zmin, xmax, ymax, zmax)), maxRanges)
142 945 6076 - 6256 Block <nosymbol> { <synthetic> <artifact> private[this] val x$2: (Double, Double, Double, Double, Double, Double) = (XZ3SFC.this.normalize(xmin, ymin, zmin, xmax, ymax, zmax, false): (Double, Double, Double, Double, Double, Double) @unchecked) match { case (_1: Double, _2: Double, _3: Double, _4: Double, _5: Double, _6: Double)(Double, Double, Double, Double, Double, Double)((nxmin @ _), (nymin @ _), (nzmin @ _), (nxmax @ _), (nymax @ _), (nzmax @ _)) => scala.Tuple6.apply[Double, Double, Double, Double, Double, Double](nxmin, nymin, nzmin, nxmax, nymax, nzmax) }; val nxmin: Double = x$2._1; val nymin: Double = x$2._2; val nzmin: Double = x$2._3; val nxmax: Double = x$2._4; val nymax: Double = x$2._5; val nzmax: Double = x$2._6; org.locationtech.geomesa.curve.XZ3SFC.QueryWindow.apply(nxmin, nymin, nzmin, nxmax, nymax, nzmax) }
142 946 6032 - 6032 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[org.locationtech.geomesa.curve.XZ3SFC.QueryWindow]
142 947 6020 - 6262 ApplyToImplicitArgs scala.collection.TraversableLike.map queries.map[org.locationtech.geomesa.curve.XZ3SFC.QueryWindow, Seq[org.locationtech.geomesa.curve.XZ3SFC.QueryWindow]](((x0$1: (Double, Double, Double, Double, Double, Double)) => x0$1 match { case (_1: Double, _2: Double, _3: Double, _4: Double, _5: Double, _6: Double)(Double, Double, Double, Double, Double, Double)((xmin @ _), (ymin @ _), (zmin @ _), (xmax @ _), (ymax @ _), (zmax @ _)) => { <synthetic> <artifact> private[this] val x$2: (Double, Double, Double, Double, Double, Double) = (XZ3SFC.this.normalize(xmin, ymin, zmin, xmax, ymax, zmax, false): (Double, Double, Double, Double, Double, Double) @unchecked) match { case (_1: Double, _2: Double, _3: Double, _4: Double, _5: Double, _6: Double)(Double, Double, Double, Double, Double, Double)((nxmin @ _), (nymin @ _), (nzmin @ _), (nxmax @ _), (nymax @ _), (nzmax @ _)) => scala.Tuple6.apply[Double, Double, Double, Double, Double, Double](nxmin, nymin, nzmin, nxmax, nymax, nzmax) }; val nxmin: Double = x$2._1; val nymin: Double = x$2._2; val nzmin: Double = x$2._3; val nxmax: Double = x$2._4; val nymax: Double = x$2._5; val nzmax: Double = x$2._6; org.locationtech.geomesa.curve.XZ3SFC.QueryWindow.apply(nxmin, nymin, nzmin, nxmax, nymax, nzmax) } }))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.curve.XZ3SFC.QueryWindow])
143 938 6090 - 6090 Select scala.Tuple6._1 x$2._1
143 939 6097 - 6097 Select scala.Tuple6._2 x$2._2
143 940 6104 - 6104 Select scala.Tuple6._3 x$2._3
143 941 6111 - 6111 Select scala.Tuple6._4 x$2._4
143 942 6118 - 6118 Select scala.Tuple6._5 x$2._5
143 943 6125 - 6125 Select scala.Tuple6._6 x$2._6
144 944 6203 - 6256 Apply org.locationtech.geomesa.curve.XZ3SFC.QueryWindow.apply org.locationtech.geomesa.curve.XZ3SFC.QueryWindow.apply(nxmin, nymin, nzmin, nxmax, nymax, nzmax)
146 948 6274 - 6289 ApplyToImplicitArgs scala.collection.TraversableOnce.toArray windows.toArray[org.locationtech.geomesa.curve.XZ3SFC.QueryWindow]((ClassTag.apply[org.locationtech.geomesa.curve.XZ3SFC.QueryWindow](classOf[org.locationtech.geomesa.curve.XZ3SFC$$QueryWindow]): scala.reflect.ClassTag[org.locationtech.geomesa.curve.XZ3SFC.QueryWindow]))
146 949 6291 - 6324 Apply scala.Option.getOrElse maxRanges.getOrElse[Int](2147483647)
146 950 6267 - 6325 Apply org.locationtech.geomesa.curve.XZ3SFC.ranges XZ3SFC.this.ranges(windows.toArray[org.locationtech.geomesa.curve.XZ3SFC.QueryWindow]((ClassTag.apply[org.locationtech.geomesa.curve.XZ3SFC.QueryWindow](classOf[org.locationtech.geomesa.curve.XZ3SFC$$QueryWindow]): scala.reflect.ClassTag[org.locationtech.geomesa.curve.XZ3SFC.QueryWindow])), maxRanges.getOrElse[Int](2147483647))
161 951 6830 - 6870 Apply java.util.ArrayList.<init> new java.util.ArrayList[org.locationtech.geomesa.zorder.sfcurve.IndexRange](100)
164 952 6988 - 7027 Apply java.util.ArrayDeque.<init> new java.util.ArrayDeque[org.locationtech.geomesa.curve.XZ3SFC.XElement](100)
168 953 7148 - 7149 Literal <nosymbol> 0
169 954 7167 - 7179 Select scala.Array.length query.length
169 955 7163 - 7179 Apply scala.Int.< i.<(query.length)
169 963 7181 - 7181 Apply org.locationtech.geomesa.curve.XZ3SFC.while$1 while$1()
169 964 7181 - 7278 Block <nosymbol> { { if (oct.isContained(query.apply(i))) return true else (); i = i.+(1) }; while$1() }
169 965 7156 - 7156 Literal <nosymbol> ()
169 966 7156 - 7156 Block <nosymbol> ()
170 956 7211 - 7219 Apply scala.Array.apply query.apply(i)
170 957 7195 - 7220 Apply org.locationtech.geomesa.curve.XZ3SFC.XElement.isContained oct.isContained(query.apply(i))
170 960 7191 - 7191 Literal <nosymbol> ()
170 961 7191 - 7191 Block <nosymbol> ()
171 958 7241 - 7245 Literal <nosymbol> true
171 959 7234 - 7245 Return org.locationtech.geomesa.curve.XZ3SFC.isContained return true
173 962 7264 - 7270 Apply scala.Int.+ i.+(1)
175 967 7285 - 7290 Literal <nosymbol> false
180 968 7411 - 7412 Literal <nosymbol> 0
181 969 7430 - 7442 Select scala.Array.length query.length
181 970 7426 - 7442 Apply scala.Int.< i.<(query.length)
181 978 7444 - 7444 Apply org.locationtech.geomesa.curve.XZ3SFC.while$2 while$2()
181 979 7444 - 7538 Block <nosymbol> { { if (oct.overlaps(query.apply(i))) return true else (); i = i.+(1) }; while$2() }
181 980 7419 - 7419 Literal <nosymbol> ()
181 981 7419 - 7419 Block <nosymbol> ()
182 971 7471 - 7479 Apply scala.Array.apply query.apply(i)
182 972 7458 - 7480 Apply org.locationtech.geomesa.curve.XZ3SFC.XElement.overlaps oct.overlaps(query.apply(i))
182 975 7454 - 7454 Literal <nosymbol> ()
182 976 7454 - 7454 Block <nosymbol> ()
183 973 7501 - 7505 Literal <nosymbol> true
183 974 7494 - 7505 Return org.locationtech.geomesa.curve.XZ3SFC.isOverlapped return true
185 977 7524 - 7530 Apply scala.Int.+ i.+(1)
187 982 7545 - 7550 Literal <nosymbol> false
195 983 7864 - 7880 Apply org.locationtech.geomesa.curve.XZ3SFC.isContained isContained(oct)
195 989 7882 - 8088 Block <nosymbol> { <synthetic> <artifact> private[this] val x$3: (Long, Long) = (XZ3SFC.this.sequenceInterval(oct.xmin, oct.ymin, oct.zmin, level, false): (Long, Long) @unchecked) match { case (_1: Long, _2: Long)(Long, Long)((min @ _), (max @ _)) => scala.Tuple2.apply[Long, Long](min, max) }; val min: Long = x$3._1; val max: Long = x$3._2; { ranges.add(org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.apply(min, max, true)); () } }
197 984 7939 - 7939 Select scala.Tuple2._1 x$3._1
197 985 7944 - 7944 Select scala.Tuple2._2 x$3._2
198 986 8041 - 8079 Apply org.locationtech.geomesa.zorder.sfcurve.IndexRange.apply org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.apply(min, max, true)
198 987 8030 - 8080 Apply java.util.ArrayList.add ranges.add(org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.apply(min, max, true))
198 988 8040 - 8040 Literal <nosymbol> ()
199 990 8098 - 8115 Apply org.locationtech.geomesa.curve.XZ3SFC.isOverlapped isOverlapped(oct)
199 997 8117 - 8451 Block <nosymbol> { <synthetic> <artifact> private[this] val x$4: (Long, Long) = (XZ3SFC.this.sequenceInterval(oct.xmin, oct.ymin, oct.zmin, level, true): (Long, Long) @unchecked) match { case (_1: Long, _2: Long)(Long, Long)((min @ _), (max @ _)) => scala.Tuple2.apply[Long, Long](min, max) }; val min: Long = x$4._1; val max: Long = x$4._2; ranges.add(org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.apply(min, max, false)); oct.children.foreach[Boolean]({ ((x$1: org.locationtech.geomesa.curve.XZ3SFC.XElement) => remaining.add(x$1)) }) }
199 998 8094 - 8094 Literal <nosymbol> ()
199 999 8094 - 8094 Block <nosymbol> ()
199 1000 8094 - 8451 If <nosymbol> if (isOverlapped(oct)) { <synthetic> <artifact> private[this] val x$4: (Long, Long) = (XZ3SFC.this.sequenceInterval(oct.xmin, oct.ymin, oct.zmin, level, true): (Long, Long) @unchecked) match { case (_1: Long, _2: Long)(Long, Long)((min @ _), (max @ _)) => scala.Tuple2.apply[Long, Long](min, max) }; val min: Long = x$4._1; val max: Long = x$4._2; ranges.add(org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.apply(min, max, false)); oct.children.foreach[Boolean]({ ((x$1: org.locationtech.geomesa.curve.XZ3SFC.XElement) => remaining.add(x$1)) }) } else ()
202 991 8258 - 8258 Select scala.Tuple2._1 x$4._1
202 992 8263 - 8263 Select scala.Tuple2._2 x$4._2
203 993 8359 - 8398 Apply org.locationtech.geomesa.zorder.sfcurve.IndexRange.apply org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.apply(min, max, false)
203 994 8348 - 8399 Apply java.util.ArrayList.add ranges.add(org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.apply(min, max, false))
204 995 8429 - 8442 Apply java.util.ArrayDeque.add remaining.add(x$1)
204 996 8408 - 8443 Apply scala.collection.IterableLike.foreach oct.children.foreach[Boolean]({ ((x$1: org.locationtech.geomesa.curve.XZ3SFC.XElement) => remaining.add(x$1)) })
209 1001 8509 - 8522 Apply java.util.ArrayDeque.add remaining.add(x$1)
209 1002 8484 - 8523 Apply scala.collection.IterableLike.foreach XZ3SFC.LevelOneElements.foreach[Boolean]({ ((x$1: org.locationtech.geomesa.curve.XZ3SFC.XElement) => remaining.add(x$1)) })
210 1003 8542 - 8557 Select org.locationtech.geomesa.curve.XZ3SFC.LevelTerminator XZ3SFC.LevelTerminator
210 1004 8528 - 8558 Apply java.util.ArrayDeque.add remaining.add(XZ3SFC.LevelTerminator)
213 1005 8609 - 8610 Literal <nosymbol> 1
215 1006 8631 - 8632 Select org.locationtech.geomesa.curve.XZ3SFC.g XZ3SFC.this.g
215 1007 8636 - 8654 Select scala.Boolean.unary_! remaining.isEmpty().unary_!
215 1008 8658 - 8681 Apply scala.Int.< ranges.size().<(rangeStop)
215 1009 8623 - 8681 Apply scala.Boolean.&& level.<(XZ3SFC.this.g).&&(remaining.isEmpty().unary_!).&&(ranges.size().<(rangeStop))
215 1024 8683 - 8683 Apply org.locationtech.geomesa.curve.XZ3SFC.while$3 while$3()
215 1025 8683 - 9000 Block <nosymbol> { { val next: org.locationtech.geomesa.curve.XZ3SFC.XElement = remaining.poll(); if (next.eq(XZ3SFC.LevelTerminator)) if (remaining.isEmpty().unary_!) { level = level.+(1).toShort; remaining.add(XZ3SFC.LevelTerminator) } else () else checkValue(next, level) }; while$3() }
215 1026 8616 - 8616 Literal <nosymbol> ()
215 1027 8616 - 8616 Block <nosymbol> ()
216 1010 8702 - 8716 Apply java.util.ArrayDeque.poll remaining.poll()
217 1011 8735 - 8750 Select org.locationtech.geomesa.curve.XZ3SFC.LevelTerminator XZ3SFC.LevelTerminator
217 1012 8727 - 8751 Apply java.lang.Object.eq next.eq(XZ3SFC.LevelTerminator)
219 1013 8829 - 8847 Select scala.Boolean.unary_! remaining.isEmpty().unary_!
219 1018 8849 - 8939 Block <nosymbol> { level = level.+(1).toShort; remaining.add(XZ3SFC.LevelTerminator) }
219 1019 8825 - 8825 Literal <nosymbol> ()
219 1020 8825 - 8825 Block <nosymbol> ()
219 1021 8825 - 8939 If <nosymbol> if (remaining.isEmpty().unary_!) { level = level.+(1).toShort; remaining.add(XZ3SFC.LevelTerminator) } else ()
220 1014 8878 - 8879 Literal <nosymbol> 1
220 1015 8869 - 8888 Select scala.Int.toShort level.+(1).toShort
221 1016 8913 - 8928 Select org.locationtech.geomesa.curve.XZ3SFC.LevelTerminator XZ3SFC.LevelTerminator
221 1017 8899 - 8929 Apply java.util.ArrayDeque.add remaining.add(XZ3SFC.LevelTerminator)
224 1022 8963 - 8986 Apply org.locationtech.geomesa.curve.XZ3SFC.checkValue checkValue(next, level)
224 1023 8963 - 8986 Block org.locationtech.geomesa.curve.XZ3SFC.checkValue checkValue(next, level)
229 1028 9108 - 9126 Select scala.Boolean.unary_! remaining.isEmpty().unary_!
229 1040 9128 - 9128 Apply org.locationtech.geomesa.curve.XZ3SFC.while$4 while$4()
229 1041 9128 - 9418 Block <nosymbol> { { val oct: org.locationtech.geomesa.curve.XZ3SFC.XElement = remaining.poll(); if (oct.eq(XZ3SFC.LevelTerminator)) level = level.+(1).toShort else { <synthetic> <artifact> private[this] val x$5: (Long, Long) = (XZ3SFC.this.sequenceInterval(oct.xmin, oct.ymin, oct.zmin, level, false): (Long, Long) @unchecked) match { case (_1: Long, _2: Long)(Long, Long)((min @ _), (max @ _)) => scala.Tuple2.apply[Long, Long](min, max) }; val min: Long = x$5._1; val max: Long = x$5._2; ranges.add(org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.apply(min, max, false)) } }; while$4() }
229 1042 9101 - 9101 Literal <nosymbol> ()
229 1043 9101 - 9101 Block <nosymbol> ()
230 1029 9146 - 9160 Apply java.util.ArrayDeque.poll remaining.poll()
231 1030 9178 - 9193 Select org.locationtech.geomesa.curve.XZ3SFC.LevelTerminator XZ3SFC.LevelTerminator
231 1031 9171 - 9194 Apply java.lang.Object.eq oct.eq(XZ3SFC.LevelTerminator)
232 1032 9223 - 9224 Literal <nosymbol> 1
232 1033 9214 - 9233 Select scala.Int.toShort level.+(1).toShort
232 1034 9206 - 9233 Assign <nosymbol> level = level.+(1).toShort
233 1039 9247 - 9412 Block <nosymbol> { <synthetic> <artifact> private[this] val x$5: (Long, Long) = (XZ3SFC.this.sequenceInterval(oct.xmin, oct.ymin, oct.zmin, level, false): (Long, Long) @unchecked) match { case (_1: Long, _2: Long)(Long, Long)((min @ _), (max @ _)) => scala.Tuple2.apply[Long, Long](min, max) }; val min: Long = x$5._1; val max: Long = x$5._2; ranges.add(org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.apply(min, max, false)) }
234 1035 9262 - 9262 Select scala.Tuple2._1 x$5._1
234 1036 9267 - 9267 Select scala.Tuple2._2 x$5._2
235 1037 9364 - 9403 Apply org.locationtech.geomesa.zorder.sfcurve.IndexRange.apply org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.apply(min, max, false)
235 1038 9353 - 9404 Apply java.util.ArrayList.add ranges.add(org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.apply(min, max, false))
241 1044 9637 - 9667 Select org.locationtech.geomesa.zorder.sfcurve.IndexRange.IndexRangeIsOrdered org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.IndexRangeIsOrdered
241 1045 9625 - 9668 Apply java.util.ArrayList.sort ranges.sort(org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.IndexRangeIsOrdered)
243 1046 9688 - 9701 Apply java.util.ArrayList.get ranges.get(0)
244 1047 9764 - 9793 TypeApply scala.collection.generic.GenericCompanion.empty scala.collection.mutable.ArrayBuffer.empty[org.locationtech.geomesa.zorder.sfcurve.IndexRange]
245 1048 9806 - 9807 Literal <nosymbol> 1
246 1049 9823 - 9836 Apply java.util.ArrayList.size ranges.size()
246 1050 9819 - 9836 Apply scala.Int.< i.<(ranges.size())
246 1065 9838 - 9838 Apply org.locationtech.geomesa.curve.XZ3SFC.while$5 while$5()
246 1066 9838 - 10244 Block <nosymbol> { { val range: org.locationtech.geomesa.zorder.sfcurve.IndexRange = ranges.get(i); if (range.lower.<=(current.upper.+(1))) current = org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.apply(current.lower, scala.math.`package`.max(current.upper, range.upper), current.contained.&&(range.contained)) else { result.append(current); current = range }; i = i.+(1) }; while$5() }
246 1067 9812 - 9812 Literal <nosymbol> ()
246 1068 9812 - 9812 Block <nosymbol> ()
247 1051 9858 - 9871 Apply java.util.ArrayList.get ranges.get(i)
248 1052 9897 - 9914 Apply scala.Long.+ current.upper.+(1)
248 1053 9882 - 9914 Apply scala.Long.<= range.lower.<=(current.upper.+(1))
250 1054 9979 - 9992 Select org.locationtech.geomesa.zorder.sfcurve.IndexRange.lower current.lower
250 1055 10003 - 10016 Select org.locationtech.geomesa.zorder.sfcurve.IndexRange.upper current.upper
250 1056 10018 - 10029 Select org.locationtech.geomesa.zorder.sfcurve.IndexRange.upper range.upper
250 1057 9994 - 10030 Apply scala.math.max scala.math.`package`.max(current.upper, range.upper)
250 1058 10053 - 10068 Select org.locationtech.geomesa.zorder.sfcurve.IndexRange.contained range.contained
250 1059 10032 - 10068 Apply scala.Boolean.&& current.contained.&&(range.contained)
250 1060 9968 - 10069 Apply org.locationtech.geomesa.zorder.sfcurve.IndexRange.apply org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.apply(current.lower, scala.math.`package`.max(current.upper, range.upper), current.contained.&&(range.contained))
250 1061 9958 - 10069 Assign <nosymbol> current = org.locationtech.geomesa.zorder.sfcurve.`package`.IndexRange.apply(current.lower, scala.math.`package`.max(current.upper, range.upper), current.contained.&&(range.contained))
251 1063 10083 - 10225 Block <nosymbol> { result.append(current); current = range }
253 1062 10171 - 10193 Apply scala.collection.mutable.BufferLike.append result.append(current)
256 1064 10232 - 10238 Apply scala.Int.+ i.+(1)
259 1069 10328 - 10350 Apply scala.collection.mutable.BufferLike.append result.append(current)
261 1070 10356 - 10368 Select scala.collection.SeqLike.toSeq result.toSeq
276 1071 10854 - 10857 Literal <nosymbol> 0.0
277 1072 10873 - 10876 Literal <nosymbol> 0.0
278 1073 10892 - 10895 Literal <nosymbol> 0.0
279 1074 10911 - 10914 Literal <nosymbol> 1.0
280 1075 10930 - 10933 Literal <nosymbol> 1.0
281 1076 10949 - 10952 Literal <nosymbol> 1.0
283 1077 10967 - 10969 Literal <nosymbol> 0L
285 1078 10983 - 10984 Literal <nosymbol> 0
286 1079 10996 - 11006 Apply scala.Int.< i.<(length)
286 1113 11008 - 11008 Apply org.locationtech.geomesa.curve.XZ3SFC.while$6 while$6()
286 1114 11008 - 12330 Block <nosymbol> { { val xCenter: Double = xmin.+(xmax)./(2.0); val yCenter: Double = ymin.+(ymax)./(2.0); val zCenter: Double = zmin.+(zmax)./(2.0); scala.Tuple3.apply[Boolean, Boolean, Boolean](x.<(xCenter), y.<(yCenter), z.<(zCenter)) match { case (_1: Boolean, _2: Boolean, _3: Boolean)(Boolean, Boolean, Boolean)(true, true, true) => { cs = cs.+(1L); xmax = xCenter; ymax = yCenter; zmax = zCenter } case (_1: Boolean, _2: Boolean, _3: Boolean)(Boolean, Boolean, Boolean)(false, true, true) => { cs = cs.+(1L.+(1L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L))); xmin = xCenter; ymax = yCenter; zmax = zCenter } case (_1: Boolean, _2: Boolean, _3: Boolean)(Boolean, Boolean, Boolean)(true, false, true) => { cs = cs.+(1L.+(2L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L))); xmax = xCenter; ymin = yCenter; zmax = zCenter } case (_1: Boolean, _2: Boolean, _3: Boolean)(Boolean, Boolean, Boolean)(false, false, true) => { cs = cs.+(1L.+(3L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L))); xmin = xCenter; ymin = yCenter; zmax = zCenter } case (_1: Boolean, _2: Boolean, _3: Boolean)(Boolean, Boolean, Boolean)(true, true, false) => { cs = cs.+(1L.+(4L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L))); xmax = xCenter; ymax = yCenter; zmin = zCenter } case (_1: Boolean, _2: Boolean, _3: Boolean)(Boolean, Boolean, Boolean)(false, true, false) => { cs = cs.+(1L.+(5L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L))); xmin = xCenter; ymax = yCenter; zmin = zCenter } case (_1: Boolean, _2: Boolean, _3: Boolean)(Boolean, Boolean, Boolean)(true, false, false) => { cs = cs.+(1L.+(6L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L))); xmax = xCenter; ymin = yCenter; zmin = zCenter } case (_1: Boolean, _2: Boolean, _3: Boolean)(Boolean, Boolean, Boolean)(false, false, false) => { cs = cs.+(1L.+(7L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L))); xmin = xCenter; ymin = yCenter; zmin = zCenter } }; i = i.+(1) }; while$6() }
286 1115 10989 - 10989 Literal <nosymbol> ()
286 1116 10989 - 10989 Block <nosymbol> ()
287 1080 11030 - 11049 Apply scala.Double./ xmin.+(xmax)./(2.0)
288 1081 11070 - 11089 Apply scala.Double./ ymin.+(ymax)./(2.0)
289 1082 11110 - 11129 Apply scala.Double./ zmin.+(zmax)./(2.0)
291 1083 11222 - 11230 Apply scala.Long.+ cs.+(1L)
292 1084 11368 - 11370 Literal <nosymbol> 1L
292 1085 11373 - 11415 Apply scala.Long./ 1L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L)
292 1086 11368 - 11415 Apply scala.Long.+ 1L.+(1L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L))
292 1087 11362 - 11415 Apply scala.Long.+ cs.+(1L.+(1L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L)))
293 1088 11508 - 11510 Literal <nosymbol> 1L
293 1089 11513 - 11555 Apply scala.Long./ 2L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L)
293 1090 11508 - 11555 Apply scala.Long.+ 1L.+(2L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L))
293 1091 11502 - 11555 Apply scala.Long.+ cs.+(1L.+(2L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L)))
294 1092 11648 - 11650 Literal <nosymbol> 1L
294 1093 11653 - 11695 Apply scala.Long./ 3L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L)
294 1094 11648 - 11695 Apply scala.Long.+ 1L.+(3L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L))
294 1095 11642 - 11695 Apply scala.Long.+ cs.+(1L.+(3L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L)))
295 1096 11788 - 11790 Literal <nosymbol> 1L
295 1097 11793 - 11835 Apply scala.Long./ 4L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L)
295 1098 11788 - 11835 Apply scala.Long.+ 1L.+(4L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L))
295 1099 11782 - 11835 Apply scala.Long.+ cs.+(1L.+(4L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L)))
296 1100 11928 - 11930 Literal <nosymbol> 1L
296 1101 11933 - 11975 Apply scala.Long./ 5L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L)
296 1102 11928 - 11975 Apply scala.Long.+ 1L.+(5L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L))
296 1103 11922 - 11975 Apply scala.Long.+ cs.+(1L.+(5L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L)))
297 1104 12068 - 12070 Literal <nosymbol> 1L
297 1105 12073 - 12115 Apply scala.Long./ 6L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L)
297 1106 12068 - 12115 Apply scala.Long.+ 1L.+(6L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L))
297 1107 12062 - 12115 Apply scala.Long.+ cs.+(1L.+(6L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L)))
298 1108 12208 - 12210 Literal <nosymbol> 1L
298 1109 12213 - 12255 Apply scala.Long./ 7L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L)
298 1110 12208 - 12255 Apply scala.Long.+ 1L.+(7L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L))
298 1111 12202 - 12255 Apply scala.Long.+ cs.+(1L.+(7L.*(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(i).toDouble).toLong.-(1L))./(7L)))
300 1112 12318 - 12324 Apply scala.Int.+ i.+(1)
316 1117 12922 - 12928 Select scala.Short.toInt length.toInt
316 1118 12900 - 12929 Apply org.locationtech.geomesa.curve.XZ3SFC.sequenceCode XZ3SFC.this.sequenceCode(x, y, z, length.toInt)
319 1119 13137 - 13140 Ident org.locationtech.geomesa.curve.XZ3SFC.min min
321 1120 13209 - 13255 Apply scala.Long./ scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(length).+(1).toDouble).toLong.-(1L)./(7L)
321 1121 13203 - 13255 Apply scala.Long.+ min.+(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(length).+(1).toDouble).toLong.-(1L)./(7L))
321 1122 13203 - 13255 Block scala.Long.+ min.+(scala.math.`package`.pow(8.0, XZ3SFC.this.g.-(length).+(1).toDouble).toLong.-(1L)./(7L))
323 1123 13266 - 13276 Apply scala.Tuple2.apply scala.Tuple2.apply[Long, Long](min, max)
346 1124 14009 - 14021 Apply scala.Double.<= ymin.<=(ymax)
346 1125 14025 - 14037 Apply scala.Double.<= zmin.<=(zmax)
346 1126 13993 - 14037 Apply scala.Boolean.&& xmin.<=(xmax).&&(ymin.<=(ymax)).&&(zmin.<=(zmax))
346 1128 13985 - 14114 Apply scala.Predef.require scala.Predef.require(xmin.<=(xmax).&&(ymin.<=(ymax)).&&(zmin.<=(zmax)), scala.StringContext.apply("Bounds must be ordered: [", " ", "] [", " ", "] [", " ", "]").s(xmin, xmax, ymin, ymax, zmin, zmax))
347 1127 14045 - 14113 Apply scala.StringContext.s scala.StringContext.apply("Bounds must be ordered: [", " ", "] [", " ", "] [", " ", "]").s(xmin, xmax, ymin, ymax, zmin, zmax)
349 1181 14132 - 14626 Block <nosymbol> { scala.Predef.require(xmin.>=(XZ3SFC.this.xLo).&&(xmax.<=(XZ3SFC.this.xHi)).&&(ymin.>=(XZ3SFC.this.yLo)).&&(ymax.<=(XZ3SFC.this.yHi)).&&(zmin.>=(XZ3SFC.this.zLo)).&&(zmax.<=(XZ3SFC.this.zHi)), scala.StringContext.apply("Values out of bounds ([", " ", "] [", " ", "] [", " ", "]): [", " ", "] [", " ", "] [", " ", "]").s(XZ3SFC.this.xLo, XZ3SFC.this.xHi, XZ3SFC.this.yLo, XZ3SFC.this.yHi, XZ3SFC.this.zLo, XZ3SFC.this.zHi, xmin, xmax, ymin, ymax, zmin, zmax)); val nxmin: Double = xmin.-(XZ3SFC.this.xLo)./(XZ3SFC.this.xSize); val nymin: Double = ymin.-(XZ3SFC.this.yLo)./(XZ3SFC.this.ySize); val nzmin: Double = zmin.-(XZ3SFC.this.zLo)./(XZ3SFC.this.zSize); val nxmax: Double = xmax.-(XZ3SFC.this.xLo)./(XZ3SFC.this.xSize); val nymax: Double = ymax.-(XZ3SFC.this.yLo)./(XZ3SFC.this.ySize); val nzmax: Double = zmax.-(XZ3SFC.this.zLo)./(XZ3SFC.this.zSize); scala.Tuple6.apply[Double, Double, Double, Double, Double, Double](nxmin, nymin, nzmin, nxmax, nymax, nzmax) }
350 1129 14148 - 14151 Select org.locationtech.geomesa.curve.XZ3SFC.xLo XZ3SFC.this.xLo
350 1130 14163 - 14166 Select org.locationtech.geomesa.curve.XZ3SFC.xHi XZ3SFC.this.xHi
350 1131 14155 - 14166 Apply scala.Double.<= xmax.<=(XZ3SFC.this.xHi)
350 1132 14178 - 14181 Select org.locationtech.geomesa.curve.XZ3SFC.yLo XZ3SFC.this.yLo
350 1133 14170 - 14181 Apply scala.Double.>= ymin.>=(XZ3SFC.this.yLo)
350 1134 14193 - 14196 Select org.locationtech.geomesa.curve.XZ3SFC.yHi XZ3SFC.this.yHi
350 1135 14185 - 14196 Apply scala.Double.<= ymax.<=(XZ3SFC.this.yHi)
350 1136 14208 - 14211 Select org.locationtech.geomesa.curve.XZ3SFC.zLo XZ3SFC.this.zLo
350 1137 14200 - 14211 Apply scala.Double.>= zmin.>=(XZ3SFC.this.zLo)
350 1138 14223 - 14226 Select org.locationtech.geomesa.curve.XZ3SFC.zHi XZ3SFC.this.zHi
350 1139 14215 - 14226 Apply scala.Double.<= zmax.<=(XZ3SFC.this.zHi)
350 1140 14140 - 14226 Apply scala.Boolean.&& xmin.>=(XZ3SFC.this.xLo).&&(xmax.<=(XZ3SFC.this.xHi)).&&(ymin.>=(XZ3SFC.this.yLo)).&&(ymax.<=(XZ3SFC.this.yHi)).&&(zmin.>=(XZ3SFC.this.zLo)).&&(zmax.<=(XZ3SFC.this.zHi))
350 1161 14132 - 14341 Apply scala.Predef.require scala.Predef.require(xmin.>=(XZ3SFC.this.xLo).&&(xmax.<=(XZ3SFC.this.xHi)).&&(ymin.>=(XZ3SFC.this.yLo)).&&(ymax.<=(XZ3SFC.this.yHi)).&&(zmin.>=(XZ3SFC.this.zLo)).&&(zmax.<=(XZ3SFC.this.zHi)), scala.StringContext.apply("Values out of bounds ([", " ", "] [", " ", "] [", " ", "]): [", " ", "] [", " ", "] [", " ", "]").s(XZ3SFC.this.xLo, XZ3SFC.this.xHi, XZ3SFC.this.yLo, XZ3SFC.this.yHi, XZ3SFC.this.zLo, XZ3SFC.this.zHi, xmin, xmax, ymin, ymax, zmin, zmax))
351 1141 14238 - 14262 Literal <nosymbol> "Values out of bounds (["
351 1142 14265 - 14267 Literal <nosymbol> " "
351 1143 14270 - 14274 Literal <nosymbol> "] ["
351 1144 14277 - 14279 Literal <nosymbol> " "
351 1145 14282 - 14286 Literal <nosymbol> "] ["
351 1146 14289 - 14291 Literal <nosymbol> " "
351 1147 14294 - 14300 Literal <nosymbol> "]): ["
351 1148 14304 - 14306 Literal <nosymbol> " "
351 1149 14310 - 14314 Literal <nosymbol> "] ["
351 1150 14318 - 14320 Literal <nosymbol> " "
351 1151 14324 - 14328 Literal <nosymbol> "] ["
351 1152 14332 - 14334 Literal <nosymbol> " "
351 1153 14338 - 14340 Literal <nosymbol> "]"
351 1154 14262 - 14265 Select org.locationtech.geomesa.curve.XZ3SFC.xLo XZ3SFC.this.xLo
351 1155 14267 - 14270 Select org.locationtech.geomesa.curve.XZ3SFC.xHi XZ3SFC.this.xHi
351 1156 14274 - 14277 Select org.locationtech.geomesa.curve.XZ3SFC.yLo XZ3SFC.this.yLo
351 1157 14279 - 14282 Select org.locationtech.geomesa.curve.XZ3SFC.yHi XZ3SFC.this.yHi
351 1158 14286 - 14289 Select org.locationtech.geomesa.curve.XZ3SFC.zLo XZ3SFC.this.zLo
351 1159 14291 - 14294 Select org.locationtech.geomesa.curve.XZ3SFC.zHi XZ3SFC.this.zHi
351 1160 14236 - 14340 Apply scala.StringContext.s scala.StringContext.apply("Values out of bounds ([", " ", "] [", " ", "] [", " ", "]): [", " ", "] [", " ", "] [", " ", "]").s(XZ3SFC.this.xLo, XZ3SFC.this.xHi, XZ3SFC.this.yLo, XZ3SFC.this.yHi, XZ3SFC.this.zLo, XZ3SFC.this.zHi, xmin, xmax, ymin, ymax, zmin, zmax)
353 1162 14369 - 14372 Select org.locationtech.geomesa.curve.XZ3SFC.xLo XZ3SFC.this.xLo
353 1163 14376 - 14381 Select org.locationtech.geomesa.curve.XZ3SFC.xSize XZ3SFC.this.xSize
353 1164 14361 - 14381 Apply scala.Double./ xmin.-(XZ3SFC.this.xLo)./(XZ3SFC.this.xSize)
354 1165 14408 - 14411 Select org.locationtech.geomesa.curve.XZ3SFC.yLo XZ3SFC.this.yLo
354 1166 14415 - 14420 Select org.locationtech.geomesa.curve.XZ3SFC.ySize XZ3SFC.this.ySize
354 1167 14400 - 14420 Apply scala.Double./ ymin.-(XZ3SFC.this.yLo)./(XZ3SFC.this.ySize)
355 1168 14447 - 14450 Select org.locationtech.geomesa.curve.XZ3SFC.zLo XZ3SFC.this.zLo
355 1169 14454 - 14459 Select org.locationtech.geomesa.curve.XZ3SFC.zSize XZ3SFC.this.zSize
355 1170 14439 - 14459 Apply scala.Double./ zmin.-(XZ3SFC.this.zLo)./(XZ3SFC.this.zSize)
356 1171 14486 - 14489 Select org.locationtech.geomesa.curve.XZ3SFC.xLo XZ3SFC.this.xLo
356 1172 14493 - 14498 Select org.locationtech.geomesa.curve.XZ3SFC.xSize XZ3SFC.this.xSize
356 1173 14478 - 14498 Apply scala.Double./ xmax.-(XZ3SFC.this.xLo)./(XZ3SFC.this.xSize)
357 1174 14525 - 14528 Select org.locationtech.geomesa.curve.XZ3SFC.yLo XZ3SFC.this.yLo
357 1175 14532 - 14537 Select org.locationtech.geomesa.curve.XZ3SFC.ySize XZ3SFC.this.ySize
357 1176 14517 - 14537 Apply scala.Double./ ymax.-(XZ3SFC.this.yLo)./(XZ3SFC.this.ySize)
358 1177 14564 - 14567 Select org.locationtech.geomesa.curve.XZ3SFC.zLo XZ3SFC.this.zLo
358 1178 14571 - 14576 Select org.locationtech.geomesa.curve.XZ3SFC.zSize XZ3SFC.this.zSize
358 1179 14556 - 14576 Apply scala.Double./ zmax.-(XZ3SFC.this.zLo)./(XZ3SFC.this.zSize)
360 1180 14584 - 14626 Apply scala.Tuple6.apply scala.Tuple6.apply[Double, Double, Double, Double, Double, Double](nxmin, nymin, nzmin, nxmax, nymax, nzmax)
362 1261 14691 - 15521 Block <nosymbol> { val bxmin: Double = if (xmin.<(XZ3SFC.this.xLo)) XZ3SFC.this.xLo else if (xmin.>(XZ3SFC.this.xHi)) XZ3SFC.this.xHi else xmin; val bymin: Double = if (ymin.<(XZ3SFC.this.yLo)) XZ3SFC.this.yLo else if (ymin.>(XZ3SFC.this.yHi)) XZ3SFC.this.yHi else ymin; val bzmin: Double = if (zmin.<(XZ3SFC.this.zLo)) XZ3SFC.this.zLo else if (zmin.>(XZ3SFC.this.zHi)) XZ3SFC.this.zHi else zmin; val bxmax: Double = if (xmax.<(XZ3SFC.this.xLo)) XZ3SFC.this.xLo else if (xmax.>(XZ3SFC.this.xHi)) XZ3SFC.this.xHi else xmax; val bymax: Double = if (ymax.<(XZ3SFC.this.yLo)) XZ3SFC.this.yLo else if (ymax.>(XZ3SFC.this.yHi)) XZ3SFC.this.yHi else ymax; val bzmax: Double = if (zmax.<(XZ3SFC.this.zLo)) XZ3SFC.this.zLo else if (zmax.>(XZ3SFC.this.zHi)) XZ3SFC.this.zHi else zmax; val nxmin: Double = bxmin.-(XZ3SFC.this.xLo)./(XZ3SFC.this.xSize); val nymin: Double = bymin.-(XZ3SFC.this.yLo)./(XZ3SFC.this.ySize); val nzmin: Double = bzmin.-(XZ3SFC.this.zLo)./(XZ3SFC.this.zSize); val nxmax: Double = bxmax.-(XZ3SFC.this.xLo)./(XZ3SFC.this.xSize); val nymax: Double = bymax.-(XZ3SFC.this.yLo)./(XZ3SFC.this.ySize); val nzmax: Double = bzmax.-(XZ3SFC.this.zLo)./(XZ3SFC.this.zSize); scala.Tuple6.apply[Double, Double, Double, Double, Double, Double](nxmin, nymin, nzmin, nxmax, nymax, nzmax) }
364 1182 14726 - 14729 Select org.locationtech.geomesa.curve.XZ3SFC.xLo XZ3SFC.this.xLo
364 1183 14719 - 14729 Apply scala.Double.< xmin.<(XZ3SFC.this.xLo)
364 1184 14733 - 14736 Select org.locationtech.geomesa.curve.XZ3SFC.xLo XZ3SFC.this.xLo
364 1185 14733 - 14736 Block org.locationtech.geomesa.curve.XZ3SFC.xLo XZ3SFC.this.xLo
364 1186 14755 - 14758 Select org.locationtech.geomesa.curve.XZ3SFC.xHi XZ3SFC.this.xHi
364 1187 14748 - 14758 Apply scala.Double.> xmin.>(XZ3SFC.this.xHi)
364 1188 14762 - 14765 Select org.locationtech.geomesa.curve.XZ3SFC.xHi XZ3SFC.this.xHi
364 1189 14762 - 14765 Block org.locationtech.geomesa.curve.XZ3SFC.xHi XZ3SFC.this.xHi
364 1190 14775 - 14779 Ident org.locationtech.geomesa.curve.XZ3SFC.xmin xmin
364 1191 14744 - 14781 If <nosymbol> if (xmin.>(XZ3SFC.this.xHi)) XZ3SFC.this.xHi else xmin
365 1192 14813 - 14816 Select org.locationtech.geomesa.curve.XZ3SFC.yLo XZ3SFC.this.yLo
365 1193 14806 - 14816 Apply scala.Double.< ymin.<(XZ3SFC.this.yLo)
365 1194 14820 - 14823 Select org.locationtech.geomesa.curve.XZ3SFC.yLo XZ3SFC.this.yLo
365 1195 14820 - 14823 Block org.locationtech.geomesa.curve.XZ3SFC.yLo XZ3SFC.this.yLo
365 1196 14842 - 14845 Select org.locationtech.geomesa.curve.XZ3SFC.yHi XZ3SFC.this.yHi
365 1197 14835 - 14845 Apply scala.Double.> ymin.>(XZ3SFC.this.yHi)
365 1198 14849 - 14852 Select org.locationtech.geomesa.curve.XZ3SFC.yHi XZ3SFC.this.yHi
365 1199 14849 - 14852 Block org.locationtech.geomesa.curve.XZ3SFC.yHi XZ3SFC.this.yHi
365 1200 14862 - 14866 Ident org.locationtech.geomesa.curve.XZ3SFC.ymin ymin
365 1201 14831 - 14868 If <nosymbol> if (ymin.>(XZ3SFC.this.yHi)) XZ3SFC.this.yHi else ymin
366 1202 14900 - 14903 Select org.locationtech.geomesa.curve.XZ3SFC.zLo XZ3SFC.this.zLo
366 1203 14893 - 14903 Apply scala.Double.< zmin.<(XZ3SFC.this.zLo)
366 1204 14907 - 14910 Select org.locationtech.geomesa.curve.XZ3SFC.zLo XZ3SFC.this.zLo
366 1205 14907 - 14910 Block org.locationtech.geomesa.curve.XZ3SFC.zLo XZ3SFC.this.zLo
366 1206 14929 - 14932 Select org.locationtech.geomesa.curve.XZ3SFC.zHi XZ3SFC.this.zHi
366 1207 14922 - 14932 Apply scala.Double.> zmin.>(XZ3SFC.this.zHi)
366 1208 14936 - 14939 Select org.locationtech.geomesa.curve.XZ3SFC.zHi XZ3SFC.this.zHi
366 1209 14936 - 14939 Block org.locationtech.geomesa.curve.XZ3SFC.zHi XZ3SFC.this.zHi
366 1210 14949 - 14953 Ident org.locationtech.geomesa.curve.XZ3SFC.zmin zmin
366 1211 14918 - 14955 If <nosymbol> if (zmin.>(XZ3SFC.this.zHi)) XZ3SFC.this.zHi else zmin
367 1212 14987 - 14990 Select org.locationtech.geomesa.curve.XZ3SFC.xLo XZ3SFC.this.xLo
367 1213 14980 - 14990 Apply scala.Double.< xmax.<(XZ3SFC.this.xLo)
367 1214 14994 - 14997 Select org.locationtech.geomesa.curve.XZ3SFC.xLo XZ3SFC.this.xLo
367 1215 14994 - 14997 Block org.locationtech.geomesa.curve.XZ3SFC.xLo XZ3SFC.this.xLo
367 1216 15016 - 15019 Select org.locationtech.geomesa.curve.XZ3SFC.xHi XZ3SFC.this.xHi
367 1217 15009 - 15019 Apply scala.Double.> xmax.>(XZ3SFC.this.xHi)
367 1218 15023 - 15026 Select org.locationtech.geomesa.curve.XZ3SFC.xHi XZ3SFC.this.xHi
367 1219 15023 - 15026 Block org.locationtech.geomesa.curve.XZ3SFC.xHi XZ3SFC.this.xHi
367 1220 15036 - 15040 Ident org.locationtech.geomesa.curve.XZ3SFC.xmax xmax
367 1221 15005 - 15042 If <nosymbol> if (xmax.>(XZ3SFC.this.xHi)) XZ3SFC.this.xHi else xmax
368 1222 15074 - 15077 Select org.locationtech.geomesa.curve.XZ3SFC.yLo XZ3SFC.this.yLo
368 1223 15067 - 15077 Apply scala.Double.< ymax.<(XZ3SFC.this.yLo)
368 1224 15081 - 15084 Select org.locationtech.geomesa.curve.XZ3SFC.yLo XZ3SFC.this.yLo
368 1225 15081 - 15084 Block org.locationtech.geomesa.curve.XZ3SFC.yLo XZ3SFC.this.yLo
368 1226 15103 - 15106 Select org.locationtech.geomesa.curve.XZ3SFC.yHi XZ3SFC.this.yHi
368 1227 15096 - 15106 Apply scala.Double.> ymax.>(XZ3SFC.this.yHi)
368 1228 15110 - 15113 Select org.locationtech.geomesa.curve.XZ3SFC.yHi XZ3SFC.this.yHi
368 1229 15110 - 15113 Block org.locationtech.geomesa.curve.XZ3SFC.yHi XZ3SFC.this.yHi
368 1230 15123 - 15127 Ident org.locationtech.geomesa.curve.XZ3SFC.ymax ymax
368 1231 15092 - 15129 If <nosymbol> if (ymax.>(XZ3SFC.this.yHi)) XZ3SFC.this.yHi else ymax
369 1232 15161 - 15164 Select org.locationtech.geomesa.curve.XZ3SFC.zLo XZ3SFC.this.zLo
369 1233 15154 - 15164 Apply scala.Double.< zmax.<(XZ3SFC.this.zLo)
369 1234 15168 - 15171 Select org.locationtech.geomesa.curve.XZ3SFC.zLo XZ3SFC.this.zLo
369 1235 15168 - 15171 Block org.locationtech.geomesa.curve.XZ3SFC.zLo XZ3SFC.this.zLo
369 1236 15190 - 15193 Select org.locationtech.geomesa.curve.XZ3SFC.zHi XZ3SFC.this.zHi
369 1237 15183 - 15193 Apply scala.Double.> zmax.>(XZ3SFC.this.zHi)
369 1238 15197 - 15200 Select org.locationtech.geomesa.curve.XZ3SFC.zHi XZ3SFC.this.zHi
369 1239 15197 - 15200 Block org.locationtech.geomesa.curve.XZ3SFC.zHi XZ3SFC.this.zHi
369 1240 15210 - 15214 Ident org.locationtech.geomesa.curve.XZ3SFC.zmax zmax
369 1241 15179 - 15216 If <nosymbol> if (zmax.>(XZ3SFC.this.zHi)) XZ3SFC.this.zHi else zmax
371 1242 15247 - 15250 Select org.locationtech.geomesa.curve.XZ3SFC.xLo XZ3SFC.this.xLo
371 1243 15254 - 15259 Select org.locationtech.geomesa.curve.XZ3SFC.xSize XZ3SFC.this.xSize
371 1244 15238 - 15259 Apply scala.Double./ bxmin.-(XZ3SFC.this.xLo)./(XZ3SFC.this.xSize)
372 1245 15289 - 15292 Select org.locationtech.geomesa.curve.XZ3SFC.yLo XZ3SFC.this.yLo
372 1246 15296 - 15301 Select org.locationtech.geomesa.curve.XZ3SFC.ySize XZ3SFC.this.ySize
372 1247 15280 - 15301 Apply scala.Double./ bymin.-(XZ3SFC.this.yLo)./(XZ3SFC.this.ySize)
373 1248 15331 - 15334 Select org.locationtech.geomesa.curve.XZ3SFC.zLo XZ3SFC.this.zLo
373 1249 15338 - 15343 Select org.locationtech.geomesa.curve.XZ3SFC.zSize XZ3SFC.this.zSize
373 1250 15322 - 15343 Apply scala.Double./ bzmin.-(XZ3SFC.this.zLo)./(XZ3SFC.this.zSize)
374 1251 15373 - 15376 Select org.locationtech.geomesa.curve.XZ3SFC.xLo XZ3SFC.this.xLo
374 1252 15380 - 15385 Select org.locationtech.geomesa.curve.XZ3SFC.xSize XZ3SFC.this.xSize
374 1253 15364 - 15385 Apply scala.Double./ bxmax.-(XZ3SFC.this.xLo)./(XZ3SFC.this.xSize)
375 1254 15415 - 15418 Select org.locationtech.geomesa.curve.XZ3SFC.yLo XZ3SFC.this.yLo
375 1255 15422 - 15427 Select org.locationtech.geomesa.curve.XZ3SFC.ySize XZ3SFC.this.ySize
375 1256 15406 - 15427 Apply scala.Double./ bymax.-(XZ3SFC.this.yLo)./(XZ3SFC.this.ySize)
376 1257 15457 - 15460 Select org.locationtech.geomesa.curve.XZ3SFC.zLo XZ3SFC.this.zLo
376 1258 15464 - 15469 Select org.locationtech.geomesa.curve.XZ3SFC.zSize XZ3SFC.this.zSize
376 1259 15448 - 15469 Apply scala.Double./ bzmax.-(XZ3SFC.this.zLo)./(XZ3SFC.this.zSize)
378 1260 15479 - 15521 Apply scala.Tuple6.apply scala.Tuple6.apply[Double, Double, Double, Double, Double, Double](nxmin, nymin, nzmin, nxmax, nymax, nzmax)
386 1262 15625 - 15628 Literal <nosymbol> 0.0
386 1263 15630 - 15633 Literal <nosymbol> 0.0
386 1264 15635 - 15638 Literal <nosymbol> 0.0
386 1265 15640 - 15643 Literal <nosymbol> 1.0
386 1266 15645 - 15648 Literal <nosymbol> 1.0
386 1267 15650 - 15653 Literal <nosymbol> 1.0
386 1268 15655 - 15658 Literal <nosymbol> 1.0
386 1269 15616 - 15668 Select org.locationtech.geomesa.curve.XZ3SFC.XElement.children XZ3SFC.this.XElement.apply(0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0).children
389 1270 15768 - 15817 Apply org.locationtech.geomesa.curve.XZ3SFC.XElement.apply XZ3SFC.this.XElement.apply(-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 0.0)
391 1271 15841 - 15914 Apply java.util.concurrent.ConcurrentHashMap.<init> new java.util.concurrent.ConcurrentHashMap[(Short, org.locationtech.geomesa.curve.TimePeriod.TimePeriod),org.locationtech.geomesa.curve.XZ3SFC]()
394 1272 15994 - 16005 Apply scala.Tuple2.apply scala.Tuple2.apply[Short, org.locationtech.geomesa.curve.TimePeriod.TimePeriod](g, period)
394 1273 15984 - 16006 Apply java.util.concurrent.ConcurrentHashMap.get XZ3SFC.this.cache.get(scala.Tuple2.apply[Short, org.locationtech.geomesa.curve.TimePeriod.TimePeriod](g, period))
395 1274 16015 - 16026 Apply java.lang.Object.== sfc.==(null)
395 1283 16028 - 16173 Block <nosymbol> { sfc = new XZ3SFC(g, scala.Tuple2.apply[Double, Double](-180.0, 180.0), scala.Tuple2.apply[Double, Double](-90.0, 90.0), scala.Tuple2.apply[Double, Double](0.0, BinnedTime.maxOffset(period).toDouble)); XZ3SFC.this.cache.put(scala.Tuple2.apply[Short, org.locationtech.geomesa.curve.TimePeriod.TimePeriod](g, period), sfc) }
395 1284 16011 - 16011 Literal <nosymbol> ()
395 1285 16011 - 16011 Block <nosymbol> ()
396 1275 16056 - 16071 Apply scala.Tuple2.apply scala.Tuple2.apply[Double, Double](-180.0, 180.0)
396 1276 16073 - 16086 Apply scala.Tuple2.apply scala.Tuple2.apply[Double, Double](-90.0, 90.0)
396 1277 16089 - 16092 Literal <nosymbol> 0.0
396 1278 16094 - 16131 Select scala.Long.toDouble BinnedTime.maxOffset(period).toDouble
396 1279 16088 - 16132 Apply scala.Tuple2.apply scala.Tuple2.apply[Double, Double](0.0, BinnedTime.maxOffset(period).toDouble)
396 1280 16042 - 16133 Apply org.locationtech.geomesa.curve.XZ3SFC.<init> new XZ3SFC(g, scala.Tuple2.apply[Double, Double](-180.0, 180.0), scala.Tuple2.apply[Double, Double](-90.0, 90.0), scala.Tuple2.apply[Double, Double](0.0, BinnedTime.maxOffset(period).toDouble))
397 1281 16150 - 16161 Apply scala.Tuple2.apply scala.Tuple2.apply[Short, org.locationtech.geomesa.curve.TimePeriod.TimePeriod](g, period)
397 1282 16140 - 16167 Apply java.util.concurrent.ConcurrentHashMap.put XZ3SFC.this.cache.put(scala.Tuple2.apply[Short, org.locationtech.geomesa.curve.TimePeriod.TimePeriod](g, period), sfc)
442 1286 17933 - 17937 Select org.locationtech.geomesa.curve.XZ3SFC.XElement.xmin XElement.this.xmin
442 1287 17956 - 17960 Select org.locationtech.geomesa.curve.XZ3SFC.XElement.ymin XElement.this.ymin
442 1288 17941 - 17960 Apply scala.Double.<= window.ymin.<=(XElement.this.ymin)
442 1289 17979 - 17983 Select org.locationtech.geomesa.curve.XZ3SFC.XElement.zmin XElement.this.zmin
442 1290 17964 - 17983 Apply scala.Double.<= window.zmin.<=(XElement.this.zmin)
443 1291 17997 - 18016 Apply scala.Double.>= window.xmax.>=(XElement.this.xext)
443 1292 18020 - 18039 Apply scala.Double.>= window.ymax.>=(XElement.this.yext)
443 1293 18043 - 18062 Apply scala.Double.>= window.zmax.>=(XElement.this.zext)
443 1294 17918 - 18062 Apply scala.Boolean.&& window.xmin.<=(XElement.this.xmin).&&(window.ymin.<=(XElement.this.ymin)).&&(window.zmin.<=(XElement.this.zmin)).&&(window.xmax.>=(XElement.this.xext)).&&(window.ymax.>=(XElement.this.yext)).&&(window.zmax.>=(XElement.this.zext))
446 1295 18134 - 18138 Select org.locationtech.geomesa.curve.XZ3SFC.XElement.xmin XElement.this.xmin
446 1296 18157 - 18161 Select org.locationtech.geomesa.curve.XZ3SFC.XElement.ymin XElement.this.ymin
446 1297 18142 - 18161 Apply scala.Double.>= window.ymax.>=(XElement.this.ymin)
446 1298 18180 - 18184 Select org.locationtech.geomesa.curve.XZ3SFC.XElement.zmin XElement.this.zmin
446 1299 18165 - 18184 Apply scala.Double.>= window.zmax.>=(XElement.this.zmin)
447 1300 18198 - 18217 Apply scala.Double.<= window.xmin.<=(XElement.this.xext)
447 1301 18221 - 18240 Apply scala.Double.<= window.ymin.<=(XElement.this.yext)
447 1302 18244 - 18263 Apply scala.Double.<= window.zmin.<=(XElement.this.zext)
447 1303 18119 - 18263 Apply scala.Boolean.&& window.xmax.>=(XElement.this.xmin).&&(window.ymax.>=(XElement.this.ymin)).&&(window.zmax.>=(XElement.this.zmin)).&&(window.xmin.<=(XElement.this.xext)).&&(window.ymin.<=(XElement.this.yext)).&&(window.zmin.<=(XElement.this.zext))
450 1304 18321 - 18340 Apply scala.Double./ XElement.this.xmin.+(XElement.this.xmax)./(2.0)
451 1305 18361 - 18380 Apply scala.Double./ XElement.this.ymin.+(XElement.this.ymax)./(2.0)
452 1306 18401 - 18420 Apply scala.Double./ XElement.this.zmin.+(XElement.this.zmax)./(2.0)
453 1307 18437 - 18449 Apply scala.Double./ XElement.this.length./(2.0)
454 1308 18465 - 18531 Apply org.locationtech.geomesa.curve.XZ3SFC.XElement.copy XElement.this.copy(x$5, x$6, x$7, x$1, x$2, x$3, x$4)
455 1309 18547 - 18613 Apply org.locationtech.geomesa.curve.XZ3SFC.XElement.copy XElement.this.copy(x$8, x$12, x$13, x$14, x$9, x$10, x$11)
456 1310 18629 - 18695 Apply org.locationtech.geomesa.curve.XZ3SFC.XElement.copy XElement.this.copy(x$19, x$16, x$20, x$15, x$21, x$17, x$18)
457 1311 18711 - 18777 Apply org.locationtech.geomesa.curve.XZ3SFC.XElement.copy XElement.this.copy(x$22, x$23, x$26, x$27, x$28, x$24, x$25)
458 1312 18793 - 18859 Apply org.locationtech.geomesa.curve.XZ3SFC.XElement.copy XElement.this.copy(x$33, x$34, x$31, x$29, x$30, x$35, x$32)
459 1313 18875 - 18941 Apply org.locationtech.geomesa.curve.XZ3SFC.XElement.copy XElement.this.copy(x$36, x$40, x$38, x$41, x$37, x$42, x$39)
460 1314 18957 - 19023 Apply org.locationtech.geomesa.curve.XZ3SFC.XElement.copy XElement.this.copy(x$47, x$44, x$45, x$43, x$48, x$49, x$46)
461 1315 19039 - 19105 Apply org.locationtech.geomesa.curve.XZ3SFC.XElement.copy XElement.this.copy(x$50, x$51, x$52, x$54, x$55, x$56, x$53)
462 1316 19112 - 19147 Apply scala.collection.generic.GenericCompanion.apply scala.collection.Seq.apply[org.locationtech.geomesa.curve.XZ3SFC.XElement](c0, c1, c2, c3, c4, c5, c6, c7)