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.features.kryo
10 
11 import com.esotericsoftware.kryo.io.{Input, Output}
12 import org.geotools.api.feature.`type`.{AttributeDescriptor, Name}
13 import org.geotools.api.feature.simple.{SimpleFeature, SimpleFeatureType}
14 import org.geotools.api.feature.{GeometryAttribute, Property}
15 import org.geotools.api.filter.identity.FeatureId
16 import org.geotools.api.geometry.BoundingBox
17 import org.geotools.geometry.jts.ReferencedEnvelope
18 import org.locationtech.geomesa.features.ScalaSimpleFeature
19 import org.locationtech.geomesa.features.SerializationOption.SerializationOption
20 import org.locationtech.geomesa.features.geotools.ImmutableFeatureId
21 import org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature._
22 import org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserialization.KryoLongReader
23 import org.locationtech.geomesa.features.kryo.impl.{IntBitSet, KryoFeatureDeserialization, KryoFeatureDeserializationV2, NonMutatingInput}
24 import org.locationtech.geomesa.features.kryo.serialization.KryoUserDataSerialization
25 import org.locationtech.geomesa.utils.geotools.Transform
26 import org.locationtech.geomesa.utils.geotools.Transform.{PropertyTransform, RenameTransform, Transforms}
27 import org.locationtech.jts.geom.Geometry
28 
29 class KryoBufferSimpleFeature(serializer: KryoFeatureDeserialization) extends SimpleFeature {
30 
31   import org.locationtech.geomesa.utils.geotools.RichSimpleFeatureType.RichSimpleFeatureType
32 
33   private val input = new NonMutatingInput()
34 
35   private val idParser = if (serializer.withoutId) { new IdParser() } else { new WithIdParser() }
36   private val delegateV3 = new KryoBufferV3(serializer, input)
37 
38   @volatile
39   private var seenV2 = false
40   private lazy val delegateV2 = {
41     seenV2 = true
42     val buf = new KryoBufferV2(serializer, input)
43     if (transforms != null) {
44       buf.setTransforms(transformSchema, transformDefinitions)
45     }
46     buf
47   }
48 
49   private lazy val geomIndex = serializer.out.getGeomIndex
50 
51   private var delegate: KryoBufferDelegate = _
52 
53   private var transforms: String = _
54   private var transformSchema: SimpleFeatureType = _
55   private var transformDefinitions: Array[Transform] = _
56 
57   private var userData: java.util.Map[AnyRef, AnyRef] = _
58 
59   /**
60     * Creates a new feature for later use - does not copy attribute bytes
61     *
62     * @return
63     */
64   def copy(): KryoBufferSimpleFeature = {
65     val sf = new KryoBufferSimpleFeature(serializer)
66     sf.setIdParser(idParser.parse)
67     if (transforms != null) {
68       sf.setTransforms(transforms, transformSchema)
69     }
70     sf
71   }
72 
73   /**
74     * Sets the parser for reading feature ids out of the id buffer
75     *
76     * @param parse parse method
77     */
78   def setIdParser(parse: (Array[Byte], Int, Int) => String): Unit = idParser.parse = parse
79 
80   /**
81     * Sets the transform to be applied to this feature when calling `transform`
82     *
83     * @param transforms transform definition, per geotools format
84     * @param transformSchema schema that results from applying the transform
85     */
86   def setTransforms(transforms: String, transformSchema: SimpleFeatureType): Unit = {
87     this.transforms = transforms
88     this.transformSchema = transformSchema
89     this.transformDefinitions = Transforms(serializer.out, transforms).toArray
90     delegateV3.setTransforms(transformSchema, transformDefinitions)
91     if (seenV2) {
92       delegateV2.setTransforms(transformSchema, transformDefinitions)
93     }
94   }
95 
96   /**
97     * Gets any transforms applied to this feature
98     *
99     * @return
100     */
101   def getTransform: Option[(String, SimpleFeatureType)] =
102     for { t <- Option(transforms); s <- Option(transformSchema) } yield { (t, s) }
103 
104   /**
105     * Set the serialized bytes to use for reading attributes
106     *
107     * @param bytes serialized byte array
108     */
109   def setBuffer(bytes: Array[Byte]): Unit = setBuffer(bytes, 0, bytes.length)
110 
111   /**
112     * Set the serialized bytes to use for reading attributes
113     *
114     * @param bytes serialized byte array
115     * @param offset offset into the byte array of valid bytes
116     * @param length number of valid bytes to read from the byte array
117     */
118   def setBuffer(bytes: Array[Byte], offset: Int, length: Int): Unit = {
119     input.setBuffer(bytes, offset, length)
120     delegate = input.readByte() match {
121       case KryoFeatureSerializer.Version3 => delegateV3
122       case KryoFeatureSerializer.Version2 => delegateV2
123       case b => throw new IllegalArgumentException(s"Can't process features serialized with version: $b")
124     }
125     delegate.reset()
126     userData = null
127   }
128 
129   /**
130     * Sets the serialized bytes containing the feature ID (i.e. the row key)
131     *
132     * @param bytes bytes
133     */
134   def setIdBuffer(bytes: Array[Byte]): Unit = setIdBuffer(bytes, 0, bytes.length)
135 
136   /**
137     * Sets the serialized bytes containing the feature ID (i.e. the row key)
138     *
139     * @param bytes bytes
140     * @param offset offset into the byte array of valid bytes
141     * @param length number of valid bytes to read from the byte array
142     */
143   def setIdBuffer(bytes: Array[Byte], offset: Int, length: Int): Unit = {
144     idParser.buffer = bytes
145     idParser.offset = offset
146     idParser.length = length
147   }
148 
149   /**
150     * Transform the feature into a serialized byte array
151     *
152     * @return
153     */
154   def transform(): Array[Byte] = delegate.transform(this)
155 
156   /**
157     * Get a date attribute as a raw long
158     *
159     * @param index attribute index
160     * @return
161     */
162   def getDateAsLong(index: Int): Long = delegate.getDateAsLong(index)
163 
164   /**
165     * Get the underlying kryo input, positioned to read the attribute at the given index
166     *
167     * @param index attribute index
168     * @return input, if the attribute is not null
169     */
170   def getInput(index: Int): Option[Input] = delegate.getInput(index)
171 
172   override def getAttribute(index: Int): AnyRef = delegate.getAttribute(index)
173 
174   override def getType: SimpleFeatureType = serializer.out
175   override def getFeatureType: SimpleFeatureType = serializer.out
176   override def getName: Name = serializer.out.getName
177 
178   override def getID: String = idParser.id()
179   override def getIdentifier: FeatureId = new ImmutableFeatureId(idParser.id())
180 
181   override def getAttribute(name: Name): AnyRef = getAttribute(name.getLocalPart)
182   override def getAttribute(name: String): Object = {
183     val index = serializer.out.indexOf(name)
184     if (index == -1) { null } else { getAttribute(index) }
185   }
186 
187   override def getDefaultGeometry: AnyRef = if (geomIndex == -1) { null } else { getAttribute(geomIndex) }
188   override def getAttributeCount: Int = serializer.out.getAttributeCount
189 
190   override def getBounds: BoundingBox = getDefaultGeometry match {
191     case g: Geometry => new ReferencedEnvelope(g.getEnvelopeInternal, serializer.out.getCoordinateReferenceSystem)
192     case _           => new ReferencedEnvelope(serializer.out.getCoordinateReferenceSystem)
193   }
194 
195   override def getAttributes: java.util.List[AnyRef] = {
196     val attributes = new java.util.ArrayList[AnyRef](serializer.out.getAttributeCount)
197     var i = 0
198     while (i < serializer.out.getAttributeCount) {
199       attributes.add(getAttribute(i))
200       i += 1
201     }
202     attributes
203   }
204 
205   override def getUserData: java.util.Map[AnyRef, AnyRef] = {
206     if (userData == null) {
207       userData = if (serializer.withoutUserData) { new java.util.HashMap(1) } else { delegate.getUserData }
208     }
209     userData
210   }
211 
212   override def getDefaultGeometryProperty: GeometryAttribute = throw new UnsupportedOperationException()
213   override def getProperties: java.util.Collection[Property] = throw new UnsupportedOperationException()
214   override def getProperties(name: Name): java.util.Collection[Property] = throw new UnsupportedOperationException()
215   override def getProperties(name: String): java.util.Collection[Property] = throw new UnsupportedOperationException()
216   override def getProperty(name: Name): Property = throw new UnsupportedOperationException()
217   override def getProperty(name: String): Property = throw new UnsupportedOperationException()
218   override def getValue: java.util.Collection[_ <: Property] = throw new UnsupportedOperationException()
219   override def getDescriptor: AttributeDescriptor = throw new UnsupportedOperationException()
220 
221   override def setAttribute(name: Name, value: Object): Unit = throw new UnsupportedOperationException()
222   override def setAttribute(name: String, value: Object): Unit = throw new UnsupportedOperationException()
223   override def setAttribute(index: Int, value: Object): Unit = throw new UnsupportedOperationException()
224   override def setAttributes(vals: java.util.List[Object]): Unit = throw new UnsupportedOperationException()
225   override def setAttributes(vals: Array[Object]): Unit = throw new UnsupportedOperationException()
226   override def setDefaultGeometry(geo: Object): Unit = throw new UnsupportedOperationException()
227   override def setDefaultGeometryProperty(geoAttr: GeometryAttribute): Unit = throw new UnsupportedOperationException()
228   override def setValue(newValue: Object): Unit = throw new UnsupportedOperationException()
229   override def setValue(values: java.util.Collection[Property]): Unit = throw new UnsupportedOperationException()
230 
231   override def isNillable: Boolean = true
232   override def validate(): Unit = throw new UnsupportedOperationException()
233 
234   override def toString: String = s"KryoBufferSimpleFeature:$getID"
235 
236   private class WithIdParser extends IdParser {
237     override def id(): String = delegate.id()
238   }
239 }
240 
241 object KryoBufferSimpleFeature {
242 
243   private class IdParser {
244     var parse: (Array[Byte], Int, Int) => String = (_, _, _) => null
245     var buffer: Array[Byte] = _
246     var offset: Int = 0
247     var length: Int = 0
248 
249     def id(): String = parse(buffer, offset, length)
250   }
251 
252   /**
253     * Common interface for handling serialization versions
254     */
255   private sealed trait KryoBufferDelegate extends Transformer {
256 
257     /**
258       * Invoked after the underlying kryo buffer has been updated with a new serialized feature
259       */
260     def reset(): Unit
261 
262     /**
263       * Sets the transform to be applied to the feature
264       *
265       * @param schema schema that results from applying the transform
266       * @param transforms transform definitions
267       */
268     def setTransforms(schema: SimpleFeatureType, transforms: Array[Transform]): Unit
269 
270     /**
271       * Deserialize the feature ID (assuming options.withId)
272       *
273       * @return
274       */
275     def id(): String
276 
277     /**
278       * Deserialize an attribute
279       *
280       * @param index attribute number
281       * @return
282       */
283     def getAttribute(index: Int): AnyRef
284 
285     /**
286       * Deserialize user data
287       *
288       * @return
289       */
290     def getUserData: java.util.Map[AnyRef, AnyRef]
291 
292     /**
293       * Optimized method to get a date attribute as millis without creating a new Date object
294       *
295       * @param index attribute number
296       * @return
297       */
298     def getDateAsLong(index: Int): Long
299 
300     /**
301       * Gets the input, positioned to read the given attribute
302       *
303       * @param index attribute index
304       * @return
305       */
306     def getInput(index: Int): Option[Input]
307   }
308 
309   /**
310     * Abstraction over transformer impls
311     */
312   private sealed trait Transformer {
313 
314     /**
315       * Transform a feature, based on previously set transform schema
316       *
317       * @param original original feature being transformed
318       * @return
319       */
320     def transform(original: SimpleFeature): Array[Byte]
321   }
322 
323   /**
324     * Serialization version 3 delegate
325     *
326     * @param serializer serializer
327     * @param input input
328     */
329   private class KryoBufferV3(serializer: KryoFeatureDeserialization, input: Input) extends KryoBufferDelegate {
330 
331     private var metadata: Metadata = _
332     private var transformer: Transformer = _
333 
334     override def reset(): Unit = metadata = Metadata(input) // reads count, size, nulls, etc
335 
336     override def setTransforms(schema: SimpleFeatureType, transforms: Array[Transform]): Unit = {
337       val indices = transforms.map {
338         case t: PropertyTransform => t.i
339         case t: RenameTransform => t.i
340         case _ => -1
341       }
342       if (indices.contains(-1)) {
343         transformer = new ReserializeTransformer(schema, transforms, serializer.options)
344       } else {
345         transformer = new BinaryTransformer(indices)
346       }
347     }
348 
349     override def id(): String = {
350       metadata.setIdPosition()
351       input.readString()
352     }
353 
354     override def getAttribute(index: Int): AnyRef = {
355       if (index >= metadata.count || metadata.nulls.contains(index)) { null } else {
356         metadata.setPosition(index)
357         serializer.readers(index).apply(input)
358       }
359     }
360 
361     override def getUserData: java.util.Map[AnyRef, AnyRef] = {
362       metadata.setUserDataPosition()
363       KryoUserDataSerialization.deserialize(input)
364     }
365 
366     override def getDateAsLong(index: Int): Long = {
367       if (index >= metadata.count || metadata.nulls.contains(index)) { 0L } else {
368         metadata.setPosition(index)
369         KryoLongReader.apply(input)
370       }
371     }
372 
373     override def getInput(index: Int): Option[Input] = {
374       if (index >= metadata.count || metadata.nulls.contains(index)) { None } else {
375         metadata.setPosition(index)
376         Some(input)
377       }
378     }
379 
380     override def transform(original: SimpleFeature): Array[Byte] = transformer.transform(original)
381 
382     // if we are just returning a subset of attributes, we can copy the bytes directly
383     private class BinaryTransformer(indices: Array[Int]) extends Transformer {
384 
385       private val positionsAndLengths = Array.ofDim[(Int, Int)](indices.length)
386 
387       override def transform(original: SimpleFeature): Array[Byte] = {
388         // +1 for version, +2 for count, +1 for size
389         var length = (metadata.size * (indices.length + 1)) + (IntBitSet.size(indices.length) * 4) + 4
390         val id = if (serializer.withoutId) { null } else {
391           val pos = metadata.setIdPosition() + metadata.offset
392           val id = input.readString()
393           length += input.position() - pos
394           id
395         }
396 
397         val nulls = IntBitSet(indices.length)
398 
399         // track the write position for copying attributes in the transformed array
400         var resultCursor = length
401 
402         var i = 0
403         while (i < indices.length) {
404           val index = indices(i) // the index of the attribute in the original feature
405           if (index >= metadata.count || metadata.nulls.contains(index)) { nulls.add(i) } else {
406             // read the offset and the subsequent offset to get the length
407             val pos = metadata.setPosition(index)
408             val len = metadata.setPosition(index + 1) - pos
409             length += len
410             positionsAndLengths(i) = (metadata.offset + pos, len)
411           }
412           i += 1
413         }
414 
415         // note: the input buffer is the raw buffer. we need to ensure that we use the
416         // offset into the raw buffer rather than the raw buffer directly
417         val buf = input.getBuffer
418 
419         val result = Array.ofDim[Byte](length)
420         val output = new Output(result, length)
421         output.writeByte(KryoFeatureSerializer.Version3)
422         output.writeShort(indices.length) // track the number of attributes
423         output.write(metadata.size)
424         i = 0
425         while (i < positionsAndLengths.length) {
426           // note: offset is always 4 here since we're using the full result array
427           if (metadata.size == 2) {
428             output.writeShort(resultCursor - 4)
429           } else {
430             output.writeInt(resultCursor - 4)
431           }
432           if (!nulls.contains(i)) {
433             val (pos, len) = positionsAndLengths(i)
434             System.arraycopy(buf, pos, result, resultCursor, len)
435             resultCursor += len
436           }
437           i += 1
438         }
439         // user data offset
440         if (metadata.size == 2) {
441           output.writeShort(resultCursor)
442         } else {
443           output.writeInt(resultCursor)
444         }
445 
446         // TODO user data?
447 
448         // write out nulls
449         nulls.serialize(output)
450 
451         // we're already positioned to write out the feature id
452         if (id != null) {
453           output.writeString(id)
454         }
455 
456         result
457       }
458     }
459   }
460 
461   /**
462     * Serialiation version 2 delegate
463     *
464     * @param serializer serializer
465     * @param input input
466     */
467   private class KryoBufferV2(serializer: KryoFeatureDeserialization, input: Input) extends KryoBufferDelegate {
468 
469     private val offsets = Array.ofDim[Int](serializer.out.getAttributeCount)
470     private var offset: Int = -1
471     private var startOfOffsets: Int = -1
472     private var missingAttributes: Boolean = false
473     private var userDataOffset: Int = -1
474 
475     private var reserializeTransform: Transformer = _
476     private var binaryTransform: Transformer = _
477 
478     override def reset(): Unit = {
479       // reset our offsets
480       offset = input.position() - 1 // we've already read the version byte
481       startOfOffsets = offset + input.readInt()
482       input.setPosition(startOfOffsets) // set to offsets start
483       var i = 0
484       while (i < offsets.length && input.position < input.limit) {
485         offsets(i) = offset + input.readInt(true)
486         i += 1
487       }
488       if (i < offsets.length) {
489         // attributes have been added to the sft since this feature was serialized
490         missingAttributes = true
491         while ({{ offsets(i) = -1; i += 1 }; i < offsets.length })()
492       } else {
493         missingAttributes = false
494       }
495       userDataOffset = input.position()
496     }
497 
498     override def setTransforms(schema: SimpleFeatureType, transforms: Array[Transform]): Unit = {
499       val indices = transforms.map {
500         case t: PropertyTransform => t.i
501         case t: RenameTransform => t.i
502         case _ => -1
503       }
504 
505       // transforms by evaluating the transform expressions and then serializing the resulting feature
506       // we use this for transform expressions and for data that was written using an old schema
507       reserializeTransform = new ReserializeTransformer(schema, transforms, serializer.options)
508       // if we are just returning a subset of attributes, we can copy the bytes directly
509       // and avoid creating new objects, reserializing, etc
510       binaryTransform =
511           if (indices.contains(-1)) { reserializeTransform } else { new BinaryTransformerV2(input, indices, offsets) }
512     }
513 
514     override def id(): String = {
515       input.setPosition(5)
516       input.readString()
517     }
518 
519     override def getAttribute(index: Int): AnyRef = {
520       val offset = offsets(index)
521       if (offset == -1) { null } else {
522         input.setPosition(offset)
523         serializer.readersV2(index)(input)
524       }
525     }
526 
527     override def getUserData: java.util.Map[AnyRef, AnyRef] = {
528       input.setPosition(userDataOffset)
529       KryoUserDataSerialization.deserialize(input)
530     }
531 
532     override def getDateAsLong(index: Int): Long = {
533       val offset = offsets(index)
534       if (offset == -1) { 0L } else {
535         input.setPosition(offset)
536         KryoFeatureDeserializationV2.LongReader.apply(input)
537       }
538     }
539 
540     override def getInput(index: Int): Option[Input] = {
541       val offset = offsets(index)
542       if (offset == -1) { None } else {
543         input.setPosition(offset)
544         Some(input)
545       }
546     }
547 
548     override def transform(original: SimpleFeature): Array[Byte] = {
549       // if attributes have been added to the sft, we have to reserialize to get the null serialized values
550       val transformer = if (missingAttributes) { reserializeTransform } else { binaryTransform }
551       transformer.transform(original)
552     }
553 
554     /**
555       * Serialization version 2 binary transformer. Copies serialized attribute bytes directly without
556       * deserializing them
557       *
558       * @param input input
559       * @param indices transform indices
560       * @param offsets attribute offsets
561       */
562     private class BinaryTransformerV2(input: Input, indices: Array[Int], offsets: Array[Int]) extends Transformer {
563 
564       private val mutableOffsetsAndLength = Array.ofDim[(Int,Int)](indices.length)
565 
566       override def transform(original: SimpleFeature): Array[Byte] = {
567         // NOTE: the input buffer is the raw buffer. we need to ensure that we use the
568         // offset into the raw buffer rather than the raw buffer directly
569         val buf = input.getBuffer
570         var length = offsets(0) - offset // space for version, offset block and ID
571         var idx = 0
572         while (idx < mutableOffsetsAndLength.length) {
573           val i = indices(idx)
574           val el = (if (i < offsets.length - 1) { offsets(i + 1) } else { startOfOffsets }) - offsets(i)
575           length += el
576           mutableOffsetsAndLength(idx) = (offsets(i), el)
577           idx += 1
578         }
579 
580         val dst = Array.ofDim[Byte](length)
581         // copy the version, offset block and id
582         var dstPos = offsets(0) - offset
583         System.arraycopy(buf, offset, dst, 0, dstPos)
584         mutableOffsetsAndLength.foreach { case (o, l) =>
585           System.arraycopy(buf, o, dst, dstPos, l)
586           dstPos += l
587         }
588         // note that the offset block is incorrect - we couldn't use this in another lazy feature
589         // but the normal serializer doesn't care
590         dst
591       }
592     }
593   }
594 
595   /**
596     * For non-attribute expressions, we have evaluate them, then serialize the resulting feature
597     *
598     * @param schema transform schema
599     * @param transforms transform definitions
600     * @param options serialization options
601     */
602   private class ReserializeTransformer(
603       schema: SimpleFeatureType,
604       transforms: Array[Transform],
605       options: Set[SerializationOption]
606     ) extends Transformer {
607 
608     private val serializer = KryoFeatureSerializer(schema, options)
609     private val sf = new ScalaSimpleFeature(schema, "")
610 
611     override def transform(original: SimpleFeature): Array[Byte] = {
612       sf.setId(original.getID)
613       var i = 0
614       while (i < transforms.length) {
615         sf.setAttribute(i, transforms(i).evaluate(original))
616         i += 1
617       }
618       serializer.serialize(sf)
619     }
620   }
621 }
Line Stmt Id Pos Tree Symbol Tests Code
33 1 1935 - 1957 Apply org.locationtech.geomesa.features.kryo.impl.NonMutatingInput.<init> new org.locationtech.geomesa.features.kryo.impl.NonMutatingInput()
35 2 1988 - 2008 Select org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserialization.withoutId KryoBufferSimpleFeature.this.serializer.withoutId
35 3 2012 - 2026 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.IdParser.<init> new org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.IdParser()
35 4 2012 - 2026 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.IdParser.<init> new org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.IdParser()
35 5 2036 - 2054 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.WithIdParser.<init> new KryoBufferSimpleFeature.this.WithIdParser()
35 6 2036 - 2054 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.WithIdParser.<init> new KryoBufferSimpleFeature.this.WithIdParser()
36 7 2101 - 2111 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.serializer KryoBufferSimpleFeature.this.serializer
36 8 2113 - 2118 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.input KryoBufferSimpleFeature.this.input
36 9 2084 - 2119 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3.<init> new org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3(KryoBufferSimpleFeature.this.serializer, KryoBufferSimpleFeature.this.input)
39 10 2156 - 2161 Literal <nosymbol> false
65 11 2881 - 2891 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.serializer KryoBufferSimpleFeature.this.serializer
65 12 2853 - 2892 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.<init> new KryoBufferSimpleFeature(KryoBufferSimpleFeature.this.serializer)
66 13 2912 - 2926 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.IdParser.parse KryoBufferSimpleFeature.this.idParser.parse
66 14 2897 - 2927 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.setIdParser sf.setIdParser(KryoBufferSimpleFeature.this.idParser.parse)
67 15 2936 - 2954 Apply java.lang.Object.!= KryoBufferSimpleFeature.this.transforms.!=(null)
67 20 2932 - 2932 Literal <nosymbol> ()
67 21 2932 - 2932 Block <nosymbol> ()
68 16 2981 - 2991 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.transforms KryoBufferSimpleFeature.this.transforms
68 17 2993 - 3008 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.transformSchema KryoBufferSimpleFeature.this.transformSchema
68 18 2964 - 3009 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.setTransforms sf.setTransforms(KryoBufferSimpleFeature.this.transforms, KryoBufferSimpleFeature.this.transformSchema)
68 19 2964 - 3009 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.setTransforms sf.setTransforms(KryoBufferSimpleFeature.this.transforms, KryoBufferSimpleFeature.this.transformSchema)
78 22 3214 - 3236 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.IdParser.parse_= KryoBufferSimpleFeature.this.idParser.parse_=(parse)
87 23 3570 - 3598 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.transforms_= this.transforms_=(transforms)
88 24 3603 - 3641 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.transformSchema_= this.transformSchema_=(transformSchema)
89 25 3685 - 3699 Select org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserialization.out KryoBufferSimpleFeature.this.serializer.out
89 26 3674 - 3720 ApplyToImplicitArgs scala.collection.TraversableOnce.toArray org.locationtech.geomesa.utils.geotools.Transform.Transforms.apply(KryoBufferSimpleFeature.this.serializer.out, transforms).toArray[org.locationtech.geomesa.utils.geotools.Transform]((ClassTag.apply[org.locationtech.geomesa.utils.geotools.Transform](classOf[org.locationtech.geomesa.utils.geotools.Transform]): scala.reflect.ClassTag[org.locationtech.geomesa.utils.geotools.Transform]))
89 27 3646 - 3720 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.transformDefinitions_= this.transformDefinitions_=(org.locationtech.geomesa.utils.geotools.Transform.Transforms.apply(KryoBufferSimpleFeature.this.serializer.out, transforms).toArray[org.locationtech.geomesa.utils.geotools.Transform]((ClassTag.apply[org.locationtech.geomesa.utils.geotools.Transform](classOf[org.locationtech.geomesa.utils.geotools.Transform]): scala.reflect.ClassTag[org.locationtech.geomesa.utils.geotools.Transform])))
90 28 3767 - 3787 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.transformDefinitions KryoBufferSimpleFeature.this.transformDefinitions
90 29 3725 - 3788 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3.setTransforms KryoBufferSimpleFeature.this.delegateV3.setTransforms(transformSchema, KryoBufferSimpleFeature.this.transformDefinitions)
91 30 3797 - 3803 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.seenV2 KryoBufferSimpleFeature.this.seenV2
91 34 3793 - 3793 Literal <nosymbol> ()
91 35 3793 - 3793 Block <nosymbol> ()
92 31 3855 - 3875 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.transformDefinitions KryoBufferSimpleFeature.this.transformDefinitions
92 32 3813 - 3876 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.setTransforms KryoBufferSimpleFeature.this.delegateV2.setTransforms(transformSchema, KryoBufferSimpleFeature.this.transformDefinitions)
92 33 3813 - 3876 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.setTransforms KryoBufferSimpleFeature.this.delegateV2.setTransforms(transformSchema, KryoBufferSimpleFeature.this.transformDefinitions)
102 36 4051 - 4061 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.transforms KryoBufferSimpleFeature.this.transforms
102 37 4076 - 4091 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.transformSchema KryoBufferSimpleFeature.this.transformSchema
102 38 4103 - 4109 Apply scala.Tuple2.apply scala.Tuple2.apply[String, org.geotools.api.feature.simple.SimpleFeatureType](t, s)
102 39 4064 - 4109 Apply scala.Option.map scala.Option.apply[org.geotools.api.feature.simple.SimpleFeatureType](KryoBufferSimpleFeature.this.transformSchema).map[(String, org.geotools.api.feature.simple.SimpleFeatureType)](((s: org.geotools.api.feature.simple.SimpleFeatureType) => scala.Tuple2.apply[String, org.geotools.api.feature.simple.SimpleFeatureType](t, s)))
102 40 4033 - 4109 Apply scala.Option.flatMap scala.Option.apply[String](KryoBufferSimpleFeature.this.transforms).flatMap[(String, org.geotools.api.feature.simple.SimpleFeatureType)](((t: String) => scala.Option.apply[org.geotools.api.feature.simple.SimpleFeatureType](KryoBufferSimpleFeature.this.transformSchema).map[(String, org.geotools.api.feature.simple.SimpleFeatureType)](((s: org.geotools.api.feature.simple.SimpleFeatureType) => scala.Tuple2.apply[String, org.geotools.api.feature.simple.SimpleFeatureType](t, s)))))
109 41 4295 - 4296 Literal <nosymbol> 0
109 42 4298 - 4310 Select scala.Array.length bytes.length
109 43 4278 - 4311 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.setBuffer KryoBufferSimpleFeature.this.setBuffer(bytes, 0, bytes.length)
119 44 4642 - 4680 Apply com.esotericsoftware.kryo.io.Input.setBuffer KryoBufferSimpleFeature.this.input.setBuffer(bytes, offset, length)
120 45 4696 - 4712 Apply com.esotericsoftware.kryo.io.Input.readByte KryoBufferSimpleFeature.this.input.readByte()
120 51 4685 - 4944 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.delegate_= KryoBufferSimpleFeature.this.delegate_=(KryoBufferSimpleFeature.this.input.readByte() match { case KryoFeatureSerializer.Version3 => KryoBufferSimpleFeature.this.delegateV3 case KryoFeatureSerializer.Version2 => KryoBufferSimpleFeature.this.delegateV2 case (b @ _) => throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Can\'t process features serialized with version: ", "").s(b)) })
121 46 4766 - 4776 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.delegateV3 KryoBufferSimpleFeature.this.delegateV3
121 47 4766 - 4776 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.delegateV3 KryoBufferSimpleFeature.this.delegateV3
122 48 4822 - 4832 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.delegateV2 KryoBufferSimpleFeature.this.delegateV2
123 49 4849 - 4938 Throw <nosymbol> throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Can\'t process features serialized with version: ", "").s(b))
123 50 4849 - 4938 Block <nosymbol> throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Can\'t process features serialized with version: ", "").s(b))
125 52 4949 - 4965 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferDelegate.reset KryoBufferSimpleFeature.this.delegate.reset()
126 53 4970 - 4985 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.userData_= KryoBufferSimpleFeature.this.userData_=(null)
134 54 5177 - 5178 Literal <nosymbol> 0
134 55 5180 - 5192 Select scala.Array.length bytes.length
134 56 5158 - 5193 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.setIdBuffer KryoBufferSimpleFeature.this.setIdBuffer(bytes, 0, bytes.length)
144 57 5526 - 5549 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.IdParser.buffer_= KryoBufferSimpleFeature.this.idParser.buffer_=(bytes)
145 58 5554 - 5578 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.IdParser.offset_= KryoBufferSimpleFeature.this.idParser.offset_=(offset)
146 59 5583 - 5607 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.IdParser.length_= KryoBufferSimpleFeature.this.idParser.length_=(length)
154 60 5736 - 5760 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.Transformer.transform KryoBufferSimpleFeature.this.delegate.transform(this)
162 61 5911 - 5940 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferDelegate.getDateAsLong KryoBufferSimpleFeature.this.delegate.getDateAsLong(index)
170 62 6179 - 6203 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferDelegate.getInput KryoBufferSimpleFeature.this.delegate.getInput(index)
172 63 6255 - 6283 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferDelegate.getAttribute KryoBufferSimpleFeature.this.delegate.getAttribute(index)
174 64 6329 - 6343 Select org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserialization.out KryoBufferSimpleFeature.this.serializer.out
175 65 6395 - 6409 Select org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserialization.out KryoBufferSimpleFeature.this.serializer.out
176 66 6441 - 6463 Apply org.geotools.api.feature.type.PropertyType.getName KryoBufferSimpleFeature.this.serializer.out.getName()
178 67 6496 - 6509 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.IdParser.id KryoBufferSimpleFeature.this.idParser.id()
179 68 6575 - 6588 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.IdParser.id KryoBufferSimpleFeature.this.idParser.id()
179 69 6552 - 6589 Apply org.locationtech.geomesa.features.geotools.ImmutableFeatureId.<init> new org.locationtech.geomesa.features.geotools.ImmutableFeatureId(KryoBufferSimpleFeature.this.idParser.id())
181 70 6654 - 6671 Apply org.geotools.api.feature.type.Name.getLocalPart name.getLocalPart()
181 71 6641 - 6672 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.getAttribute KryoBufferSimpleFeature.this.getAttribute(name.getLocalPart())
183 72 6743 - 6771 Apply org.geotools.api.feature.simple.SimpleFeatureType.indexOf KryoBufferSimpleFeature.this.serializer.out.indexOf(name)
184 73 6780 - 6791 Apply scala.Int.== index.==(-1)
184 74 6795 - 6799 Literal <nosymbol> null
184 75 6795 - 6799 Block <nosymbol> null
184 76 6809 - 6828 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.getAttribute KryoBufferSimpleFeature.this.getAttribute(index)
184 77 6809 - 6828 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.getAttribute KryoBufferSimpleFeature.this.getAttribute(index)
187 78 6884 - 6899 Apply scala.Int.== KryoBufferSimpleFeature.this.geomIndex.==(-1)
187 79 6903 - 6907 Literal <nosymbol> null
187 80 6903 - 6907 Block <nosymbol> null
187 81 6917 - 6940 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.getAttribute KryoBufferSimpleFeature.this.getAttribute(KryoBufferSimpleFeature.this.geomIndex)
187 82 6917 - 6940 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.getAttribute KryoBufferSimpleFeature.this.getAttribute(KryoBufferSimpleFeature.this.geomIndex)
188 83 6983 - 7015 Apply org.geotools.api.feature.simple.SimpleFeatureType.getAttributeCount KryoBufferSimpleFeature.this.serializer.out.getAttributeCount()
190 84 7057 - 7075 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.getDefaultGeometry KryoBufferSimpleFeature.this.getDefaultGeometry()
191 85 7131 - 7152 Apply org.locationtech.jts.geom.Geometry.getEnvelopeInternal g.getEnvelopeInternal()
191 86 7154 - 7197 Apply org.geotools.api.feature.type.FeatureType.getCoordinateReferenceSystem KryoBufferSimpleFeature.this.serializer.out.getCoordinateReferenceSystem()
191 87 7108 - 7198 Apply org.geotools.geometry.jts.ReferencedEnvelope.<init> new org.geotools.geometry.jts.ReferencedEnvelope(g.getEnvelopeInternal(), KryoBufferSimpleFeature.this.serializer.out.getCoordinateReferenceSystem())
191 88 7108 - 7198 Block org.geotools.geometry.jts.ReferencedEnvelope.<init> new org.geotools.geometry.jts.ReferencedEnvelope(g.getEnvelopeInternal(), KryoBufferSimpleFeature.this.serializer.out.getCoordinateReferenceSystem())
192 89 7246 - 7289 Apply org.geotools.api.feature.type.FeatureType.getCoordinateReferenceSystem KryoBufferSimpleFeature.this.serializer.out.getCoordinateReferenceSystem()
192 90 7223 - 7290 Apply org.geotools.geometry.jts.ReferencedEnvelope.<init> new org.geotools.geometry.jts.ReferencedEnvelope(KryoBufferSimpleFeature.this.serializer.out.getCoordinateReferenceSystem())
192 91 7223 - 7290 Block org.geotools.geometry.jts.ReferencedEnvelope.<init> new org.geotools.geometry.jts.ReferencedEnvelope(KryoBufferSimpleFeature.this.serializer.out.getCoordinateReferenceSystem())
196 92 7406 - 7438 Apply org.geotools.api.feature.simple.SimpleFeatureType.getAttributeCount KryoBufferSimpleFeature.this.serializer.out.getAttributeCount()
196 93 7374 - 7439 Apply java.util.ArrayList.<init> new java.util.ArrayList[AnyRef](KryoBufferSimpleFeature.this.serializer.out.getAttributeCount())
197 94 7452 - 7453 Literal <nosymbol> 0
198 95 7469 - 7501 Apply org.geotools.api.feature.simple.SimpleFeatureType.getAttributeCount KryoBufferSimpleFeature.this.serializer.out.getAttributeCount()
198 96 7465 - 7501 Apply scala.Int.< i.<(KryoBufferSimpleFeature.this.serializer.out.getAttributeCount())
198 100 7503 - 7503 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.while$1 while$1()
198 101 7503 - 7561 Block <nosymbol> { { attributes.add(KryoBufferSimpleFeature.this.getAttribute(i)); i = i.+(1) }; while$1() }
198 102 7458 - 7458 Literal <nosymbol> ()
198 103 7458 - 7458 Block <nosymbol> ()
199 97 7526 - 7541 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.getAttribute KryoBufferSimpleFeature.this.getAttribute(i)
199 98 7511 - 7542 Apply java.util.ArrayList.add attributes.add(KryoBufferSimpleFeature.this.getAttribute(i))
200 99 7549 - 7555 Apply scala.Int.+ i.+(1)
206 104 7652 - 7668 Apply java.lang.Object.== KryoBufferSimpleFeature.this.userData.==(null)
206 112 7648 - 7648 Literal <nosymbol> ()
206 113 7648 - 7648 Block <nosymbol> ()
207 105 7693 - 7719 Select org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserialization.withoutUserData KryoBufferSimpleFeature.this.serializer.withoutUserData
207 106 7723 - 7747 Apply java.util.HashMap.<init> new java.util.HashMap[AnyRef,AnyRef](1)
207 107 7723 - 7747 Block java.util.HashMap.<init> new java.util.HashMap[AnyRef,AnyRef](1)
207 108 7757 - 7777 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferDelegate.getUserData KryoBufferSimpleFeature.this.delegate.getUserData
207 109 7757 - 7777 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferDelegate.getUserData KryoBufferSimpleFeature.this.delegate.getUserData
207 110 7678 - 7779 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.userData_= KryoBufferSimpleFeature.this.userData_=(if (KryoBufferSimpleFeature.this.serializer.withoutUserData) new java.util.HashMap[AnyRef,AnyRef](1) else KryoBufferSimpleFeature.this.delegate.getUserData)
207 111 7678 - 7779 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.userData_= KryoBufferSimpleFeature.this.userData_=(if (KryoBufferSimpleFeature.this.serializer.withoutUserData) new java.util.HashMap[AnyRef,AnyRef](1) else KryoBufferSimpleFeature.this.delegate.getUserData)
209 114 7790 - 7798 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.userData KryoBufferSimpleFeature.this.userData
212 115 7867 - 7908 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
213 116 7972 - 8013 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
214 117 8089 - 8130 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
215 118 8208 - 8249 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
216 119 8301 - 8342 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
217 120 8396 - 8437 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
218 121 8501 - 8542 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
219 122 8595 - 8636 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
221 123 8701 - 8742 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
222 124 8808 - 8849 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
223 125 8913 - 8954 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
224 126 9022 - 9063 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
225 127 9122 - 9163 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
226 128 9219 - 9260 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
227 129 9339 - 9380 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
228 130 9431 - 9472 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
229 131 9545 - 9586 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
231 132 9625 - 9629 Literal <nosymbol> true
232 133 9664 - 9705 Throw <nosymbol> throw new scala.`package`.UnsupportedOperationException()
234 134 9743 - 9768 Literal <nosymbol> "KryoBufferSimpleFeature:"
234 135 9773 - 9774 Literal <nosymbol> ""
234 136 9768 - 9773 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.getID KryoBufferSimpleFeature.this.getID()
234 137 9741 - 9774 Apply scala.StringContext.s scala.StringContext.apply("KryoBufferSimpleFeature:", "").s(KryoBufferSimpleFeature.this.getID())
237 138 9856 - 9869 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferDelegate.id KryoBufferSimpleFeature.this.delegate.id()
244 139 10002 - 10006 Literal <nosymbol> null
246 140 10061 - 10062 Literal <nosymbol> 0
247 141 10085 - 10086 Literal <nosymbol> 0
249 142 10117 - 10123 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.IdParser.buffer IdParser.this.buffer
249 143 10125 - 10131 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.IdParser.offset IdParser.this.offset
249 144 10133 - 10139 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.IdParser.length IdParser.this.length
249 145 10111 - 10140 Apply scala.Function3.apply IdParser.this.parse.apply(IdParser.this.buffer, IdParser.this.offset, IdParser.this.length)
334 146 12201 - 12206 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3.input KryoBufferV3.this.input
334 147 12192 - 12207 Apply org.locationtech.geomesa.features.kryo.Metadata.apply kryo.this.`package`.Metadata.apply(KryoBufferV3.this.input)
334 148 12181 - 12207 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3.metadata_= KryoBufferV3.this.metadata_=(kryo.this.`package`.Metadata.apply(KryoBufferV3.this.input))
337 155 12375 - 12375 ApplyToImplicitArgs scala.Array.canBuildFrom scala.this.Array.canBuildFrom[Int]((ClassTag.Int: scala.reflect.ClassTag[Int]))
337 156 12360 - 12485 ApplyToImplicitArgs scala.collection.TraversableLike.map scala.Predef.refArrayOps[org.locationtech.geomesa.utils.geotools.Transform](transforms).map[Int, Array[Int]](((x0$1: org.locationtech.geomesa.utils.geotools.Transform) => x0$1 match { case (t @ (_: org.locationtech.geomesa.utils.geotools.Transform.PropertyTransform)) => t.i case (t @ (_: org.locationtech.geomesa.utils.geotools.Transform.RenameTransform)) => t.i case _ => -1 }))(scala.this.Array.canBuildFrom[Int]((ClassTag.Int: scala.reflect.ClassTag[Int])))
338 149 12414 - 12417 Select org.locationtech.geomesa.utils.geotools.Transform.PropertyTransform.i t.i
338 150 12414 - 12417 Block org.locationtech.geomesa.utils.geotools.Transform.PropertyTransform.i t.i
339 151 12453 - 12456 Select org.locationtech.geomesa.utils.geotools.Transform.RenameTransform.i t.i
339 152 12453 - 12456 Block org.locationtech.geomesa.utils.geotools.Transform.RenameTransform.i t.i
340 153 12475 - 12477 Literal <nosymbol> -1
340 154 12475 - 12477 Block <nosymbol> -1
342 157 12496 - 12516 Apply scala.collection.SeqLike.contains scala.Predef.intArrayOps(indices).contains[Int](-1)
343 158 12589 - 12607 Select org.locationtech.geomesa.features.HasEncodingOptions.options KryoBufferV3.this.serializer.options
343 159 12542 - 12608 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.ReserializeTransformer.<init> new KryoBufferSimpleFeature.this.ReserializeTransformer(schema, transforms, KryoBufferV3.this.serializer.options)
343 160 12528 - 12608 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3.transformer_= KryoBufferV3.this.transformer_=(new KryoBufferSimpleFeature.this.ReserializeTransformer(schema, transforms, KryoBufferV3.this.serializer.options))
343 161 12528 - 12608 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3.transformer_= KryoBufferV3.this.transformer_=(new KryoBufferSimpleFeature.this.ReserializeTransformer(schema, transforms, KryoBufferV3.this.serializer.options))
345 162 12646 - 12676 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3.BinaryTransformer.<init> new KryoBufferV3.this.BinaryTransformer(indices)
345 163 12632 - 12676 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3.transformer_= KryoBufferV3.this.transformer_=(new KryoBufferV3.this.BinaryTransformer(indices))
345 164 12632 - 12676 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3.transformer_= KryoBufferV3.this.transformer_=(new KryoBufferV3.this.BinaryTransformer(indices))
350 165 12732 - 12756 Apply org.locationtech.geomesa.features.kryo.Metadata.setIdPosition KryoBufferV3.this.metadata.setIdPosition()
351 166 12763 - 12781 Apply com.esotericsoftware.kryo.io.Input.readString KryoBufferV3.this.input.readString()
355 167 12862 - 12876 Select org.locationtech.geomesa.features.kryo.Metadata.count KryoBufferV3.this.metadata.count
355 168 12880 - 12910 Apply org.locationtech.geomesa.features.kryo.impl.IntBitSet.contains KryoBufferV3.this.metadata.nulls.contains(index)
355 169 12853 - 12910 Apply scala.Boolean.|| index.>=(KryoBufferV3.this.metadata.count).||(KryoBufferV3.this.metadata.nulls.contains(index))
355 170 12914 - 12918 Literal <nosymbol> null
355 171 12914 - 12918 Block <nosymbol> null
355 175 12926 - 13018 Block <nosymbol> { KryoBufferV3.this.metadata.setPosition(index); KryoBufferV3.this.serializer.readers.apply(index).apply(KryoBufferV3.this.input) }
356 172 12936 - 12963 Apply org.locationtech.geomesa.features.kryo.Metadata.setPosition KryoBufferV3.this.metadata.setPosition(index)
357 173 13004 - 13009 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3.input KryoBufferV3.this.input
357 174 12972 - 13010 Apply org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserialization.KryoAttributeReader.apply KryoBufferV3.this.serializer.readers.apply(index).apply(KryoBufferV3.this.input)
362 176 13096 - 13126 Apply org.locationtech.geomesa.features.kryo.Metadata.setUserDataPosition KryoBufferV3.this.metadata.setUserDataPosition()
363 177 13171 - 13176 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3.input KryoBufferV3.this.input
363 178 13133 - 13177 Apply org.locationtech.geomesa.features.kryo.serialization.KryoUserDataSerialization.deserialize org.locationtech.geomesa.features.kryo.serialization.KryoUserDataSerialization.deserialize(KryoBufferV3.this.input)
367 179 13257 - 13271 Select org.locationtech.geomesa.features.kryo.Metadata.count KryoBufferV3.this.metadata.count
367 180 13275 - 13305 Apply org.locationtech.geomesa.features.kryo.impl.IntBitSet.contains KryoBufferV3.this.metadata.nulls.contains(index)
367 181 13248 - 13305 Apply scala.Boolean.|| index.>=(KryoBufferV3.this.metadata.count).||(KryoBufferV3.this.metadata.nulls.contains(index))
367 182 13309 - 13311 Literal <nosymbol> 0L
367 183 13309 - 13311 Block <nosymbol> 0L
367 188 13319 - 13400 Block <nosymbol> { KryoBufferV3.this.metadata.setPosition(index); scala.Predef.Long2long(org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserialization.KryoLongReader.apply(KryoBufferV3.this.input)) }
368 184 13329 - 13356 Apply org.locationtech.geomesa.features.kryo.Metadata.setPosition KryoBufferV3.this.metadata.setPosition(index)
369 185 13386 - 13391 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3.input KryoBufferV3.this.input
369 186 13365 - 13392 Apply org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserialization.KryoLongReader.apply org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserialization.KryoLongReader.apply(KryoBufferV3.this.input)
369 187 13365 - 13392 ApplyImplicitView scala.Predef.Long2long scala.Predef.Long2long(org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserialization.KryoLongReader.apply(KryoBufferV3.this.input))
374 189 13484 - 13498 Select org.locationtech.geomesa.features.kryo.Metadata.count KryoBufferV3.this.metadata.count
374 190 13502 - 13532 Apply org.locationtech.geomesa.features.kryo.impl.IntBitSet.contains KryoBufferV3.this.metadata.nulls.contains(index)
374 191 13475 - 13532 Apply scala.Boolean.|| index.>=(KryoBufferV3.this.metadata.count).||(KryoBufferV3.this.metadata.nulls.contains(index))
374 192 13536 - 13540 Select scala.None scala.None
374 193 13536 - 13540 Block scala.None scala.None
374 197 13548 - 13613 Block <nosymbol> { KryoBufferV3.this.metadata.setPosition(index); scala.Some.apply[com.esotericsoftware.kryo.io.Input](KryoBufferV3.this.input) }
375 194 13558 - 13585 Apply org.locationtech.geomesa.features.kryo.Metadata.setPosition KryoBufferV3.this.metadata.setPosition(index)
376 195 13599 - 13604 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3.input KryoBufferV3.this.input
376 196 13594 - 13605 Apply scala.Some.apply scala.Some.apply[com.esotericsoftware.kryo.io.Input](KryoBufferV3.this.input)
380 198 13688 - 13719 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.Transformer.transform KryoBufferV3.this.transformer.transform(original)
385 199 13952 - 13966 Select scala.Array.length BinaryTransformer.this.indices.length
385 200 13928 - 13967 ApplyToImplicitArgs scala.Array.ofDim scala.Array.ofDim[(Int, Int)](BinaryTransformer.this.indices.length)((ClassTag.apply[(Int, Int)](classOf[scala.Tuple2]): scala.reflect.ClassTag[(Int, Int)]))
389 201 14114 - 14195 Apply scala.Int.+ KryoBufferV3.this.metadata.size.*(BinaryTransformer.this.indices.length.+(1)).+(org.locationtech.geomesa.features.kryo.impl.IntBitSet.size(BinaryTransformer.this.indices.length).*(4)).+(4)
390 202 14217 - 14237 Select org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserialization.withoutId KryoBufferV3.this.serializer.withoutId
390 203 14241 - 14245 Literal <nosymbol> null
390 204 14241 - 14245 Block <nosymbol> null
390 210 14253 - 14421 Block <nosymbol> { val pos: Int = KryoBufferV3.this.metadata.setIdPosition().+(KryoBufferV3.this.metadata.offset); val id: String = KryoBufferV3.this.input.readString(); length = length.+(KryoBufferV3.this.input.position().-(pos)); id }
391 205 14302 - 14317 Select org.locationtech.geomesa.features.kryo.Metadata.offset KryoBufferV3.this.metadata.offset
391 206 14275 - 14317 Apply scala.Int.+ KryoBufferV3.this.metadata.setIdPosition().+(KryoBufferV3.this.metadata.offset)
392 207 14337 - 14355 Apply com.esotericsoftware.kryo.io.Input.readString KryoBufferV3.this.input.readString()
393 208 14376 - 14398 Apply scala.Int.- KryoBufferV3.this.input.position().-(pos)
393 209 14366 - 14398 Apply scala.Int.+ length.+(KryoBufferV3.this.input.position().-(pos))
397 211 14453 - 14467 Select scala.Array.length BinaryTransformer.this.indices.length
397 212 14443 - 14468 Apply org.locationtech.geomesa.features.kryo.impl.IntBitSet.apply org.locationtech.geomesa.features.kryo.impl.IntBitSet.apply(BinaryTransformer.this.indices.length)
402 213 14605 - 14606 Literal <nosymbol> 0
403 214 14626 - 14640 Select scala.Array.length BinaryTransformer.this.indices.length
403 215 14622 - 14640 Apply scala.Int.< i.<(BinaryTransformer.this.indices.length)
403 230 14642 - 14642 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3.BinaryTransformer.while$2 while$2()
403 231 14642 - 15143 Block <nosymbol> { { val index: Int = BinaryTransformer.this.indices.apply(i); if (index.>=(KryoBufferV3.this.metadata.count).||(KryoBufferV3.this.metadata.nulls.contains(index))) nulls.add(i) else { val pos: Int = KryoBufferV3.this.metadata.setPosition(index); val len: Int = KryoBufferV3.this.metadata.setPosition(index.+(1)).-(pos); length = length.+(len); BinaryTransformer.this.positionsAndLengths.update(i, scala.Tuple2.apply[Int, Int](KryoBufferV3.this.metadata.offset.+(pos), len)) }; i = i.+(1) }; while$2() }
403 232 14615 - 14615 Literal <nosymbol> ()
403 233 14615 - 14615 Block <nosymbol> ()
404 216 14666 - 14676 Apply scala.Array.apply BinaryTransformer.this.indices.apply(i)
405 217 14754 - 14768 Select org.locationtech.geomesa.features.kryo.Metadata.count KryoBufferV3.this.metadata.count
405 218 14772 - 14802 Apply org.locationtech.geomesa.features.kryo.impl.IntBitSet.contains KryoBufferV3.this.metadata.nulls.contains(index)
405 219 14745 - 14802 Apply scala.Boolean.|| index.>=(KryoBufferV3.this.metadata.count).||(KryoBufferV3.this.metadata.nulls.contains(index))
405 220 14806 - 14818 Apply org.locationtech.geomesa.features.kryo.impl.IntBitSet.add nulls.add(i)
405 221 14806 - 14818 Block org.locationtech.geomesa.features.kryo.impl.IntBitSet.add nulls.add(i)
405 228 14826 - 15116 Block <nosymbol> { val pos: Int = KryoBufferV3.this.metadata.setPosition(index); val len: Int = KryoBufferV3.this.metadata.setPosition(index.+(1)).-(pos); length = length.+(len); BinaryTransformer.this.positionsAndLengths.update(i, scala.Tuple2.apply[Int, Int](KryoBufferV3.this.metadata.offset.+(pos), len)) }
407 222 14925 - 14952 Apply org.locationtech.geomesa.features.kryo.Metadata.setPosition KryoBufferV3.this.metadata.setPosition(index)
408 223 14975 - 15012 Apply scala.Int.- KryoBufferV3.this.metadata.setPosition(index.+(1)).-(pos)
409 224 15025 - 15038 Apply scala.Int.+ length.+(len)
410 225 15077 - 15098 Apply scala.Int.+ KryoBufferV3.this.metadata.offset.+(pos)
410 226 15076 - 15104 Apply scala.Tuple2.apply scala.Tuple2.apply[Int, Int](KryoBufferV3.this.metadata.offset.+(pos), len)
410 227 15051 - 15104 Apply scala.Array.update BinaryTransformer.this.positionsAndLengths.update(i, scala.Tuple2.apply[Int, Int](KryoBufferV3.this.metadata.offset.+(pos), len))
412 229 15127 - 15133 Apply scala.Int.+ i.+(1)
417 234 15324 - 15339 Apply com.esotericsoftware.kryo.io.Input.getBuffer KryoBufferV3.this.input.getBuffer()
419 235 15362 - 15387 ApplyToImplicitArgs scala.Array.ofDim scala.Array.ofDim[Byte](length)((ClassTag.Byte: scala.reflect.ClassTag[Byte]))
420 236 15409 - 15435 Apply com.esotericsoftware.kryo.io.Output.<init> new com.esotericsoftware.kryo.io.Output(result, length)
421 237 15461 - 15491 Select org.locationtech.geomesa.features.kryo.KryoFeatureSerializer.Version3 KryoFeatureSerializer.Version3
421 238 15444 - 15492 Apply com.esotericsoftware.kryo.io.Output.writeByte output.writeByte(KryoFeatureSerializer.Version3)
422 239 15519 - 15533 Select scala.Array.length BinaryTransformer.this.indices.length
422 240 15501 - 15534 Apply com.esotericsoftware.kryo.io.Output.writeShort output.writeShort(BinaryTransformer.this.indices.length)
423 241 15590 - 15603 Select org.locationtech.geomesa.features.kryo.Metadata.size KryoBufferV3.this.metadata.size
423 242 15577 - 15604 Apply com.esotericsoftware.kryo.io.Output.write output.write(KryoBufferV3.this.metadata.size)
424 243 15617 - 15618 Literal <nosymbol> 0
425 244 15638 - 15664 Select scala.Array.length BinaryTransformer.this.positionsAndLengths.length
425 245 15634 - 15664 Apply scala.Int.< i.<(BinaryTransformer.this.positionsAndLengths.length)
425 262 15666 - 15666 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV3.BinaryTransformer.while$3 while$3()
425 263 15666 - 16136 Block <nosymbol> { { if (KryoBufferV3.this.metadata.size.==(2)) output.writeShort(resultCursor.-(4)) else output.writeInt(resultCursor.-(4)); if (nulls.contains(i).unary_!) { <synthetic> <artifact> private[this] val x$4: (Int, Int) = (BinaryTransformer.this.positionsAndLengths.apply(i): (Int, Int) @unchecked) match { case (_1: Int, _2: Int)(Int, Int)((pos @ _), (len @ _)) => scala.Tuple2.apply[Int, Int](pos, len) }; val pos: Int = x$4._1; val len: Int = x$4._2; java.lang.System.arraycopy(buf, pos, result, resultCursor, len); resultCursor = resultCursor.+(len) } else (); i = i.+(1) }; while$3() }
425 264 15627 - 15627 Literal <nosymbol> ()
425 265 15627 - 15627 Block <nosymbol> ()
427 246 15765 - 15783 Apply scala.Int.== KryoBufferV3.this.metadata.size.==(2)
428 247 15817 - 15833 Apply scala.Int.- resultCursor.-(4)
428 248 15799 - 15834 Apply com.esotericsoftware.kryo.io.Output.writeShort output.writeShort(resultCursor.-(4))
428 249 15799 - 15834 Block com.esotericsoftware.kryo.io.Output.writeShort output.writeShort(resultCursor.-(4))
430 250 15882 - 15898 Apply scala.Int.- resultCursor.-(4)
430 251 15866 - 15899 Apply com.esotericsoftware.kryo.io.Output.writeInt output.writeInt(resultCursor.-(4))
430 252 15866 - 15899 Block com.esotericsoftware.kryo.io.Output.writeInt output.writeInt(resultCursor.-(4))
432 253 15926 - 15944 Select scala.Boolean.unary_! nulls.contains(i).unary_!
432 258 15946 - 16109 Block <nosymbol> { <synthetic> <artifact> private[this] val x$4: (Int, Int) = (BinaryTransformer.this.positionsAndLengths.apply(i): (Int, Int) @unchecked) match { case (_1: Int, _2: Int)(Int, Int)((pos @ _), (len @ _)) => scala.Tuple2.apply[Int, Int](pos, len) }; val pos: Int = x$4._1; val len: Int = x$4._2; java.lang.System.arraycopy(buf, pos, result, resultCursor, len); resultCursor = resultCursor.+(len) }
432 259 15922 - 15922 Literal <nosymbol> ()
432 260 15922 - 15922 Block <nosymbol> ()
433 254 15965 - 15965 Select scala.Tuple2._1 x$4._1
433 255 15970 - 15970 Select scala.Tuple2._2 x$4._2
434 256 16012 - 16065 Apply java.lang.System.arraycopy java.lang.System.arraycopy(buf, pos, result, resultCursor, len)
435 257 16078 - 16097 Apply scala.Int.+ resultCursor.+(len)
437 261 16120 - 16126 Apply scala.Int.+ i.+(1)
440 266 16177 - 16195 Apply scala.Int.== KryoBufferV3.this.metadata.size.==(2)
441 267 16209 - 16240 Apply com.esotericsoftware.kryo.io.Output.writeShort output.writeShort(resultCursor)
441 268 16209 - 16240 Block com.esotericsoftware.kryo.io.Output.writeShort output.writeShort(resultCursor)
443 269 16268 - 16297 Apply com.esotericsoftware.kryo.io.Output.writeInt output.writeInt(resultCursor)
443 270 16268 - 16297 Block com.esotericsoftware.kryo.io.Output.writeInt output.writeInt(resultCursor)
449 271 16372 - 16395 Apply org.locationtech.geomesa.features.kryo.impl.IntBitSet.serialize nulls.serialize(output)
452 272 16473 - 16483 Apply java.lang.Object.!= id.!=(null)
452 275 16469 - 16469 Literal <nosymbol> ()
452 276 16469 - 16469 Block <nosymbol> ()
453 273 16497 - 16519 Apply com.esotericsoftware.kryo.io.Output.writeString output.writeString(id)
453 274 16497 - 16519 Block com.esotericsoftware.kryo.io.Output.writeString output.writeString(id)
469 277 16838 - 16870 Apply org.geotools.api.feature.simple.SimpleFeatureType.getAttributeCount KryoBufferV2.this.serializer.out.getAttributeCount()
469 278 16821 - 16871 ApplyToImplicitArgs scala.Array.ofDim scala.Array.ofDim[Int](KryoBufferV2.this.serializer.out.getAttributeCount())((ClassTag.Int: scala.reflect.ClassTag[Int]))
470 279 16902 - 16904 Literal <nosymbol> -1
471 280 16943 - 16945 Literal <nosymbol> -1
472 281 16991 - 16996 Literal <nosymbol> false
473 282 17035 - 17037 Literal <nosymbol> -1
480 283 17220 - 17240 Apply scala.Int.- KryoBufferV2.this.input.position().-(1)
480 284 17211 - 17240 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.offset_= KryoBufferV2.this.offset_=(KryoBufferV2.this.input.position().-(1))
481 285 17312 - 17327 Apply com.esotericsoftware.kryo.io.Input.readInt KryoBufferV2.this.input.readInt()
481 286 17303 - 17327 Apply scala.Int.+ KryoBufferV2.this.offset.+(KryoBufferV2.this.input.readInt())
481 287 17286 - 17327 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.startOfOffsets_= KryoBufferV2.this.startOfOffsets_=(KryoBufferV2.this.offset.+(KryoBufferV2.this.input.readInt()))
482 288 17352 - 17366 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.startOfOffsets KryoBufferV2.this.startOfOffsets
482 289 17334 - 17367 Apply com.esotericsoftware.kryo.io.Input.setPosition KryoBufferV2.this.input.setPosition(KryoBufferV2.this.startOfOffsets)
483 290 17406 - 17407 Literal <nosymbol> 0
484 291 17425 - 17439 Select scala.Array.length KryoBufferV2.this.offsets.length
484 292 17460 - 17471 Apply com.esotericsoftware.kryo.io.Input.limit KryoBufferV2.this.input.limit()
484 293 17443 - 17471 Apply scala.Int.< KryoBufferV2.this.input.position().<(KryoBufferV2.this.input.limit())
484 294 17421 - 17471 Apply scala.Boolean.&& i.<(KryoBufferV2.this.offsets.length).&&(KryoBufferV2.this.input.position().<(KryoBufferV2.this.input.limit()))
484 299 17473 - 17473 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.while$4 while$4()
484 300 17473 - 17547 Block <nosymbol> { { KryoBufferV2.this.offsets.update(i, KryoBufferV2.this.offset.+(KryoBufferV2.this.input.readInt(true))); i = i.+(1) }; while$4() }
484 301 17414 - 17414 Literal <nosymbol> ()
484 302 17414 - 17414 Block <nosymbol> ()
485 295 17505 - 17524 Apply com.esotericsoftware.kryo.io.Input.readInt KryoBufferV2.this.input.readInt(true)
485 296 17496 - 17524 Apply scala.Int.+ KryoBufferV2.this.offset.+(KryoBufferV2.this.input.readInt(true))
485 297 17483 - 17524 Apply scala.Array.update KryoBufferV2.this.offsets.update(i, KryoBufferV2.this.offset.+(KryoBufferV2.this.input.readInt(true)))
486 298 17533 - 17539 Apply scala.Int.+ i.+(1)
488 303 17562 - 17576 Select scala.Array.length KryoBufferV2.this.offsets.length
488 304 17558 - 17576 Apply scala.Int.< i.<(KryoBufferV2.this.offsets.length)
488 315 17578 - 17772 Block <nosymbol> { KryoBufferV2.this.missingAttributes_=(true); while$5(){ if ({ { KryoBufferV2.this.offsets.update(i, -1); i = i.+(1) }; i.<(KryoBufferV2.this.offsets.length) }) { (); while$5() } else () } }
490 305 17671 - 17695 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.missingAttributes_= KryoBufferV2.this.missingAttributes_=(true)
491 306 17714 - 17729 Apply scala.Array.update KryoBufferV2.this.offsets.update(i, -1)
491 307 17731 - 17737 Apply scala.Int.+ i.+(1)
491 308 17745 - 17759 Select scala.Array.length KryoBufferV2.this.offsets.length
491 309 17741 - 17759 Apply scala.Int.< i.<(KryoBufferV2.this.offsets.length)
491 310 17762 - 17764 Literal <nosymbol> ()
491 311 17762 - 17762 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.while$5 while$5()
491 312 17762 - 17764 Block <nosymbol> { (); while$5() }
491 313 17704 - 17704 Literal <nosymbol> ()
491 314 17704 - 17704 Block <nosymbol> ()
493 316 17788 - 17813 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.missingAttributes_= KryoBufferV2.this.missingAttributes_=(false)
493 317 17788 - 17813 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.missingAttributes_= KryoBufferV2.this.missingAttributes_=(false)
495 318 17845 - 17861 Apply com.esotericsoftware.kryo.io.Input.position KryoBufferV2.this.input.position()
495 319 17828 - 17861 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.userDataOffset_= KryoBufferV2.this.userDataOffset_=(KryoBufferV2.this.input.position())
499 326 18002 - 18002 ApplyToImplicitArgs scala.Array.canBuildFrom scala.this.Array.canBuildFrom[Int]((ClassTag.Int: scala.reflect.ClassTag[Int]))
499 327 17987 - 18112 ApplyToImplicitArgs scala.collection.TraversableLike.map scala.Predef.refArrayOps[org.locationtech.geomesa.utils.geotools.Transform](transforms).map[Int, Array[Int]](((x0$1: org.locationtech.geomesa.utils.geotools.Transform) => x0$1 match { case (t @ (_: org.locationtech.geomesa.utils.geotools.Transform.PropertyTransform)) => t.i case (t @ (_: org.locationtech.geomesa.utils.geotools.Transform.RenameTransform)) => t.i case _ => -1 }))(scala.this.Array.canBuildFrom[Int]((ClassTag.Int: scala.reflect.ClassTag[Int])))
500 320 18041 - 18044 Select org.locationtech.geomesa.utils.geotools.Transform.PropertyTransform.i t.i
500 321 18041 - 18044 Block org.locationtech.geomesa.utils.geotools.Transform.PropertyTransform.i t.i
501 322 18080 - 18083 Select org.locationtech.geomesa.utils.geotools.Transform.RenameTransform.i t.i
501 323 18080 - 18083 Block org.locationtech.geomesa.utils.geotools.Transform.RenameTransform.i t.i
502 324 18102 - 18104 Literal <nosymbol> -1
502 325 18102 - 18104 Block <nosymbol> -1
507 328 18390 - 18408 Select org.locationtech.geomesa.features.HasEncodingOptions.options KryoBufferV2.this.serializer.options
507 329 18343 - 18409 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.ReserializeTransformer.<init> new KryoBufferSimpleFeature.this.ReserializeTransformer(schema, transforms, KryoBufferV2.this.serializer.options)
507 330 18320 - 18409 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.reserializeTransform_= KryoBufferV2.this.reserializeTransform_=(new KryoBufferSimpleFeature.this.ReserializeTransformer(schema, transforms, KryoBufferV2.this.serializer.options))
510 338 18565 - 18701 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.binaryTransform_= KryoBufferV2.this.binaryTransform_=(if (scala.Predef.intArrayOps(indices).contains[Int](-1)) KryoBufferV2.this.reserializeTransform else new KryoBufferV2.this.BinaryTransformerV2(KryoBufferV2.this.input, indices, KryoBufferV2.this.offsets))
511 331 18597 - 18617 Apply scala.collection.SeqLike.contains scala.Predef.intArrayOps(indices).contains[Int](-1)
511 332 18621 - 18641 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.reserializeTransform KryoBufferV2.this.reserializeTransform
511 333 18621 - 18641 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.reserializeTransform KryoBufferV2.this.reserializeTransform
511 334 18675 - 18680 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.input KryoBufferV2.this.input
511 335 18691 - 18698 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.offsets KryoBufferV2.this.offsets
511 336 18651 - 18699 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.BinaryTransformerV2.<init> new KryoBufferV2.this.BinaryTransformerV2(KryoBufferV2.this.input, indices, KryoBufferV2.this.offsets)
511 337 18651 - 18699 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.BinaryTransformerV2.<init> new KryoBufferV2.this.BinaryTransformerV2(KryoBufferV2.this.input, indices, KryoBufferV2.this.offsets)
515 339 18749 - 18769 Apply com.esotericsoftware.kryo.io.Input.setPosition KryoBufferV2.this.input.setPosition(5)
516 340 18776 - 18794 Apply com.esotericsoftware.kryo.io.Input.readString KryoBufferV2.this.input.readString()
520 341 18875 - 18889 Apply scala.Array.apply KryoBufferV2.this.offsets.apply(index)
521 342 18900 - 18912 Apply scala.Int.== offset.==(-1)
521 343 18916 - 18920 Literal <nosymbol> null
521 344 18916 - 18920 Block <nosymbol> null
521 348 18928 - 19014 Block <nosymbol> { KryoBufferV2.this.input.setPosition(offset); KryoBufferV2.this.serializer.readersV2.apply(index).apply(KryoBufferV2.this.input) }
522 345 18938 - 18963 Apply com.esotericsoftware.kryo.io.Input.setPosition KryoBufferV2.this.input.setPosition(offset)
523 346 19000 - 19005 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.input KryoBufferV2.this.input
523 347 18972 - 19006 Apply scala.Function1.apply KryoBufferV2.this.serializer.readersV2.apply(index).apply(KryoBufferV2.this.input)
528 349 19110 - 19124 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.userDataOffset KryoBufferV2.this.userDataOffset
528 350 19092 - 19125 Apply com.esotericsoftware.kryo.io.Input.setPosition KryoBufferV2.this.input.setPosition(KryoBufferV2.this.userDataOffset)
529 351 19170 - 19175 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.input KryoBufferV2.this.input
529 352 19132 - 19176 Apply org.locationtech.geomesa.features.kryo.serialization.KryoUserDataSerialization.deserialize org.locationtech.geomesa.features.kryo.serialization.KryoUserDataSerialization.deserialize(KryoBufferV2.this.input)
533 353 19256 - 19270 Apply scala.Array.apply KryoBufferV2.this.offsets.apply(index)
534 354 19281 - 19293 Apply scala.Int.== offset.==(-1)
534 355 19297 - 19299 Literal <nosymbol> 0L
534 356 19297 - 19299 Block <nosymbol> 0L
534 361 19307 - 19411 Block <nosymbol> { KryoBufferV2.this.input.setPosition(offset); scala.Predef.Long2long(org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserializationV2.LongReader.apply(KryoBufferV2.this.input)) }
535 357 19317 - 19342 Apply com.esotericsoftware.kryo.io.Input.setPosition KryoBufferV2.this.input.setPosition(offset)
536 358 19397 - 19402 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.input KryoBufferV2.this.input
536 359 19351 - 19403 Apply org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserializationV2.LongReader.apply org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserializationV2.LongReader.apply(KryoBufferV2.this.input)
536 360 19351 - 19403 ApplyImplicitView scala.Predef.Long2long scala.Predef.Long2long(org.locationtech.geomesa.features.kryo.impl.KryoFeatureDeserializationV2.LongReader.apply(KryoBufferV2.this.input))
541 362 19495 - 19509 Apply scala.Array.apply KryoBufferV2.this.offsets.apply(index)
542 363 19520 - 19532 Apply scala.Int.== offset.==(-1)
542 364 19536 - 19540 Select scala.None scala.None
542 365 19536 - 19540 Block scala.None scala.None
542 369 19548 - 19611 Block <nosymbol> { KryoBufferV2.this.input.setPosition(offset); scala.Some.apply[com.esotericsoftware.kryo.io.Input](KryoBufferV2.this.input) }
543 366 19558 - 19583 Apply com.esotericsoftware.kryo.io.Input.setPosition KryoBufferV2.this.input.setPosition(offset)
544 367 19597 - 19602 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.input KryoBufferV2.this.input
544 368 19592 - 19603 Apply scala.Some.apply scala.Some.apply[com.esotericsoftware.kryo.io.Input](KryoBufferV2.this.input)
550 370 19824 - 19841 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.missingAttributes KryoBufferV2.this.missingAttributes
550 371 19845 - 19865 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.reserializeTransform KryoBufferV2.this.reserializeTransform
550 372 19845 - 19865 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.reserializeTransform KryoBufferV2.this.reserializeTransform
550 373 19875 - 19890 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.binaryTransform KryoBufferV2.this.binaryTransform
550 374 19875 - 19890 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.binaryTransform KryoBufferV2.this.binaryTransform
551 375 19899 - 19930 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.Transformer.transform transformer.transform(original)
564 376 20386 - 20400 Select scala.Array.length BinaryTransformerV2.this.indices.length
564 377 20363 - 20401 ApplyToImplicitArgs scala.Array.ofDim scala.Array.ofDim[(Int, Int)](BinaryTransformerV2.this.indices.length)((ClassTag.apply[(Int, Int)](classOf[scala.Tuple2]): scala.reflect.ClassTag[(Int, Int)]))
569 378 20653 - 20668 Apply com.esotericsoftware.kryo.io.Input.getBuffer BinaryTransformerV2.this.input.getBuffer()
570 379 20698 - 20699 Literal <nosymbol> 0
570 380 20703 - 20709 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.offset KryoBufferV2.this.offset
570 381 20690 - 20709 Apply scala.Int.- BinaryTransformerV2.this.offsets.apply(0).-(KryoBufferV2.this.offset)
571 382 20770 - 20771 Literal <nosymbol> 0
572 383 20793 - 20823 Select scala.Array.length BinaryTransformerV2.this.mutableOffsetsAndLength.length
572 384 20787 - 20823 Apply scala.Int.< idx.<(BinaryTransformerV2.this.mutableOffsetsAndLength.length)
572 400 20825 - 20825 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.BinaryTransformerV2.while$6 while$6()
572 401 20825 - 21072 Block <nosymbol> { { val i: Int = BinaryTransformerV2.this.indices.apply(idx); val el: Int = if (i.<(BinaryTransformerV2.this.offsets.length.-(1))) BinaryTransformerV2.this.offsets.apply(i.+(1)) else KryoBufferV2.this.startOfOffsets.-(BinaryTransformerV2.this.offsets.apply(i)); length = length.+(el); BinaryTransformerV2.this.mutableOffsetsAndLength.update(idx, scala.Tuple2.apply[Int, Int](BinaryTransformerV2.this.offsets.apply(i), el)); idx = idx.+(1) }; while$6() }
572 402 20780 - 20780 Literal <nosymbol> ()
572 403 20780 - 20780 Block <nosymbol> ()
573 385 20845 - 20857 Apply scala.Array.apply BinaryTransformerV2.this.indices.apply(idx)
574 386 20886 - 20904 Apply scala.Int.- BinaryTransformerV2.this.offsets.length.-(1)
574 387 20882 - 20904 Apply scala.Int.< i.<(BinaryTransformerV2.this.offsets.length.-(1))
574 388 20916 - 20921 Apply scala.Int.+ i.+(1)
574 389 20908 - 20922 Apply scala.Array.apply BinaryTransformerV2.this.offsets.apply(i.+(1))
574 390 20908 - 20922 Block scala.Array.apply BinaryTransformerV2.this.offsets.apply(i.+(1))
574 391 20932 - 20946 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.startOfOffsets KryoBufferV2.this.startOfOffsets
574 392 20932 - 20946 Block org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.startOfOffsets KryoBufferV2.this.startOfOffsets
574 393 20952 - 20962 Apply scala.Array.apply BinaryTransformerV2.this.offsets.apply(i)
574 394 20877 - 20962 Apply scala.Int.- if (i.<(BinaryTransformerV2.this.offsets.length.-(1))) BinaryTransformerV2.this.offsets.apply(i.+(1)) else KryoBufferV2.this.startOfOffsets.-(BinaryTransformerV2.this.offsets.apply(i))
575 395 20973 - 20985 Apply scala.Int.+ length.+(el)
576 396 21028 - 21038 Apply scala.Array.apply BinaryTransformerV2.this.offsets.apply(i)
576 397 21027 - 21043 Apply scala.Tuple2.apply scala.Tuple2.apply[Int, Int](BinaryTransformerV2.this.offsets.apply(i), el)
576 398 20996 - 21043 Apply scala.Array.update BinaryTransformerV2.this.mutableOffsetsAndLength.update(idx, scala.Tuple2.apply[Int, Int](BinaryTransformerV2.this.offsets.apply(i), el))
577 399 21054 - 21062 Apply scala.Int.+ idx.+(1)
580 404 21092 - 21117 ApplyToImplicitArgs scala.Array.ofDim scala.Array.ofDim[Byte](length)((ClassTag.Byte: scala.reflect.ClassTag[Byte]))
582 405 21196 - 21197 Literal <nosymbol> 0
582 406 21201 - 21207 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.offset KryoBufferV2.this.offset
582 407 21188 - 21207 Apply scala.Int.- BinaryTransformerV2.this.offsets.apply(0).-(KryoBufferV2.this.offset)
583 408 21238 - 21244 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.offset KryoBufferV2.this.offset
583 409 21251 - 21252 Literal <nosymbol> 0
583 410 21216 - 21261 Apply java.lang.System.arraycopy java.lang.System.arraycopy(buf, KryoBufferV2.this.offset, dst, 0, dstPos)
584 411 21270 - 21293 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.KryoBufferV2.BinaryTransformerV2.mutableOffsetsAndLength BinaryTransformerV2.this.mutableOffsetsAndLength
584 414 21316 - 21391 Block <nosymbol> { java.lang.System.arraycopy(buf, o, dst, dstPos, l); dstPos = dstPos.+(l) }
584 415 21270 - 21401 Apply scala.collection.IndexedSeqOptimized.foreach scala.Predef.refArrayOps[(Int, Int)](BinaryTransformerV2.this.mutableOffsetsAndLength).foreach[Unit](((x0$1: (Int, Int)) => x0$1 match { case (_1: Int, _2: Int)(Int, Int)((o @ _), (l @ _)) => { java.lang.System.arraycopy(buf, o, dst, dstPos, l); dstPos = dstPos.+(l) } }))
585 412 21329 - 21369 Apply java.lang.System.arraycopy java.lang.System.arraycopy(buf, o, dst, dstPos, l)
586 413 21380 - 21391 Apply scala.Int.+ dstPos.+(l)
608 416 22052 - 22058 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.ReserializeTransformer.schema ReserializeTransformer.this.schema
608 417 22060 - 22067 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.ReserializeTransformer.options ReserializeTransformer.this.options
608 418 22030 - 22068 Apply org.locationtech.geomesa.features.kryo.KryoFeatureSerializer.apply KryoFeatureSerializer.apply(ReserializeTransformer.this.schema, ReserializeTransformer.this.options)
609 419 22113 - 22119 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.ReserializeTransformer.schema ReserializeTransformer.this.schema
609 420 22121 - 22123 Literal <nosymbol> ""
609 421 22090 - 22124 Apply org.locationtech.geomesa.features.ScalaSimpleFeature.<init> new org.locationtech.geomesa.features.ScalaSimpleFeature(ReserializeTransformer.this.schema, "", features.this.ScalaSimpleFeature.<init>$default$3, features.this.ScalaSimpleFeature.<init>$default$4)
612 422 22210 - 22224 Apply org.geotools.api.feature.simple.SimpleFeature.getID original.getID()
612 423 22201 - 22225 Apply org.locationtech.geomesa.features.AbstractSimpleFeature.AbstractMutableSimpleFeature.setId ReserializeTransformer.this.sf.setId(original.getID())
613 424 22240 - 22241 Literal <nosymbol> 0
614 425 22259 - 22276 Select scala.Array.length ReserializeTransformer.this.transforms.length
614 426 22255 - 22276 Apply scala.Int.< i.<(ReserializeTransformer.this.transforms.length)
614 430 22278 - 22278 Apply org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.ReserializeTransformer.while$7 while$7()
614 431 22278 - 22363 Block <nosymbol> { { ReserializeTransformer.this.sf.setAttribute(i, ReserializeTransformer.this.transforms.apply(i).evaluate(original)); i = i.+(1) }; while$7() }
614 432 22248 - 22248 Literal <nosymbol> ()
614 433 22248 - 22248 Block <nosymbol> ()
615 427 22307 - 22339 Apply org.locationtech.geomesa.utils.geotools.Transform.evaluate ReserializeTransformer.this.transforms.apply(i).evaluate(original)
615 428 22288 - 22340 Apply org.locationtech.geomesa.features.AbstractSimpleFeature.AbstractMutableSimpleFeature.setAttribute ReserializeTransformer.this.sf.setAttribute(i, ReserializeTransformer.this.transforms.apply(i).evaluate(original))
616 429 22349 - 22355 Apply scala.Int.+ i.+(1)
618 434 22391 - 22393 Select org.locationtech.geomesa.features.kryo.KryoBufferSimpleFeature.ReserializeTransformer.sf ReserializeTransformer.this.sf
618 435 22370 - 22394 Apply org.locationtech.geomesa.features.kryo.impl.KryoFeatureSerialization.serialize ReserializeTransformer.this.serializer.serialize(ReserializeTransformer.this.sf)