1 /***********************************************************************
2  * Copyright (c) 2013-2025 General Atomics Integrated Intelligence, 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  * https://www.apache.org/licenses/LICENSE-2.0
7  ***********************************************************************/
8 
9 package org.locationtech.geomesa.utils.bin
10 
11 import com.typesafe.scalalogging.LazyLogging
12 import org.geotools.api.feature.simple.{SimpleFeature, SimpleFeatureType}
13 import org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.{ByteArrayCallback, ByteStreamCallback}
14 import org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValues
15 import org.locationtech.geomesa.utils.collection.CloseableIterator
16 import org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes
17 import org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec
18 import org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpecParser
19 import org.locationtech.jts.geom.{Geometry, LineString, Point}
20 
21 import java.io.{ByteArrayOutputStream, OutputStream}
22 import java.nio.charset.StandardCharsets
23 import java.nio.{ByteBuffer, ByteOrder}
24 import java.util.Date
25 import scala.collection.JavaConverters._
26 
27 class BinaryOutputEncoder private (toValues: ToValues) {
28 
29   def encode(f: SimpleFeature): Array[Byte] = {
30     toValues(f, ByteArrayCallback)
31     ByteArrayCallback.result
32   }
33 
34   def encode(f: SimpleFeature, callback: BinaryOutputCallback): Unit = toValues(f, callback)
35 
36   def encode(f: Iterator[SimpleFeature], os: OutputStream): Long =
37     encode(f, os, sort = false)
38 
39   def encode(f: Iterator[SimpleFeature], os: OutputStream, sort: Boolean): Long = {
40     if (sort) {
41       val byteStream = new ByteArrayOutputStream
42       val callback = new ByteStreamCallback(byteStream)
43       f.foreach(toValues(_, callback))
44       val count = callback.result
45       val bytes = byteStream.toByteArray
46       val size = (bytes.length / count).toInt
47       bytes.grouped(size).toSeq.sorted(BinaryOutputEncoder.DateOrdering).foreach(os.write)
48       count
49     } else {
50       val callback = new ByteStreamCallback(os)
51       f.foreach(toValues(_, callback))
52       callback.result
53     }
54   }
55 }
56 
57 object BinaryOutputEncoder extends LazyLogging {
58 
59   import AxisOrder._
60   import org.locationtech.geomesa.utils.geotools.Conversions._
61   import org.locationtech.geomesa.utils.geotools.RichSimpleFeatureType.RichSimpleFeatureType
62 
63   val BinEncodedSft: SimpleFeatureType = SimpleFeatureTypes.createType("bin", "bin:Bytes,*geom:Point:srid=4326")
64   val BIN_ATTRIBUTE_INDEX = 0 // index of 'bin' attribute in BinEncodedSft
65 
66   // compares the 4 bytes representing the date in a bin array
67   private val DateOrdering = new Ordering[Array[Byte]] {
68     override def compare(x: Array[Byte], y: Array[Byte]): Int = {
69       val compare1 = Ordering.Byte.compare(x(4), y(4))
70       if (compare1 != 0) { return compare1 }
71       val compare2 = Ordering.Byte.compare(x(5), y(5))
72       if (compare2 != 0) { return compare2 }
73       val compare3 = Ordering.Byte.compare(x(6), y(6))
74       if (compare3 != 0) { return compare3 }
75       Ordering.Byte.compare(x(7), y(7))
76     }
77   }
78 
79   case class EncodingOptions(geomField: Option[Int],
80                              dtgField: Option[Int],
81                              trackIdField: Option[Int],
82                              labelField: Option[Int] = None,
83                              axisOrder: Option[AxisOrder] = None)
84 
85   case class EncodedValues(trackId: Int, lat: Float, lon: Float, dtg: Long, label: Long)
86 
87   /**
88     * BIN queries pack multiple records into each feature. To count the records, we have to count
89     * the total bytes coming back, instead of the number of features
90     *
91     * @param iter aggregated bin iter
92     * @param maxFeatures max features
93     * @param hasLabel bin results have labels (extended format) or not
94     */
95   class FeatureLimitingIterator(iter: CloseableIterator[SimpleFeature], maxFeatures: Int, hasLabel: Boolean)
96       extends CloseableIterator[SimpleFeature] {
97 
98     private val bytesPerHit = if (hasLabel) { 24 } else { 16 }
99     private var seen = 0L
100 
101     override def hasNext: Boolean = seen < maxFeatures && iter.hasNext
102 
103     override def next(): SimpleFeature = {
104       if (hasNext) {
105         val sf = iter.next()
106         val bytes = sf.getAttribute(0).asInstanceOf[Array[Byte]]
107         val count = bytes.length / bytesPerHit
108         seen += count
109         if (seen > maxFeatures) {
110           // remove the extra aggregated features so that we hit our exact feature limit
111           val trimmed = Array.ofDim[Byte]((count - (seen - maxFeatures).toInt) * bytesPerHit)
112           System.arraycopy(bytes, 0, trimmed, 0, trimmed.length)
113           sf.setAttribute(0, trimmed)
114         }
115         sf
116       } else {
117         Iterator.empty.next()
118       }
119     }
120 
121     override def close(): Unit = iter.close()
122   }
123 
124   def apply(sft: SimpleFeatureType, options: EncodingOptions): BinaryOutputEncoder =
125     new BinaryOutputEncoder(toValues(sft, options))
126 
127   def convertToTrack(f: SimpleFeature, i: Int): Int = convertToTrack(f.getAttribute(i))
128   def convertToTrack(track: AnyRef): Int = if (track == null) { 0 } else { track.hashCode }
129 
130   // TODO could use `.getDateAsLong` if we know we have a KryoBufferSimpleFeature
131   def convertToDate(f: SimpleFeature, i: Int): Long = convertToDate(f.getAttribute(i).asInstanceOf[Date])
132   def convertToDate(date: Date): Long = if (date == null) { 0L } else { date.getTime }
133 
134   def convertToLabel(f: SimpleFeature, i: Int): Long = convertToLabel(f.getAttribute(i))
135   def convertToLabel(label: AnyRef): Long = label match {
136     case null => 0L
137     case n: Number => n.longValue()
138     case _ =>
139       var sum = 0L
140       var i = 0
141       label.toString.getBytes(StandardCharsets.UTF_8).iterator.take(8).foreach { b =>
142         sum += (b & 0xffL) << (8 * i)
143         i += 1
144       }
145       sum
146   }
147 
148   /**
149     * Decodes a byte array
150     *
151     * @param encoded encoded byte array
152     * @param callback callback for results
153     */
154   def decode(encoded: Array[Byte], callback: BinaryOutputCallback): Unit = {
155     val buf = ByteBuffer.wrap(encoded).order(ByteOrder.LITTLE_ENDIAN)
156     val trackId = buf.getInt
157     val time = buf.getInt * 1000L
158     val lat = buf.getFloat
159     val lon = buf.getFloat
160     if (encoded.length > 16) {
161       val label = buf.getLong
162       callback(trackId, lat, lon, time, label)
163     } else {
164       callback(trackId, lat, lon, time)
165     }
166   }
167 
168   def decode(encoded: Array[Byte]): EncodedValues = {
169     var values: EncodedValues = null
170     decode(encoded, new BinaryOutputCallback() {
171       override def apply(trackId: Int, lat: Float, lon: Float, dtg: Long): Unit =
172         values = EncodedValues(trackId, lat, lon, dtg, -1L)
173       override def apply(trackId: Int, lat: Float, lon: Float, dtg: Long, label: Long): Unit =
174         values = EncodedValues(trackId, lat, lon, dtg, label)
175     })
176     values
177   }
178 
179   /**
180     * Creates the function to map a simple feature to a bin-encoded buffer
181     *
182     * @param sft simple feature type
183     * @param options encoding options
184     * @return
185     */
186   private def toValues(sft: SimpleFeatureType, options: EncodingOptions): ToValues = {
187 
188     val geomIndex = options.geomField.getOrElse(sft.getGeomIndex)
189     if (geomIndex == -1) {
190       throw new IllegalArgumentException(s"Invalid geometry field requested for feature type ${sft.getTypeName}")
191     }
192     val dtgIndex = options.dtgField.orElse(sft.getDtgIndex).getOrElse(-1)
193     if (dtgIndex == -1) {
194       throw new RuntimeException(s"Invalid date field requested for feature type ${sft.getTypeName}")
195     }
196     val isSingleDate = classOf[Date].isAssignableFrom(sft.getDescriptor(dtgIndex).getType.getBinding)
197     val axisOrder = options.axisOrder.getOrElse(AxisOrder.LonLat)
198 
199     val (isPoint, isLineString) = {
200       val binding = sft.getDescriptor(geomIndex).getType.getBinding
201       (binding == classOf[Point], binding == classOf[LineString])
202     }
203 
204     // noinspection ExistsEquals
205     if (options.trackIdField.exists(_ == -1)) {
206       throw new IllegalArgumentException(s"Invalid track field requested for feature type ${sft.getTypeName}")
207     } else if (options.labelField.exists(_ == -1)) {
208       throw new IllegalArgumentException(s"Invalid label field requested for feature type ${sft.getTypeName}")
209     } else if (!isSingleDate) {
210       if (isLineString) {
211         val dtgField = sft.getDescriptor(dtgIndex).getLocalName
212         val sftAttributes = SimpleFeatureSpecParser.parse(SimpleFeatureTypes.encodeType(sft)).attributes
213         sftAttributes.find(_.name == dtgField).foreach { spec =>
214           if (!spec.isInstanceOf[ListAttributeSpec] ||
215                 !classOf[Date].isAssignableFrom(spec.asInstanceOf[ListAttributeSpec].subClass)) {
216             throw new RuntimeException(s"Invalid date field requested for feature type ${sft.getTypeName}")
217           }
218         }
219       } else {
220         throw new RuntimeException(s"Invalid date field requested for feature type ${sft.getTypeName}")
221       }
222     }
223 
224     // gets the track id from a feature
225     val getTrackId: (SimpleFeature) => Int = options.trackIdField match {
226       case None => (f) => f.getID.hashCode
227       case Some(trackId) => convertToTrack(_, trackId)
228     }
229 
230     // gets the label from a feature
231     val getLabelOption: Option[(SimpleFeature) => Long] = options.labelField.map { labelIndex =>
232       convertToLabel(_, labelIndex)
233     }
234 
235     if (isLineString) {
236       // for linestrings, we return each point - use an array so we get constant-time lookup
237       // depending on srs requested and wfs versions, axis order can be flipped
238       val getLineLatLon: (SimpleFeature) => Array[(Float, Float)] = axisOrder match {
239         case LatLon => lineToXY(_, geomIndex)
240         case LonLat => lineToYX(_, geomIndex)
241       }
242 
243       if (isSingleDate) {
244         getLabelOption match {
245           case None => new ToValuesLines(getTrackId, getLineLatLon, dtgIndex)
246           case Some(getLabel) => new ToValuesLinesLabels(getTrackId, getLineLatLon, getLabel, dtgIndex)
247         }
248       } else {
249         // for line strings, we need an array of dates corresponding to the points in the line
250         val getLineDtg: (SimpleFeature) => Array[Long] = dateArray(_, dtgIndex)
251         getLabelOption match {
252           case None => new ToValuesLinesDates(getTrackId, getLineLatLon, getLineDtg)
253           case Some(getLabel) => new ToValuesLinesDatesLabels(getTrackId, getLineLatLon, getLineDtg, getLabel)
254         }
255       }
256     } else {
257       // get lat/lon as floats
258       // depending on srs requested and wfs versions, axis order can be flipped
259       val getLatLon: (SimpleFeature) => (Float, Float) = (isPoint, axisOrder) match {
260         case (true,  LatLon) => pointToXY(_, geomIndex)
261         case (true,  LonLat) => pointToYX(_, geomIndex)
262         case (false, LatLon) => geomToXY(_, geomIndex)
263         case (false, LonLat) => geomToYX(_, geomIndex)
264       }
265 
266       getLabelOption match {
267         case None => new ToValuesPoints(getTrackId, getLatLon, dtgIndex)
268         case Some(getLabel) => new ToValuesPointsLabels(getTrackId, getLatLon, getLabel, dtgIndex)
269       }
270     }
271   }
272 
273   private def pointToXY(p: Point): (Float, Float) = (p.getX.toFloat, p.getY.toFloat)
274   private def pointToYX(p: Point): (Float, Float) = (p.getY.toFloat, p.getX.toFloat)
275 
276   private def pointToXY(f: SimpleFeature, i: Int): (Float, Float) =
277     pointToXY(f.getAttribute(i).asInstanceOf[Point])
278   private def pointToYX(f: SimpleFeature, i: Int): (Float, Float) =
279     pointToYX(f.getAttribute(i).asInstanceOf[Point])
280 
281   private def geomToXY(f: SimpleFeature, i: Int): (Float, Float) =
282     pointToXY(f.getAttribute(i).asInstanceOf[Geometry].safeCentroid())
283   private def geomToYX(f: SimpleFeature, i: Int): (Float, Float) =
284     pointToYX(f.getAttribute(i).asInstanceOf[Geometry].safeCentroid())
285 
286   private def lineToXY(f: SimpleFeature, i: Int): Array[(Float, Float)] = {
287     val line = f.getAttribute(i).asInstanceOf[LineString]
288     Array.tabulate(line.getNumPoints)(i => pointToXY(line.getPointN(i)))
289   }
290   private def lineToYX(f: SimpleFeature, i: Int): Array[(Float, Float)] = {
291     val line = f.getAttribute(i).asInstanceOf[LineString]
292     Array.tabulate(line.getNumPoints)(i => pointToYX(line.getPointN(i)))
293   }
294 
295   private def dateArray(f: SimpleFeature, i: Int): Array[Long] = {
296     val dates = f.getAttribute(i).asInstanceOf[java.util.List[Date]]
297     if (dates == null) { Array.empty } else { dates.asScala.map(_.getTime).toArray }
298   }
299 
300   private trait ToValues {
301     def apply(f: SimpleFeature, callback: BinaryOutputCallback): Unit
302   }
303 
304   private class ToValuesPoints(getTrackId: (SimpleFeature) => Int,
305                                getLatLon: (SimpleFeature) => (Float, Float),
306                                dtgIndex: Int) extends ToValues {
307     override def apply(f: SimpleFeature, callback: BinaryOutputCallback): Unit = {
308       val (lat, lon) = getLatLon(f)
309       callback(getTrackId(f), lat, lon, convertToDate(f, dtgIndex))
310     }
311   }
312 
313   private class ToValuesPointsLabels(getTrackId: (SimpleFeature) => Int,
314                                      getLatLon: (SimpleFeature) => (Float, Float),
315                                      getLabel: (SimpleFeature) => Long,
316                                      dtgIndex: Int) extends ToValues {
317     override def apply(f: SimpleFeature, callback: BinaryOutputCallback): Unit = {
318       val (lat, lon) = getLatLon(f)
319       callback(getTrackId(f), lat, lon, convertToDate(f, dtgIndex), getLabel(f))
320     }
321   }
322 
323   private class ToValuesLines(getTrackId: (SimpleFeature) => Int,
324                               getLatLon: (SimpleFeature) => Array[(Float, Float)],
325                               dtgIndex: Int) extends ToValues {
326     override def apply(f: SimpleFeature, callback: BinaryOutputCallback): Unit = {
327       val trackId = getTrackId(f)
328       val points = getLatLon(f)
329       val date = convertToDate(f, dtgIndex)
330       var i = 0
331       while (i < points.length) {
332         val (lat, lon) = points(i)
333         callback(trackId, lat, lon, date)
334         i += 1
335       }
336     }
337   }
338 
339   private class ToValuesLinesLabels(getTrackId: (SimpleFeature) => Int,
340                                     getLatLon: (SimpleFeature) => Array[(Float, Float)],
341                                     getLabel: (SimpleFeature) => Long,
342                                     dtgIndex: Int) extends ToValues {
343     override def apply(f: SimpleFeature, callback: BinaryOutputCallback): Unit = {
344       val trackId = getTrackId(f)
345       val points = getLatLon(f)
346       val date = convertToDate(f, dtgIndex)
347       val label = getLabel(f)
348       var i = 0
349       while (i < points.length) {
350         val (lat, lon) = points(i)
351         callback(trackId, lat, lon, date, label)
352         i += 1
353       }
354     }
355   }
356 
357   private class ToValuesLinesDates(getTrackId: (SimpleFeature) => Int,
358                                    getLatLon: (SimpleFeature) => Array[(Float, Float)],
359                                    getLineDtg: (SimpleFeature) => Array[Long]) extends ToValues {
360     override def apply(f: SimpleFeature, callback: BinaryOutputCallback): Unit = {
361       val trackId = getTrackId(f)
362       val points = getLatLon(f)
363       val dates = getLineDtg(f)
364       val size = if (points.length == dates.length) { points.length } else {
365         logger.warn(s"Mismatched geometries and dates for simple feature $f: ${points.toList} ${dates.toList}")
366         math.min(points.length, dates.length)
367       }
368       var i = 0
369       while (i < size) {
370         val (lat, lon) = points(i)
371         callback(trackId, lat, lon, dates(i))
372         i += 1
373       }
374     }
375   }
376 
377   private class ToValuesLinesDatesLabels(getTrackId: (SimpleFeature) => Int,
378                                          getLatLon: (SimpleFeature) => Array[(Float, Float)],
379                                          getLineDtg: (SimpleFeature) => Array[Long],
380                                          getLabel: (SimpleFeature) => Long) extends ToValues {
381     override def apply(f: SimpleFeature, callback: BinaryOutputCallback): Unit = {
382       val trackId = getTrackId(f)
383       val points = getLatLon(f)
384       val dates = getLineDtg(f)
385       val size = if (points.length == dates.length) { points.length } else {
386         logger.warn(s"Mismatched geometries and dates for simple feature $f: ${points.toList} ${dates.toList}")
387         math.min(points.length, dates.length)
388       }
389       val label = getLabel(f)
390       var i = 0
391       while (i < size) {
392         val (lat, lon) = points(i)
393         callback(trackId, lat, lon, dates(i), label)
394         i += 1
395       }
396     }
397   }
398 }
Line Stmt Id Pos Tree Symbol Tests Code
30 2090 1484 - 1501 Select org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteArrayCallback org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteArrayCallback
30 2091 1472 - 1502 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValues.apply BinaryOutputEncoder.this.toValues.apply(f, org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteArrayCallback)
31 2092 1507 - 1531 Select org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteArrayCallback.result org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteArrayCallback.result
34 2093 1608 - 1629 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValues.apply BinaryOutputEncoder.this.toValues.apply(f, callback)
37 2094 1702 - 1729 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.encode BinaryOutputEncoder.this.encode(f, os, false)
40 2105 1829 - 2204 Block <nosymbol> { val byteStream: java.io.ByteArrayOutputStream = new java.io.ByteArrayOutputStream(); val callback: org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteStreamCallback = new org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteStreamCallback(byteStream); f.foreach[Unit](((x$1: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.toValues.apply(x$1, callback))); val count: Long = callback.result; val bytes: Array[Byte] = byteStream.toByteArray(); val size: Int = bytes.length./(count).toInt; scala.Predef.byteArrayOps(bytes).grouped(size).toSeq.sorted[Array[Byte]](BinaryOutputEncoder.DateOrdering).foreach[Unit]({ ((x$1: Array[Byte]) => os.write(x$1)) }); count }
41 2095 1854 - 1879 Apply java.io.ByteArrayOutputStream.<init> new java.io.ByteArrayOutputStream()
42 2096 1901 - 1935 Apply org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteStreamCallback.<init> new org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteStreamCallback(byteStream)
43 2097 1952 - 1973 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValues.apply BinaryOutputEncoder.this.toValues.apply(x$1, callback)
43 2098 1942 - 1974 Apply scala.collection.Iterator.foreach f.foreach[Unit](((x$1: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.toValues.apply(x$1, callback)))
44 2099 1993 - 2008 Select org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteStreamCallback.result callback.result
45 2100 2027 - 2049 Apply java.io.ByteArrayOutputStream.toByteArray byteStream.toByteArray()
46 2101 2067 - 2095 Select scala.Long.toInt bytes.length./(count).toInt
47 2102 2135 - 2167 Select org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.DateOrdering BinaryOutputEncoder.DateOrdering
47 2103 2177 - 2185 Apply java.io.OutputStream.write os.write(x$1)
47 2104 2102 - 2186 Apply scala.collection.IterableLike.foreach scala.Predef.byteArrayOps(bytes).grouped(size).toSeq.sorted[Array[Byte]](BinaryOutputEncoder.DateOrdering).foreach[Unit]({ ((x$1: Array[Byte]) => os.write(x$1)) })
49 2110 2210 - 2326 Block <nosymbol> { val callback: org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteStreamCallback = new org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteStreamCallback(os); f.foreach[Unit](((x$2: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.toValues.apply(x$2, callback))); callback.result }
50 2106 2233 - 2259 Apply org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteStreamCallback.<init> new org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteStreamCallback(os)
51 2107 2276 - 2297 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValues.apply BinaryOutputEncoder.this.toValues.apply(x$2, callback)
51 2108 2266 - 2298 Apply scala.collection.Iterator.foreach f.foreach[Unit](((x$2: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.toValues.apply(x$2, callback)))
52 2109 2305 - 2320 Select org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteStreamCallback.result callback.result
63 2111 2603 - 2674 Apply org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes.createType org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes.createType("bin", "bin:Bytes,*geom:Point:srid=4326")
64 2112 2703 - 2704 Literal <nosymbol> 0
67 2137 2843 - 2846 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.$anon.<init> new $anon()
69 2113 2980 - 2984 Apply scala.Array.apply x.apply(4)
69 2114 2986 - 2990 Apply scala.Array.apply y.apply(4)
69 2115 2958 - 2991 Apply scala.math.Ordering.ByteOrdering.compare scala.`package`.Ordering.Byte.compare(x.apply(4), y.apply(4))
70 2116 3002 - 3015 Apply scala.Int.!= compare1.!=(0)
70 2117 3019 - 3034 Return org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.$anon.compare return compare1
70 2118 2998 - 2998 Literal <nosymbol> ()
70 2119 2998 - 2998 Block <nosymbol> ()
71 2120 3080 - 3084 Apply scala.Array.apply x.apply(5)
71 2121 3086 - 3090 Apply scala.Array.apply y.apply(5)
71 2122 3058 - 3091 Apply scala.math.Ordering.ByteOrdering.compare scala.`package`.Ordering.Byte.compare(x.apply(5), y.apply(5))
72 2123 3102 - 3115 Apply scala.Int.!= compare2.!=(0)
72 2124 3119 - 3134 Return org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.$anon.compare return compare2
72 2125 3098 - 3098 Literal <nosymbol> ()
72 2126 3098 - 3098 Block <nosymbol> ()
73 2127 3180 - 3184 Apply scala.Array.apply x.apply(6)
73 2128 3186 - 3190 Apply scala.Array.apply y.apply(6)
73 2129 3158 - 3191 Apply scala.math.Ordering.ByteOrdering.compare scala.`package`.Ordering.Byte.compare(x.apply(6), y.apply(6))
74 2130 3202 - 3215 Apply scala.Int.!= compare3.!=(0)
74 2131 3219 - 3234 Return org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.$anon.compare return compare3
74 2132 3198 - 3198 Literal <nosymbol> ()
74 2133 3198 - 3198 Block <nosymbol> ()
75 2134 3265 - 3269 Apply scala.Array.apply x.apply(7)
75 2135 3271 - 3275 Apply scala.Array.apply y.apply(7)
75 2136 3243 - 3276 Apply scala.math.Ordering.ByteOrdering.compare scala.`package`.Ordering.Byte.compare(x.apply(7), y.apply(7))
98 2138 4193 - 4201 Select org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.FeatureLimitingIterator.hasLabel FeatureLimitingIterator.this.hasLabel
98 2139 4205 - 4207 Literal <nosymbol> 24
98 2140 4205 - 4207 Block <nosymbol> 24
98 2141 4217 - 4219 Literal <nosymbol> 16
98 2142 4217 - 4219 Block <nosymbol> 16
99 2143 4245 - 4247 Literal <nosymbol> 0L
101 2144 4292 - 4303 Select org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.FeatureLimitingIterator.maxFeatures FeatureLimitingIterator.this.maxFeatures
101 2145 4307 - 4319 Select scala.collection.Iterator.hasNext FeatureLimitingIterator.this.iter.hasNext
101 2146 4285 - 4319 Apply scala.Boolean.&& FeatureLimitingIterator.this.seen.<(FeatureLimitingIterator.this.maxFeatures).&&(FeatureLimitingIterator.this.iter.hasNext)
104 2147 4374 - 4381 Select org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.FeatureLimitingIterator.hasNext FeatureLimitingIterator.this.hasNext
104 2170 4383 - 4896 Block <nosymbol> { val sf: org.geotools.api.feature.simple.SimpleFeature = FeatureLimitingIterator.this.iter.next(); val bytes: Array[Byte] = sf.getAttribute(0).asInstanceOf[Array[Byte]]; val count: Int = bytes.length./(FeatureLimitingIterator.this.bytesPerHit); FeatureLimitingIterator.this.seen_=(FeatureLimitingIterator.this.seen.+(count)); if (FeatureLimitingIterator.this.seen.>(FeatureLimitingIterator.this.maxFeatures)) { val trimmed: Array[Byte] = scala.Array.ofDim[Byte](count.-(FeatureLimitingIterator.this.seen.-(FeatureLimitingIterator.this.maxFeatures).toInt).*(FeatureLimitingIterator.this.bytesPerHit))((ClassTag.Byte: scala.reflect.ClassTag[Byte])); java.lang.System.arraycopy(bytes, 0, trimmed, 0, trimmed.length); sf.setAttribute(0, trimmed) } else (); sf }
105 2148 4402 - 4413 Apply scala.collection.Iterator.next FeatureLimitingIterator.this.iter.next()
106 2149 4450 - 4451 Literal <nosymbol> 0
106 2150 4434 - 4478 TypeApply scala.Any.asInstanceOf sf.getAttribute(0).asInstanceOf[Array[Byte]]
107 2151 4514 - 4525 Select org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.FeatureLimitingIterator.bytesPerHit FeatureLimitingIterator.this.bytesPerHit
107 2152 4499 - 4525 Apply scala.Int./ bytes.length./(FeatureLimitingIterator.this.bytesPerHit)
108 2153 4534 - 4547 Apply scala.Long.+ FeatureLimitingIterator.this.seen.+(count)
108 2154 4534 - 4547 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.FeatureLimitingIterator.seen_= FeatureLimitingIterator.this.seen_=(FeatureLimitingIterator.this.seen.+(count))
109 2155 4567 - 4578 Select org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.FeatureLimitingIterator.maxFeatures FeatureLimitingIterator.this.maxFeatures
109 2156 4560 - 4578 Apply scala.Long.> FeatureLimitingIterator.this.seen.>(FeatureLimitingIterator.this.maxFeatures)
109 2167 4580 - 4877 Block <nosymbol> { val trimmed: Array[Byte] = scala.Array.ofDim[Byte](count.-(FeatureLimitingIterator.this.seen.-(FeatureLimitingIterator.this.maxFeatures).toInt).*(FeatureLimitingIterator.this.bytesPerHit))((ClassTag.Byte: scala.reflect.ClassTag[Byte])); java.lang.System.arraycopy(bytes, 0, trimmed, 0, trimmed.length); sf.setAttribute(0, trimmed) }
109 2168 4556 - 4556 Literal <nosymbol> ()
109 2169 4556 - 4556 Block <nosymbol> ()
111 2157 4730 - 4741 Select org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.FeatureLimitingIterator.maxFeatures FeatureLimitingIterator.this.maxFeatures
111 2158 4722 - 4748 Select scala.Long.toInt FeatureLimitingIterator.this.seen.-(FeatureLimitingIterator.this.maxFeatures).toInt
111 2159 4752 - 4763 Select org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.FeatureLimitingIterator.bytesPerHit FeatureLimitingIterator.this.bytesPerHit
111 2160 4713 - 4763 Apply scala.Int.* count.-(FeatureLimitingIterator.this.seen.-(FeatureLimitingIterator.this.maxFeatures).toInt).*(FeatureLimitingIterator.this.bytesPerHit)
111 2161 4695 - 4764 ApplyToImplicitArgs scala.Array.ofDim scala.Array.ofDim[Byte](count.-(FeatureLimitingIterator.this.seen.-(FeatureLimitingIterator.this.maxFeatures).toInt).*(FeatureLimitingIterator.this.bytesPerHit))((ClassTag.Byte: scala.reflect.ClassTag[Byte]))
112 2162 4799 - 4800 Literal <nosymbol> 0
112 2163 4811 - 4812 Literal <nosymbol> 0
112 2164 4814 - 4828 Select scala.Array.length trimmed.length
112 2165 4775 - 4829 Apply java.lang.System.arraycopy java.lang.System.arraycopy(bytes, 0, trimmed, 0, trimmed.length)
113 2166 4840 - 4867 Apply org.geotools.api.feature.simple.SimpleFeature.setAttribute sf.setAttribute(0, trimmed)
117 2171 4912 - 4933 Apply scala.collection.Iterator.next scala.`package`.Iterator.empty.next()
117 2172 4912 - 4933 Block scala.collection.Iterator.next scala.`package`.Iterator.empty.next()
121 2173 4982 - 4994 Apply java.io.Closeable.close FeatureLimitingIterator.this.iter.close()
125 2174 5113 - 5135 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.toValues BinaryOutputEncoder.this.toValues(sft, options)
125 2175 5089 - 5136 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.<init> new BinaryOutputEncoder(BinaryOutputEncoder.this.toValues(sft, options))
127 2176 5207 - 5224 Apply org.geotools.api.feature.simple.SimpleFeature.getAttribute f.getAttribute(i)
127 2177 5192 - 5225 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.convertToTrack BinaryOutputEncoder.this.convertToTrack(f.getAttribute(i))
128 2178 5273 - 5286 Apply java.lang.Object.== track.==(null)
128 2179 5290 - 5291 Literal <nosymbol> 0
128 2180 5290 - 5291 Block <nosymbol> 0
128 2181 5301 - 5315 Apply java.lang.Object.hashCode track.hashCode()
128 2182 5301 - 5315 Block java.lang.Object.hashCode track.hashCode()
131 2183 5469 - 5505 TypeApply scala.Any.asInstanceOf f.getAttribute(i).asInstanceOf[java.util.Date]
131 2184 5455 - 5506 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.convertToDate BinaryOutputEncoder.this.convertToDate(f.getAttribute(i).asInstanceOf[java.util.Date])
132 2185 5551 - 5563 Apply java.lang.Object.== date.==(null)
132 2186 5567 - 5569 Literal <nosymbol> 0L
132 2187 5567 - 5569 Block <nosymbol> 0L
132 2188 5579 - 5591 Apply java.util.Date.getTime date.getTime()
132 2189 5579 - 5591 Block java.util.Date.getTime date.getTime()
134 2190 5665 - 5682 Apply org.geotools.api.feature.simple.SimpleFeature.getAttribute f.getAttribute(i)
134 2191 5650 - 5683 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.convertToLabel BinaryOutputEncoder.this.convertToLabel(f.getAttribute(i))
136 2192 5759 - 5761 Literal <nosymbol> 0L
136 2193 5759 - 5761 Block <nosymbol> 0L
137 2194 5784 - 5797 Apply java.lang.Number.longValue n.longValue()
137 2195 5784 - 5797 Block java.lang.Number.longValue n.longValue()
138 2207 5809 - 6003 Block <nosymbol> { var sum: Long = 0L; var i: Int = 0; scala.Predef.byteArrayOps(label.toString().getBytes(java.nio.charset.StandardCharsets.UTF_8)).iterator.take(8).foreach[Unit](((b: Byte) => { sum = sum.+(b.&(255L).<<(8.*(i))); i = i.+(1) })); sum }
139 2196 5828 - 5830 Literal <nosymbol> 0L
140 2197 5845 - 5846 Literal <nosymbol> 0
141 2198 5877 - 5899 Select java.nio.charset.StandardCharsets.UTF_8 java.nio.charset.StandardCharsets.UTF_8
141 2199 5853 - 5900 Apply java.lang.String.getBytes label.toString().getBytes(java.nio.charset.StandardCharsets.UTF_8)
141 2200 5915 - 5916 Literal <nosymbol> 8
141 2206 5853 - 5993 Apply scala.collection.Iterator.foreach scala.Predef.byteArrayOps(label.toString().getBytes(java.nio.charset.StandardCharsets.UTF_8)).iterator.take(8).foreach[Unit](((b: Byte) => { sum = sum.+(b.&(255L).<<(8.*(i))); i = i.+(1) }))
142 2201 5953 - 5958 Literal <nosymbol> 255L
142 2202 5964 - 5969 Apply scala.Int.* 8.*(i)
142 2203 5948 - 5970 Apply scala.Long.<< b.&(255L).<<(8.*(i))
142 2204 5941 - 5970 Apply scala.Long.+ sum.+(b.&(255L).<<(8.*(i)))
143 2205 5979 - 5985 Apply scala.Int.+ i.+(1)
155 2208 6260 - 6283 Select java.nio.ByteOrder.LITTLE_ENDIAN java.nio.ByteOrder.LITTLE_ENDIAN
155 2209 6229 - 6284 Apply java.nio.ByteBuffer.order java.nio.ByteBuffer.wrap(encoded).order(java.nio.ByteOrder.LITTLE_ENDIAN)
156 2210 6303 - 6313 Apply java.nio.ByteBuffer.getInt buf.getInt()
157 2211 6329 - 6347 Apply scala.Int.* buf.getInt().*(1000L)
158 2212 6362 - 6374 Apply java.nio.ByteBuffer.getFloat buf.getFloat()
159 2213 6389 - 6401 Apply java.nio.ByteBuffer.getFloat buf.getFloat()
160 2214 6410 - 6429 Apply scala.Int.> encoded.length.>(16)
160 2217 6431 - 6515 Block <nosymbol> { val label: Long = buf.getLong(); callback.apply(trackId, lat, lon, time, label) }
161 2215 6451 - 6462 Apply java.nio.ByteBuffer.getLong buf.getLong()
162 2216 6469 - 6509 Apply org.locationtech.geomesa.utils.bin.BinaryOutputCallback.apply callback.apply(trackId, lat, lon, time, label)
164 2218 6529 - 6562 Apply org.locationtech.geomesa.utils.bin.BinaryOutputCallback.apply callback.apply(trackId, lat, lon, time)
164 2219 6529 - 6562 Block org.locationtech.geomesa.utils.bin.BinaryOutputCallback.apply callback.apply(trackId, lat, lon, time)
169 2220 6660 - 6664 Literal <nosymbol> null
170 2223 6685 - 6688 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.$anon.<init> new $anon()
170 2224 6669 - 7019 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.decode BinaryOutputEncoder.this.decode(encoded, { final class $anon extends AnyRef with org.locationtech.geomesa.utils.bin.BinaryOutputCallback { def <init>(): <$anon: org.locationtech.geomesa.utils.bin.BinaryOutputCallback> = { $anon.super.<init>(); () }; override def apply(trackId: Int, lat: Float, lon: Float, dtg: Long): Unit = values = BinaryOutputEncoder.this.EncodedValues.apply(trackId, lat, lon, dtg, -1L); override def apply(trackId: Int, lat: Float, lon: Float, dtg: Long, label: Long): Unit = values = BinaryOutputEncoder.this.EncodedValues.apply(trackId, lat, lon, dtg, label) }; new $anon() })
172 2221 6813 - 6855 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.EncodedValues.apply BinaryOutputEncoder.this.EncodedValues.apply(trackId, lat, lon, dtg, -1L)
174 2222 6968 - 7012 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.EncodedValues.apply BinaryOutputEncoder.this.EncodedValues.apply(trackId, lat, lon, dtg, label)
188 2225 7355 - 7371 Select org.locationtech.geomesa.utils.geotools.RichSimpleFeatureType.RichSimpleFeatureType.getGeomIndex org.locationtech.geomesa.utils.geotools.RichSimpleFeatureType.RichSimpleFeatureType(sft).getGeomIndex
188 2226 7327 - 7372 Apply scala.Option.getOrElse options.geomField.getOrElse[Int](org.locationtech.geomesa.utils.geotools.RichSimpleFeatureType.RichSimpleFeatureType(sft).getGeomIndex)
189 2227 7381 - 7396 Apply scala.Int.== geomIndex.==(-1)
189 2230 7377 - 7377 Literal <nosymbol> ()
189 2231 7377 - 7377 Block <nosymbol> ()
190 2228 7406 - 7513 Throw <nosymbol> throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Invalid geometry field requested for feature type ", "").s(sft.getTypeName()))
190 2229 7406 - 7513 Block <nosymbol> throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Invalid geometry field requested for feature type ", "").s(sft.getTypeName()))
192 2232 7539 - 7593 Apply scala.Option.getOrElse options.dtgField.orElse[Int](org.locationtech.geomesa.utils.geotools.RichSimpleFeatureType.RichSimpleFeatureType(sft).getDtgIndex).getOrElse[Int](-1)
193 2233 7602 - 7616 Apply scala.Int.== dtgIndex.==(-1)
193 2236 7598 - 7598 Literal <nosymbol> ()
193 2237 7598 - 7598 Block <nosymbol> ()
194 2234 7626 - 7721 Throw <nosymbol> throw new scala.`package`.RuntimeException(scala.StringContext.apply("Invalid date field requested for feature type ", "").s(sft.getTypeName()))
194 2235 7626 - 7721 Block <nosymbol> throw new scala.`package`.RuntimeException(scala.StringContext.apply("Invalid date field requested for feature type ", "").s(sft.getTypeName()))
196 2238 7751 - 7764 Literal <nosymbol> classOf[java.util.Date]
196 2239 7782 - 7828 Apply org.geotools.api.feature.type.PropertyType.getBinding sft.getDescriptor(dtgIndex).getType().getBinding()
196 2240 7751 - 7829 Apply java.lang.Class.isAssignableFrom classOf[java.util.Date].isAssignableFrom(sft.getDescriptor(dtgIndex).getType().getBinding())
197 2241 7878 - 7894 Select org.locationtech.geomesa.utils.bin.AxisOrder.LonLat AxisOrder.LonLat
197 2242 7850 - 7895 Apply scala.Option.getOrElse options.axisOrder.getOrElse[org.locationtech.geomesa.utils.bin.AxisOrder.AxisOrder](AxisOrder.LonLat)
199 2243 7906 - 7906 Select scala.Tuple2._1 x$3._1
199 2244 7915 - 7915 Select scala.Tuple2._2 x$3._2
205 2245 8143 - 8150 Apply scala.Int.== x$4.==(-1)
205 2246 8115 - 8151 Apply scala.Option.exists options.trackIdField.exists(((x$4: Int) => x$4.==(-1)))
206 2247 8161 - 8265 Throw <nosymbol> throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Invalid track field requested for feature type ", "").s(sft.getTypeName()))
206 2248 8161 - 8265 Block <nosymbol> throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Invalid track field requested for feature type ", "").s(sft.getTypeName()))
207 2249 8307 - 8314 Apply scala.Int.== x$5.==(-1)
207 2250 8281 - 8315 Apply scala.Option.exists options.labelField.exists(((x$5: Int) => x$5.==(-1)))
207 2274 8277 - 9137 If <nosymbol> if (options.labelField.exists(((x$5: Int) => x$5.==(-1)))) throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Invalid label field requested for feature type ", "").s(sft.getTypeName())) else if (isSingleDate.unary_!) if (isLineString) { val dtgField: String = sft.getDescriptor(dtgIndex).getLocalName(); val sftAttributes: Seq[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.AttributeSpec] = org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpecParser.parse(org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes.encodeType(sft), org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpecParser.parse$default$2).attributes; sftAttributes.find(((x$6: org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.AttributeSpec) => x$6.name.==(dtgField))).foreach[Unit](((spec: org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.AttributeSpec) => if (spec.isInstanceOf[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec].unary_!.||(classOf[java.util.Date].isAssignableFrom(spec.asInstanceOf[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec].subClass).unary_!)) throw new scala.`package`.RuntimeException(scala.StringContext.apply("Invalid date field requested for feature type ", "").s(sft.getTypeName())) else ())) } else throw new scala.`package`.RuntimeException(scala.StringContext.apply("Invalid date field requested for feature type ", "").s(sft.getTypeName())) else ()
208 2251 8325 - 8429 Throw <nosymbol> throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Invalid label field requested for feature type ", "").s(sft.getTypeName()))
208 2252 8325 - 8429 Block <nosymbol> throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Invalid label field requested for feature type ", "").s(sft.getTypeName()))
209 2253 8445 - 8458 Select scala.Boolean.unary_! isSingleDate.unary_!
209 2271 8441 - 8441 Literal <nosymbol> ()
209 2272 8441 - 8441 Block <nosymbol> ()
209 2273 8441 - 9137 If <nosymbol> if (isSingleDate.unary_!) if (isLineString) { val dtgField: String = sft.getDescriptor(dtgIndex).getLocalName(); val sftAttributes: Seq[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.AttributeSpec] = org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpecParser.parse(org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes.encodeType(sft), org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpecParser.parse$default$2).attributes; sftAttributes.find(((x$6: org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.AttributeSpec) => x$6.name.==(dtgField))).foreach[Unit](((spec: org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.AttributeSpec) => if (spec.isInstanceOf[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec].unary_!.||(classOf[java.util.Date].isAssignableFrom(spec.asInstanceOf[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec].subClass).unary_!)) throw new scala.`package`.RuntimeException(scala.StringContext.apply("Invalid date field requested for feature type ", "").s(sft.getTypeName())) else ())) } else throw new scala.`package`.RuntimeException(scala.StringContext.apply("Invalid date field requested for feature type ", "").s(sft.getTypeName())) else ()
210 2267 8486 - 9012 Block <nosymbol> { val dtgField: String = sft.getDescriptor(dtgIndex).getLocalName(); val sftAttributes: Seq[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.AttributeSpec] = org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpecParser.parse(org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes.encodeType(sft), org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpecParser.parse$default$2).attributes; sftAttributes.find(((x$6: org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.AttributeSpec) => x$6.name.==(dtgField))).foreach[Unit](((spec: org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.AttributeSpec) => if (spec.isInstanceOf[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec].unary_!.||(classOf[java.util.Date].isAssignableFrom(spec.asInstanceOf[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec].subClass).unary_!)) throw new scala.`package`.RuntimeException(scala.StringContext.apply("Invalid date field requested for feature type ", "").s(sft.getTypeName())) else ())) }
210 2270 8468 - 9131 If <nosymbol> if (isLineString) { val dtgField: String = sft.getDescriptor(dtgIndex).getLocalName(); val sftAttributes: Seq[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.AttributeSpec] = org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpecParser.parse(org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes.encodeType(sft), org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpecParser.parse$default$2).attributes; sftAttributes.find(((x$6: org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.AttributeSpec) => x$6.name.==(dtgField))).foreach[Unit](((spec: org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.AttributeSpec) => if (spec.isInstanceOf[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec].unary_!.||(classOf[java.util.Date].isAssignableFrom(spec.asInstanceOf[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec].subClass).unary_!)) throw new scala.`package`.RuntimeException(scala.StringContext.apply("Invalid date field requested for feature type ", "").s(sft.getTypeName())) else ())) } else throw new scala.`package`.RuntimeException(scala.StringContext.apply("Invalid date field requested for feature type ", "").s(sft.getTypeName()))
211 2254 8511 - 8551 Apply org.geotools.api.feature.type.AttributeDescriptor.getLocalName sft.getDescriptor(dtgIndex).getLocalName()
212 2255 8610 - 8644 Apply org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes.encodeType org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes.encodeType(sft)
212 2256 8580 - 8656 Select org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.attributes org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpecParser.parse(org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes.encodeType(sft), org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpecParser.parse$default$2).attributes
213 2257 8684 - 8702 Apply java.lang.Object.== x$6.name.==(dtgField)
213 2266 8665 - 9004 Apply scala.Option.foreach sftAttributes.find(((x$6: org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.AttributeSpec) => x$6.name.==(dtgField))).foreach[Unit](((spec: org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.AttributeSpec) => if (spec.isInstanceOf[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec].unary_!.||(classOf[java.util.Date].isAssignableFrom(spec.asInstanceOf[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec].subClass).unary_!)) throw new scala.`package`.RuntimeException(scala.StringContext.apply("Invalid date field requested for feature type ", "").s(sft.getTypeName())) else ()))
214 2261 8736 - 8871 Apply scala.Boolean.|| spec.isInstanceOf[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec].unary_!.||(classOf[java.util.Date].isAssignableFrom(spec.asInstanceOf[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec].subClass).unary_!)
214 2264 8732 - 8732 Literal <nosymbol> ()
214 2265 8732 - 8732 Block <nosymbol> ()
215 2258 8794 - 8807 Literal <nosymbol> classOf[java.util.Date]
215 2259 8825 - 8870 Select org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec.subClass spec.asInstanceOf[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec].subClass
215 2260 8793 - 8871 Select scala.Boolean.unary_! classOf[java.util.Date].isAssignableFrom(spec.asInstanceOf[org.locationtech.geomesa.utils.geotools.sft.SimpleFeatureSpec.ListAttributeSpec].subClass).unary_!
216 2262 8887 - 8982 Throw <nosymbol> throw new scala.`package`.RuntimeException(scala.StringContext.apply("Invalid date field requested for feature type ", "").s(sft.getTypeName()))
216 2263 8887 - 8982 Block <nosymbol> throw new scala.`package`.RuntimeException(scala.StringContext.apply("Invalid date field requested for feature type ", "").s(sft.getTypeName()))
220 2268 9028 - 9123 Throw <nosymbol> throw new scala.`package`.RuntimeException(scala.StringContext.apply("Invalid date field requested for feature type ", "").s(sft.getTypeName()))
220 2269 9028 - 9123 Block <nosymbol> throw new scala.`package`.RuntimeException(scala.StringContext.apply("Invalid date field requested for feature type ", "").s(sft.getTypeName()))
225 2275 9224 - 9244 Select org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.EncodingOptions.trackIdField options.trackIdField
226 2276 9279 - 9295 Apply java.lang.String.hashCode f.getID().hashCode()
226 2277 9272 - 9295 Function org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.$anonfun ((f: org.geotools.api.feature.simple.SimpleFeature) => f.getID().hashCode())
227 2278 9324 - 9350 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.convertToTrack BinaryOutputEncoder.this.convertToTrack(x$7, trackId)
227 2279 9324 - 9350 Function org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.$anonfun ((x$7: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.convertToTrack(x$7, trackId))
231 2281 9453 - 9533 Apply scala.Option.map options.labelField.map[org.geotools.api.feature.simple.SimpleFeature => Long](((labelIndex: Int) => ((x$8: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.convertToLabel(x$8, labelIndex))))
232 2280 9498 - 9527 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.convertToLabel BinaryOutputEncoder.this.convertToLabel(x$8, labelIndex)
235 2297 9557 - 10608 Block <nosymbol> { val getLineLatLon: org.geotools.api.feature.simple.SimpleFeature => Array[(Float, Float)] = axisOrder match { case AxisOrder.LatLon => ((x$9: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.lineToXY(x$9, geomIndex)) case AxisOrder.LonLat => ((x$10: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.lineToYX(x$10, geomIndex)) }; if (isSingleDate) getLabelOption match { case scala.None => new BinaryOutputEncoder.this.ToValuesLines(getTrackId, getLineLatLon, dtgIndex) case (value: org.geotools.api.feature.simple.SimpleFeature => Long)Some[org.geotools.api.feature.simple.SimpleFeature => Long]((getLabel @ _)) => new BinaryOutputEncoder.this.ToValuesLinesLabels(getTrackId, getLineLatLon, getLabel, dtgIndex) } else { val getLineDtg: org.geotools.api.feature.simple.SimpleFeature => Array[Long] = ((x$11: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.dateArray(x$11, dtgIndex)); getLabelOption match { case scala.None => new BinaryOutputEncoder.this.ToValuesLinesDates(getTrackId, getLineLatLon, getLineDtg) case (value: org.geotools.api.feature.simple.SimpleFeature => Long)Some[org.geotools.api.feature.simple.SimpleFeature => Long]((getLabel @ _)) => new BinaryOutputEncoder.this.ToValuesLinesDatesLabels(getTrackId, getLineLatLon, getLineDtg, getLabel) } } }
239 2282 9841 - 9863 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.lineToXY BinaryOutputEncoder.this.lineToXY(x$9, geomIndex)
239 2283 9841 - 9863 Function org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.$anonfun ((x$9: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.lineToXY(x$9, geomIndex))
240 2284 9887 - 9909 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.lineToYX BinaryOutputEncoder.this.lineToYX(x$10, geomIndex)
240 2285 9887 - 9909 Function org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.$anonfun ((x$10: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.lineToYX(x$10, geomIndex))
244 2290 9953 - 10167 Match <nosymbol> getLabelOption match { case scala.None => new BinaryOutputEncoder.this.ToValuesLines(getTrackId, getLineLatLon, dtgIndex) case (value: org.geotools.api.feature.simple.SimpleFeature => Long)Some[org.geotools.api.feature.simple.SimpleFeature => Long]((getLabel @ _)) => new BinaryOutputEncoder.this.ToValuesLinesLabels(getTrackId, getLineLatLon, getLabel, dtgIndex) }
245 2286 9999 - 10053 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesLines.<init> new BinaryOutputEncoder.this.ToValuesLines(getTrackId, getLineLatLon, dtgIndex)
245 2287 9999 - 10053 Block org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesLines.<init> new BinaryOutputEncoder.this.ToValuesLines(getTrackId, getLineLatLon, dtgIndex)
246 2288 10087 - 10157 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesLinesLabels.<init> new BinaryOutputEncoder.this.ToValuesLinesLabels(getTrackId, getLineLatLon, getLabel, dtgIndex)
246 2289 10087 - 10157 Block org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesLinesLabels.<init> new BinaryOutputEncoder.this.ToValuesLinesLabels(getTrackId, getLineLatLon, getLabel, dtgIndex)
248 2296 10181 - 10602 Block <nosymbol> { val getLineDtg: org.geotools.api.feature.simple.SimpleFeature => Array[Long] = ((x$11: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.dateArray(x$11, dtgIndex)); getLabelOption match { case scala.None => new BinaryOutputEncoder.this.ToValuesLinesDates(getTrackId, getLineLatLon, getLineDtg) case (value: org.geotools.api.feature.simple.SimpleFeature => Long)Some[org.geotools.api.feature.simple.SimpleFeature => Long]((getLabel @ _)) => new BinaryOutputEncoder.this.ToValuesLinesDatesLabels(getTrackId, getLineLatLon, getLineDtg, getLabel) } }
250 2291 10335 - 10357 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.dateArray BinaryOutputEncoder.this.dateArray(x$11, dtgIndex)
252 2292 10412 - 10473 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesLinesDates.<init> new BinaryOutputEncoder.this.ToValuesLinesDates(getTrackId, getLineLatLon, getLineDtg)
252 2293 10412 - 10473 Block org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesLinesDates.<init> new BinaryOutputEncoder.this.ToValuesLinesDates(getTrackId, getLineLatLon, getLineDtg)
253 2294 10507 - 10584 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesLinesDatesLabels.<init> new BinaryOutputEncoder.this.ToValuesLinesDatesLabels(getTrackId, getLineLatLon, getLineDtg, getLabel)
253 2295 10507 - 10584 Block org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesLinesDatesLabels.<init> new BinaryOutputEncoder.this.ToValuesLinesDatesLabels(getTrackId, getLineLatLon, getLineDtg, getLabel)
256 2306 10614 - 11258 Block <nosymbol> { val getLatLon: org.geotools.api.feature.simple.SimpleFeature => (Float, Float) = scala.Tuple2.apply[Boolean, org.locationtech.geomesa.utils.bin.AxisOrder.AxisOrder](isPoint, axisOrder) match { case (_1: Boolean, _2: org.locationtech.geomesa.utils.bin.AxisOrder.AxisOrder)(Boolean, org.locationtech.geomesa.utils.bin.AxisOrder.AxisOrder)(true, AxisOrder.LatLon) => ((x$12: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.pointToXY(x$12, geomIndex)) case (_1: Boolean, _2: org.locationtech.geomesa.utils.bin.AxisOrder.AxisOrder)(Boolean, org.locationtech.geomesa.utils.bin.AxisOrder.AxisOrder)(true, AxisOrder.LonLat) => ((x$13: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.pointToYX(x$13, geomIndex)) case (_1: Boolean, _2: org.locationtech.geomesa.utils.bin.AxisOrder.AxisOrder)(Boolean, org.locationtech.geomesa.utils.bin.AxisOrder.AxisOrder)(false, AxisOrder.LatLon) => ((x$14: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.geomToXY(x$14, geomIndex)) case (_1: Boolean, _2: org.locationtech.geomesa.utils.bin.AxisOrder.AxisOrder)(Boolean, org.locationtech.geomesa.utils.bin.AxisOrder.AxisOrder)(false, AxisOrder.LonLat) => ((x$15: org.geotools.api.feature.simple.SimpleFeature) => BinaryOutputEncoder.this.geomToYX(x$15, geomIndex)) }; getLabelOption match { case scala.None => new BinaryOutputEncoder.this.ToValuesPoints(getTrackId, getLatLon, dtgIndex) case (value: org.geotools.api.feature.simple.SimpleFeature => Long)Some[org.geotools.api.feature.simple.SimpleFeature => Long]((getLabel @ _)) => new BinaryOutputEncoder.this.ToValuesPointsLabels(getTrackId, getLatLon, getLabel, dtgIndex) } }
260 2298 10845 - 10868 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.pointToXY BinaryOutputEncoder.this.pointToXY(x$12, geomIndex)
261 2299 10901 - 10924 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.pointToYX BinaryOutputEncoder.this.pointToYX(x$13, geomIndex)
262 2300 10957 - 10979 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.geomToXY BinaryOutputEncoder.this.geomToXY(x$14, geomIndex)
263 2301 11012 - 11034 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.geomToYX BinaryOutputEncoder.this.geomToYX(x$15, geomIndex)
267 2302 11094 - 11145 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesPoints.<init> new BinaryOutputEncoder.this.ToValuesPoints(getTrackId, getLatLon, dtgIndex)
267 2303 11094 - 11145 Block org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesPoints.<init> new BinaryOutputEncoder.this.ToValuesPoints(getTrackId, getLatLon, dtgIndex)
268 2304 11177 - 11244 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesPointsLabels.<init> new BinaryOutputEncoder.this.ToValuesPointsLabels(getTrackId, getLatLon, getLabel, dtgIndex)
268 2305 11177 - 11244 Block org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesPointsLabels.<init> new BinaryOutputEncoder.this.ToValuesPointsLabels(getTrackId, getLatLon, getLabel, dtgIndex)
273 2307 11317 - 11331 Select scala.Double.toFloat p.getX().toFloat
273 2308 11333 - 11347 Select scala.Double.toFloat p.getY().toFloat
273 2309 11316 - 11348 Apply scala.Tuple2.apply scala.Tuple2.apply[Float, Float](p.getX().toFloat, p.getY().toFloat)
274 2310 11402 - 11416 Select scala.Double.toFloat p.getY().toFloat
274 2311 11418 - 11432 Select scala.Double.toFloat p.getX().toFloat
274 2312 11401 - 11433 Apply scala.Tuple2.apply scala.Tuple2.apply[Float, Float](p.getY().toFloat, p.getX().toFloat)
277 2313 11517 - 11554 TypeApply scala.Any.asInstanceOf f.getAttribute(i).asInstanceOf[org.locationtech.jts.geom.Point]
277 2314 11507 - 11555 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.pointToXY BinaryOutputEncoder.this.pointToXY(f.getAttribute(i).asInstanceOf[org.locationtech.jts.geom.Point])
279 2315 11638 - 11675 TypeApply scala.Any.asInstanceOf f.getAttribute(i).asInstanceOf[org.locationtech.jts.geom.Point]
279 2316 11628 - 11676 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.pointToYX BinaryOutputEncoder.this.pointToYX(f.getAttribute(i).asInstanceOf[org.locationtech.jts.geom.Point])
282 2317 11759 - 11814 Apply org.locationtech.geomesa.utils.geotools.Conversions.RichGeometry.safeCentroid org.locationtech.geomesa.utils.geotools.Conversions.RichGeometry(f.getAttribute(i).asInstanceOf[org.locationtech.jts.geom.Geometry]).safeCentroid()
282 2318 11749 - 11815 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.pointToXY BinaryOutputEncoder.this.pointToXY(org.locationtech.geomesa.utils.geotools.Conversions.RichGeometry(f.getAttribute(i).asInstanceOf[org.locationtech.jts.geom.Geometry]).safeCentroid())
284 2319 11897 - 11952 Apply org.locationtech.geomesa.utils.geotools.Conversions.RichGeometry.safeCentroid org.locationtech.geomesa.utils.geotools.Conversions.RichGeometry(f.getAttribute(i).asInstanceOf[org.locationtech.jts.geom.Geometry]).safeCentroid()
284 2320 11887 - 11953 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.pointToYX BinaryOutputEncoder.this.pointToYX(org.locationtech.geomesa.utils.geotools.Conversions.RichGeometry(f.getAttribute(i).asInstanceOf[org.locationtech.jts.geom.Geometry]).safeCentroid())
287 2321 12046 - 12088 TypeApply scala.Any.asInstanceOf f.getAttribute(i).asInstanceOf[org.locationtech.jts.geom.LineString]
288 2322 12108 - 12125 Apply org.locationtech.jts.geom.LineString.getNumPoints line.getNumPoints()
288 2323 12142 - 12159 Apply org.locationtech.jts.geom.LineString.getPointN line.getPointN(i)
288 2324 12132 - 12160 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.pointToXY BinaryOutputEncoder.this.pointToXY(line.getPointN(i))
288 2325 12093 - 12161 ApplyToImplicitArgs scala.Array.tabulate scala.Array.tabulate[(Float, Float)](line.getNumPoints())(((i: Int) => BinaryOutputEncoder.this.pointToXY(line.getPointN(i))))((ClassTag.apply[(Float, Float)](classOf[scala.Tuple2]): scala.reflect.ClassTag[(Float, Float)]))
291 2326 12257 - 12299 TypeApply scala.Any.asInstanceOf f.getAttribute(i).asInstanceOf[org.locationtech.jts.geom.LineString]
292 2327 12319 - 12336 Apply org.locationtech.jts.geom.LineString.getNumPoints line.getNumPoints()
292 2328 12353 - 12370 Apply org.locationtech.jts.geom.LineString.getPointN line.getPointN(i)
292 2329 12343 - 12371 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.pointToYX BinaryOutputEncoder.this.pointToYX(line.getPointN(i))
292 2330 12304 - 12372 ApplyToImplicitArgs scala.Array.tabulate scala.Array.tabulate[(Float, Float)](line.getNumPoints())(((i: Int) => BinaryOutputEncoder.this.pointToYX(line.getPointN(i))))((ClassTag.apply[(Float, Float)](classOf[scala.Tuple2]): scala.reflect.ClassTag[(Float, Float)]))
296 2331 12461 - 12513 TypeApply scala.Any.asInstanceOf f.getAttribute(i).asInstanceOf[java.util.List[java.util.Date]]
297 2332 12522 - 12535 Apply java.lang.Object.== dates.==(null)
297 2333 12539 - 12550 ApplyToImplicitArgs scala.Array.empty scala.Array.empty[Long]((ClassTag.Long: scala.reflect.ClassTag[Long]))
297 2334 12539 - 12550 Block scala.Array.empty scala.Array.empty[Long]((ClassTag.Long: scala.reflect.ClassTag[Long]))
297 2335 12578 - 12587 Apply java.util.Date.getTime x$16.getTime()
297 2336 12577 - 12577 TypeApply scala.collection.mutable.Buffer.canBuildFrom mutable.this.Buffer.canBuildFrom[Long]
297 2337 12560 - 12596 ApplyToImplicitArgs scala.collection.TraversableOnce.toArray scala.collection.JavaConverters.asScalaBufferConverter[java.util.Date](dates).asScala.map[Long, scala.collection.mutable.Buffer[Long]](((x$16: java.util.Date) => x$16.getTime()))(mutable.this.Buffer.canBuildFrom[Long]).toArray[Long]((ClassTag.Long: scala.reflect.ClassTag[Long]))
297 2338 12560 - 12596 Block scala.collection.TraversableOnce.toArray scala.collection.JavaConverters.asScalaBufferConverter[java.util.Date](dates).asScala.map[Long, scala.collection.mutable.Buffer[Long]](((x$16: java.util.Date) => x$16.getTime()))(mutable.this.Buffer.canBuildFrom[Long]).toArray[Long]((ClassTag.Long: scala.reflect.ClassTag[Long]))
308 2339 13009 - 13009 Select scala.Tuple2._1 x$17._1
308 2340 13014 - 13014 Select scala.Tuple2._2 x$17._2
309 2341 13049 - 13062 Apply scala.Function1.apply ToValuesPoints.this.getTrackId.apply(f)
309 2342 13091 - 13099 Select org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesPoints.dtgIndex ToValuesPoints.this.dtgIndex
309 2343 13074 - 13100 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.convertToDate BinaryOutputEncoder.this.convertToDate(f, ToValuesPoints.this.dtgIndex)
309 2344 13040 - 13101 Apply org.locationtech.geomesa.utils.bin.BinaryOutputCallback.apply callback.apply(ToValuesPoints.this.getTrackId.apply(f), lat, lon, BinaryOutputEncoder.this.convertToDate(f, ToValuesPoints.this.dtgIndex))
318 2345 13506 - 13506 Select scala.Tuple2._1 x$18._1
318 2346 13511 - 13511 Select scala.Tuple2._2 x$18._2
319 2347 13546 - 13559 Apply scala.Function1.apply ToValuesPointsLabels.this.getTrackId.apply(f)
319 2348 13588 - 13596 Select org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesPointsLabels.dtgIndex ToValuesPointsLabels.this.dtgIndex
319 2349 13571 - 13597 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.convertToDate BinaryOutputEncoder.this.convertToDate(f, ToValuesPointsLabels.this.dtgIndex)
319 2350 13599 - 13610 Apply scala.Function1.apply ToValuesPointsLabels.this.getLabel.apply(f)
319 2351 13537 - 13611 Apply org.locationtech.geomesa.utils.bin.BinaryOutputCallback.apply callback.apply(ToValuesPointsLabels.this.getTrackId.apply(f), lat, lon, BinaryOutputEncoder.this.convertToDate(f, ToValuesPointsLabels.this.dtgIndex), ToValuesPointsLabels.this.getLabel.apply(f))
327 2352 13939 - 13952 Apply scala.Function1.apply ToValuesLines.this.getTrackId.apply(f)
328 2353 13972 - 13984 Apply scala.Function1.apply ToValuesLines.this.getLatLon.apply(f)
329 2354 14019 - 14027 Select org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesLines.dtgIndex ToValuesLines.this.dtgIndex
329 2355 14002 - 14028 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.convertToDate BinaryOutputEncoder.this.convertToDate(f, ToValuesLines.this.dtgIndex)
330 2356 14043 - 14044 Literal <nosymbol> 0
331 2357 14062 - 14075 Select scala.Array.length points.length
331 2358 14058 - 14075 Apply scala.Int.< i.<(points.length)
331 2363 14077 - 14077 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesLines.while$1 while$1()
331 2364 14077 - 14178 Block <nosymbol> { { <synthetic> <artifact> private[this] val x$19: (Float, Float) = (points.apply(i): (Float, Float) @unchecked) match { case (_1: Float, _2: Float)(Float, Float)((lat @ _), (lon @ _)) => scala.Tuple2.apply[Float, Float](lat, lon) }; val lat: Float = x$19._1; val lon: Float = x$19._2; callback.apply(trackId, lat, lon, date); i = i.+(1) }; while$1() }
331 2365 14051 - 14051 Literal <nosymbol> ()
331 2366 14051 - 14051 Block <nosymbol> ()
332 2359 14092 - 14092 Select scala.Tuple2._1 x$19._1
332 2360 14097 - 14097 Select scala.Tuple2._2 x$19._2
333 2361 14122 - 14155 Apply org.locationtech.geomesa.utils.bin.BinaryOutputCallback.apply callback.apply(trackId, lat, lon, date)
334 2362 14164 - 14170 Apply scala.Int.+ i.+(1)
344 2367 14595 - 14608 Apply scala.Function1.apply ToValuesLinesLabels.this.getTrackId.apply(f)
345 2368 14628 - 14640 Apply scala.Function1.apply ToValuesLinesLabels.this.getLatLon.apply(f)
346 2369 14675 - 14683 Select org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesLinesLabels.dtgIndex ToValuesLinesLabels.this.dtgIndex
346 2370 14658 - 14684 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.convertToDate BinaryOutputEncoder.this.convertToDate(f, ToValuesLinesLabels.this.dtgIndex)
347 2371 14703 - 14714 Apply scala.Function1.apply ToValuesLinesLabels.this.getLabel.apply(f)
348 2372 14729 - 14730 Literal <nosymbol> 0
349 2373 14748 - 14761 Select scala.Array.length points.length
349 2374 14744 - 14761 Apply scala.Int.< i.<(points.length)
349 2379 14763 - 14763 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesLinesLabels.while$2 while$2()
349 2380 14763 - 14871 Block <nosymbol> { { <synthetic> <artifact> private[this] val x$20: (Float, Float) = (points.apply(i): (Float, Float) @unchecked) match { case (_1: Float, _2: Float)(Float, Float)((lat @ _), (lon @ _)) => scala.Tuple2.apply[Float, Float](lat, lon) }; val lat: Float = x$20._1; val lon: Float = x$20._2; callback.apply(trackId, lat, lon, date, label); i = i.+(1) }; while$2() }
349 2381 14737 - 14737 Literal <nosymbol> ()
349 2382 14737 - 14737 Block <nosymbol> ()
350 2375 14778 - 14778 Select scala.Tuple2._1 x$20._1
350 2376 14783 - 14783 Select scala.Tuple2._2 x$20._2
351 2377 14808 - 14848 Apply org.locationtech.geomesa.utils.bin.BinaryOutputCallback.apply callback.apply(trackId, lat, lon, date, label)
352 2378 14857 - 14863 Apply scala.Int.+ i.+(1)
361 2383 15243 - 15256 Apply scala.Function1.apply ToValuesLinesDates.this.getTrackId.apply(f)
362 2384 15276 - 15288 Apply scala.Function1.apply ToValuesLinesDates.this.getLatLon.apply(f)
363 2385 15307 - 15320 Apply scala.Function1.apply ToValuesLinesDates.this.getLineDtg.apply(f)
364 2386 15359 - 15371 Select scala.Array.length dates.length
364 2387 15342 - 15371 Apply scala.Int.== points.length.==(dates.length)
364 2388 15375 - 15388 Select scala.Array.length points.length
364 2389 15375 - 15388 Block scala.Array.length points.length
364 2393 15396 - 15563 Block <nosymbol> { (if (BinaryOutputEncoder.this.logger.underlying.isWarnEnabled()) BinaryOutputEncoder.this.logger.underlying.warn("Mismatched geometries and dates for simple feature {}: {} {}", (f: AnyRef), (scala.Predef.refArrayOps[(Float, Float)](points).toList: AnyRef), (scala.Predef.longArrayOps(dates).toList: AnyRef)) else (): Unit); scala.math.`package`.min(points.length, dates.length) }
366 2390 15527 - 15540 Select scala.Array.length points.length
366 2391 15542 - 15554 Select scala.Array.length dates.length
366 2392 15518 - 15555 Apply scala.math.min scala.math.`package`.min(points.length, dates.length)
368 2394 15578 - 15579 Literal <nosymbol> 0
369 2395 15593 - 15601 Apply scala.Int.< i.<(size)
369 2401 15603 - 15603 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesLinesDates.while$3 while$3()
369 2402 15603 - 15708 Block <nosymbol> { { <synthetic> <artifact> private[this] val x$21: (Float, Float) = (points.apply(i): (Float, Float) @unchecked) match { case (_1: Float, _2: Float)(Float, Float)((lat @ _), (lon @ _)) => scala.Tuple2.apply[Float, Float](lat, lon) }; val lat: Float = x$21._1; val lon: Float = x$21._2; callback.apply(trackId, lat, lon, dates.apply(i)); i = i.+(1) }; while$3() }
369 2403 15586 - 15586 Literal <nosymbol> ()
369 2404 15586 - 15586 Block <nosymbol> ()
370 2396 15618 - 15618 Select scala.Tuple2._1 x$21._1
370 2397 15623 - 15623 Select scala.Tuple2._2 x$21._2
371 2398 15676 - 15684 Apply scala.Array.apply dates.apply(i)
371 2399 15648 - 15685 Apply org.locationtech.geomesa.utils.bin.BinaryOutputCallback.apply callback.apply(trackId, lat, lon, dates.apply(i))
372 2400 15694 - 15700 Apply scala.Int.+ i.+(1)
382 2405 16174 - 16187 Apply scala.Function1.apply ToValuesLinesDatesLabels.this.getTrackId.apply(f)
383 2406 16207 - 16219 Apply scala.Function1.apply ToValuesLinesDatesLabels.this.getLatLon.apply(f)
384 2407 16238 - 16251 Apply scala.Function1.apply ToValuesLinesDatesLabels.this.getLineDtg.apply(f)
385 2408 16290 - 16302 Select scala.Array.length dates.length
385 2409 16273 - 16302 Apply scala.Int.== points.length.==(dates.length)
385 2410 16306 - 16319 Select scala.Array.length points.length
385 2411 16306 - 16319 Block scala.Array.length points.length
385 2415 16327 - 16494 Block <nosymbol> { (if (BinaryOutputEncoder.this.logger.underlying.isWarnEnabled()) BinaryOutputEncoder.this.logger.underlying.warn("Mismatched geometries and dates for simple feature {}: {} {}", (f: AnyRef), (scala.Predef.refArrayOps[(Float, Float)](points).toList: AnyRef), (scala.Predef.longArrayOps(dates).toList: AnyRef)) else (): Unit); scala.math.`package`.min(points.length, dates.length) }
387 2412 16458 - 16471 Select scala.Array.length points.length
387 2413 16473 - 16485 Select scala.Array.length dates.length
387 2414 16449 - 16486 Apply scala.math.min scala.math.`package`.min(points.length, dates.length)
389 2416 16513 - 16524 Apply scala.Function1.apply ToValuesLinesDatesLabels.this.getLabel.apply(f)
390 2417 16539 - 16540 Literal <nosymbol> 0
391 2418 16554 - 16562 Apply scala.Int.< i.<(size)
391 2424 16564 - 16564 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.ToValuesLinesDatesLabels.while$4 while$4()
391 2425 16564 - 16676 Block <nosymbol> { { <synthetic> <artifact> private[this] val x$22: (Float, Float) = (points.apply(i): (Float, Float) @unchecked) match { case (_1: Float, _2: Float)(Float, Float)((lat @ _), (lon @ _)) => scala.Tuple2.apply[Float, Float](lat, lon) }; val lat: Float = x$22._1; val lon: Float = x$22._2; callback.apply(trackId, lat, lon, dates.apply(i), label); i = i.+(1) }; while$4() }
391 2426 16547 - 16547 Literal <nosymbol> ()
391 2427 16547 - 16547 Block <nosymbol> ()
392 2419 16579 - 16579 Select scala.Tuple2._1 x$22._1
392 2420 16584 - 16584 Select scala.Tuple2._2 x$22._2
393 2421 16637 - 16645 Apply scala.Array.apply dates.apply(i)
393 2422 16609 - 16653 Apply org.locationtech.geomesa.utils.bin.BinaryOutputCallback.apply callback.apply(trackId, lat, lon, dates.apply(i), label)
394 2423 16662 - 16668 Apply scala.Int.+ i.+(1)