1 /***********************************************************************
2  * Copyright (c) 2013-2024 Commonwealth Computer Research, Inc.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Apache License, Version 2.0
5  * which accompanies this distribution and is available at
6  * http://www.opensource.org/licenses/apache2.0.php.
7  ***********************************************************************/
8 
9 package org.locationtech.geomesa.convert2
10 
11 import com.codahale.metrics.Counter
12 import com.typesafe.scalalogging.LazyLogging
13 import org.geotools.api.feature.simple.{SimpleFeature, SimpleFeatureType}
14 import org.locationtech.geomesa.convert.EvaluationContext.{EvaluationError, FieldAccessor}
15 import org.locationtech.geomesa.convert.Modes.ErrorMode
16 import org.locationtech.geomesa.convert.{EnrichmentCache, EvaluationContext}
17 import org.locationtech.geomesa.convert2.AbstractCompositeConverter.{CompositeEvaluationContext, PredicateContext}
18 import org.locationtech.geomesa.convert2.metrics.ConverterMetrics
19 import org.locationtech.geomesa.convert2.transforms.Predicate
20 import org.locationtech.geomesa.utils.collection.CloseableIterator
21 import org.locationtech.geomesa.utils.io.CloseWithLogging
22 
23 import java.io.InputStream
24 import scala.util.control.NonFatal
25 
26 abstract class AbstractCompositeConverter[T <: AnyRef](
27     sft: SimpleFeatureType,
28     errorMode: ErrorMode,
29     delegates: Seq[(Predicate, ParsingConverter[T])]
30   ) extends SimpleFeatureConverter with LazyLogging {
31 
32   protected def parse(is: InputStream, ec: EvaluationContext): CloseableIterator[T]
33 
34   override def targetSft: SimpleFeatureType = sft
35 
36   override def createEvaluationContext(globalParams: Map[String, Any]): EvaluationContext =
37     CompositeEvaluationContext(delegates.map(_._2), globalParams)
38 
39   override def createEvaluationContext(
40       globalParams: Map[String, Any],
41       success: Counter,
42       failure: Counter): EvaluationContext = {
43     CompositeEvaluationContext(delegates.map(_._2), globalParams, success, failure)
44   }
45 
46   override def process(is: InputStream, ec: EvaluationContext): CloseableIterator[SimpleFeature] = {
47     val contexts = ec match {
48       case cec: CompositeEvaluationContext => cec.contexts.iterator
49       case _ => Iterator.continually(ec)
50     }
51     val predicates = delegates.map { case (predicate, converter) =>
52       if (!contexts.hasNext) {
53         throw new IllegalArgumentException(s"Invalid evaluation context doesn't match this converter: $ec")
54       }
55       val context = contexts.next()
56       PredicateContext(predicate.withContext(context), converter, context)
57     }
58 
59     val args = Array.ofDim[AnyRef](1)
60 
61     def matches(p: Predicate): Boolean = {
62       try { p.apply(args) } catch {
63         case NonFatal(e) => logger.warn(s"Error evaluating predicate $p: ", e); false
64       }
65     }
66 
67     val routing = predicates.head.context.metrics.histogram("predicate.eval.nanos")
68 
69     def eval(element: T): CloseableIterator[SimpleFeature] = {
70       val start = System.nanoTime()
71       args(0) = element
72       val converted = predicates.collectFirst { case p if matches(p.predicate) =>
73         routing.update(System.nanoTime() - start) // note: invoke before executing the conversion
74         p.context.line = ec.line // update the line in the sub context
75         p.converter.convert(CloseableIterator.single(element), p.context)
76       }
77       converted.getOrElse {
78         routing.update(System.nanoTime() - start)
79         ec.failure.inc()
80         CloseableIterator.empty
81       }
82     }
83 
84     val hist = predicates.head.context.metrics.histogram("parse.nanos")
85     new ErrorHandlingIterator(parse(is, ec), errorMode, ec, hist).flatMap(eval)
86   }
87 
88   override def close(): Unit = CloseWithLogging(delegates.map(_._2))
89 }
90 
91 object AbstractCompositeConverter {
92 
93   case class CompositeEvaluationContext(contexts: Seq[EvaluationContext], success: Counter, failure: Counter)
94       extends EvaluationContext {
95     override def cache: Map[String, EnrichmentCache] = throw new NotImplementedError()
96     override def metrics: ConverterMetrics = throw new NotImplementedError()
97     override def accessor(name: String): FieldAccessor = throw new NotImplementedError()
98     override def evaluate(args: Array[AnyRef]): Either[EvaluationError, Array[AnyRef]] =
99       throw new NotImplementedError()
100     override def errors: java.util.Queue[EvaluationError] = throw new NotImplementedError()
101   }
102 
103   object CompositeEvaluationContext {
104 
105     def apply(
106         converters: Seq[_ <: SimpleFeatureConverter],
107         globalParams: Map[String, Any]): CompositeEvaluationContext = {
108       // create a single set of shared success/failure counters
109       val head = converters.head.createEvaluationContext(globalParams)
110       val tail = converters.tail.map(_.createEvaluationContext(globalParams, head.success, head.failure))
111       CompositeEvaluationContext(head +: tail, head.success, head.failure)
112     }
113 
114     def apply(
115         converters: Seq[_ <: SimpleFeatureConverter],
116         globalParams: Map[String, Any],
117         success: Counter,
118         failure: Counter): CompositeEvaluationContext = {
119       val contexts = converters.map(_.createEvaluationContext(globalParams, success, failure))
120       CompositeEvaluationContext(contexts, success, failure)
121     }
122   }
123 
124   case class PredicateContext[T <: SimpleFeatureConverter](
125       predicate: Predicate,
126       converter: T,
127       context: EvaluationContext
128     )
129 }
Line Stmt Id Pos Tree Symbol Tests Code
34 330 1668 - 1671 Select org.locationtech.geomesa.convert2.AbstractCompositeConverter.sft AbstractCompositeConverter.this.sft
37 331 1810 - 1814 Select scala.Tuple2._2 x$1._2
37 332 1809 - 1809 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert2.ParsingConverter[T]]
37 333 1796 - 1815 ApplyToImplicitArgs scala.collection.TraversableLike.map AbstractCompositeConverter.this.delegates.map[org.locationtech.geomesa.convert2.ParsingConverter[T], Seq[_ <: org.locationtech.geomesa.convert2.SimpleFeatureConverter]](((x$1: (org.locationtech.geomesa.convert2.transforms.Predicate, org.locationtech.geomesa.convert2.ParsingConverter[T])) => x$1._2))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert2.ParsingConverter[T]])
37 334 1769 - 1830 Apply org.locationtech.geomesa.convert2.AbstractCompositeConverter.CompositeEvaluationContext.apply org.locationtech.geomesa.convert2.AbstractCompositeConverter.CompositeEvaluationContext.apply(AbstractCompositeConverter.this.delegates.map[org.locationtech.geomesa.convert2.ParsingConverter[T], Seq[_ <: org.locationtech.geomesa.convert2.SimpleFeatureConverter]](((x$1: (org.locationtech.geomesa.convert2.transforms.Predicate, org.locationtech.geomesa.convert2.ParsingConverter[T])) => x$1._2))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert2.ParsingConverter[T]]), globalParams)
43 335 2026 - 2030 Select scala.Tuple2._2 x$2._2
43 336 2025 - 2025 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert2.ParsingConverter[T]]
43 337 2012 - 2031 ApplyToImplicitArgs scala.collection.TraversableLike.map AbstractCompositeConverter.this.delegates.map[org.locationtech.geomesa.convert2.ParsingConverter[T], Seq[_ <: org.locationtech.geomesa.convert2.SimpleFeatureConverter]](((x$2: (org.locationtech.geomesa.convert2.transforms.Predicate, org.locationtech.geomesa.convert2.ParsingConverter[T])) => x$2._2))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert2.ParsingConverter[T]])
43 338 1985 - 2064 Apply org.locationtech.geomesa.convert2.AbstractCompositeConverter.CompositeEvaluationContext.apply org.locationtech.geomesa.convert2.AbstractCompositeConverter.CompositeEvaluationContext.apply(AbstractCompositeConverter.this.delegates.map[org.locationtech.geomesa.convert2.ParsingConverter[T], Seq[_ <: org.locationtech.geomesa.convert2.SimpleFeatureConverter]](((x$2: (org.locationtech.geomesa.convert2.transforms.Predicate, org.locationtech.geomesa.convert2.ParsingConverter[T])) => x$2._2))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert2.ParsingConverter[T]]), globalParams, success, failure)
48 339 2247 - 2268 Select scala.collection.IterableLike.iterator cec.contexts.iterator
48 340 2247 - 2268 Block scala.collection.IterableLike.iterator cec.contexts.iterator
49 341 2285 - 2309 Apply scala.collection.Iterator.continually scala.`package`.Iterator.continually[org.locationtech.geomesa.convert.EvaluationContext](ec)
49 342 2285 - 2309 Block scala.collection.Iterator.continually scala.`package`.Iterator.continually[org.locationtech.geomesa.convert.EvaluationContext](ec)
51 351 2381 - 2641 Block <nosymbol> { if (contexts.hasNext.unary_!) throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Invalid evaluation context doesn\'t match this converter: ", "").s(ec)) else (); val context: org.locationtech.geomesa.convert.EvaluationContext = contexts.next(); org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext.apply[org.locationtech.geomesa.convert2.ParsingConverter[T]](predicate.withContext(context), converter, context) }
51 352 2351 - 2351 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext[org.locationtech.geomesa.convert2.ParsingConverter[T]]]
51 353 2337 - 2647 ApplyToImplicitArgs scala.collection.TraversableLike.map AbstractCompositeConverter.this.delegates.map[org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext[org.locationtech.geomesa.convert2.ParsingConverter[T]], Seq[org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext[org.locationtech.geomesa.convert2.ParsingConverter[T]]]](((x0$1: (org.locationtech.geomesa.convert2.transforms.Predicate, org.locationtech.geomesa.convert2.ParsingConverter[T])) => x0$1 match { case (_1: org.locationtech.geomesa.convert2.transforms.Predicate, _2: org.locationtech.geomesa.convert2.ParsingConverter[T])(org.locationtech.geomesa.convert2.transforms.Predicate, org.locationtech.geomesa.convert2.ParsingConverter[T])((predicate @ _), (converter @ _)) => { if (contexts.hasNext.unary_!) throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Invalid evaluation context doesn\'t match this converter: ", "").s(ec)) else (); val context: org.locationtech.geomesa.convert.EvaluationContext = contexts.next(); org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext.apply[org.locationtech.geomesa.convert2.ParsingConverter[T]](predicate.withContext(context), converter, context) } }))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext[org.locationtech.geomesa.convert2.ParsingConverter[T]]])
52 343 2394 - 2411 Select scala.Boolean.unary_! contexts.hasNext.unary_!
52 346 2390 - 2390 Literal <nosymbol> ()
52 347 2390 - 2390 Block <nosymbol> ()
53 344 2423 - 2522 Throw <nosymbol> throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Invalid evaluation context doesn\'t match this converter: ", "").s(ec))
53 345 2423 - 2522 Block <nosymbol> throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Invalid evaluation context doesn\'t match this converter: ", "").s(ec))
55 348 2551 - 2566 Apply scala.collection.Iterator.next contexts.next()
56 349 2590 - 2620 Apply org.locationtech.geomesa.convert.EvaluationContext.ContextDependent.withContext predicate.withContext(context)
56 350 2573 - 2641 Apply org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext.apply org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext.apply[org.locationtech.geomesa.convert2.ParsingConverter[T]](predicate.withContext(context), converter, context)
59 354 2684 - 2685 Literal <nosymbol> 1
59 355 2664 - 2686 ApplyToImplicitArgs scala.Array.ofDim scala.Array.ofDim[AnyRef](1)((ClassTag.AnyRef: scala.reflect.ClassTag[AnyRef]))
62 356 2743 - 2756 Apply org.locationtech.geomesa.convert2.transforms.Predicate.apply p.apply(args)
62 357 2743 - 2756 Block org.locationtech.geomesa.convert2.transforms.Predicate.apply p.apply(args)
63 358 2847 - 2852 Literal <nosymbol> false
63 359 2792 - 2852 Block <nosymbol> { (if (AbstractCompositeConverter.this.logger.underlying.isWarnEnabled()) AbstractCompositeConverter.this.logger.underlying.warn(scala.StringContext.apply("Error evaluating predicate ", ": ").s(p), e) else (): Unit); false }
67 360 2886 - 2951 Apply org.locationtech.geomesa.convert2.metrics.ConverterMetrics.histogram predicates.head.context.metrics.histogram("predicate.eval.nanos")
70 361 3034 - 3051 Apply java.lang.System.nanoTime java.lang.System.nanoTime()
71 362 3058 - 3075 Apply scala.Array.update args.update(0, element)
72 363 3142 - 3153 Select org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext.predicate p.predicate
72 364 3134 - 3154 Apply org.locationtech.geomesa.convert2.AbstractCompositeConverter.matches matches(p.predicate)
72 373 3155 - 3400 Block <nosymbol> { routing.update(java.lang.System.nanoTime().-(start)); p.context.line_=(ec.line); p.converter.convert(org.locationtech.geomesa.utils.collection.CloseableIterator.single[T](element, org.locationtech.geomesa.utils.collection.CloseableIterator.single$default$2[Nothing]), p.context) }
72 374 3122 - 3122 Apply org.locationtech.geomesa.convert2.AbstractCompositeConverter.$anonfun.<init> new $anonfun()
72 375 3098 - 3408 Apply scala.collection.TraversableOnce.collectFirst predicates.collectFirst[org.locationtech.geomesa.utils.collection.CloseableIterator[org.geotools.api.feature.simple.SimpleFeature]](({ @SerialVersionUID(value = 0) final <synthetic> class $anonfun extends scala.runtime.AbstractPartialFunction[org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext[org.locationtech.geomesa.convert2.ParsingConverter[T]],org.locationtech.geomesa.utils.collection.CloseableIterator[org.geotools.api.feature.simple.SimpleFeature]] with Serializable { def <init>(): <$anon: org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext[org.locationtech.geomesa.convert2.ParsingConverter[T]] => org.locationtech.geomesa.utils.collection.CloseableIterator[org.geotools.api.feature.simple.SimpleFeature]> = { $anonfun.super.<init>(); () }; final override def applyOrElse[A1 <: org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext[org.locationtech.geomesa.convert2.ParsingConverter[T]], B1 >: org.locationtech.geomesa.utils.collection.CloseableIterator[org.geotools.api.feature.simple.SimpleFeature]](x1: A1, default: A1 => B1): B1 = ((x1.asInstanceOf[org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext[org.locationtech.geomesa.convert2.ParsingConverter[T]]]: org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext[org.locationtech.geomesa.convert2.ParsingConverter[T]]): org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext[org.locationtech.geomesa.convert2.ParsingConverter[T]] @unchecked) match { case (p @ _) if matches(p.predicate) => { routing.update(java.lang.System.nanoTime().-(start)); p.context.line_=(ec.line); p.converter.convert(org.locationtech.geomesa.utils.collection.CloseableIterator.single[T](element, org.locationtech.geomesa.utils.collection.CloseableIterator.single$default$2[Nothing]), p.context) } case (defaultCase$ @ _) => default.apply(x1) }; final def isDefinedAt(x1: org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext[org.locationtech.geomesa.convert2.ParsingConverter[T]]): Boolean = ((x1.asInstanceOf[org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext[org.locationtech.geomesa.convert2.ParsingConverter[T]]]: org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext[org.locationtech.geomesa.convert2.ParsingConverter[T]]): org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext[org.locationtech.geomesa.convert2.ParsingConverter[T]] @unchecked) match { case (p @ _) if matches(p.predicate) => true case (defaultCase$ @ _) => false } }; new $anonfun() }: PartialFunction[org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext[org.locationtech.geomesa.convert2.ParsingConverter[T]],org.locationtech.geomesa.utils.collection.CloseableIterator[org.geotools.api.feature.simple.SimpleFeature]]))
73 365 3181 - 3206 Apply scala.Long.- java.lang.System.nanoTime().-(start)
73 366 3166 - 3207 Apply com.codahale.metrics.Histogram.update routing.update(java.lang.System.nanoTime().-(start))
74 367 3281 - 3288 Select org.locationtech.geomesa.convert.EvaluationContext.line ec.line
74 368 3264 - 3288 Apply org.locationtech.geomesa.convert.EvaluationContext.line_= p.context.line_=(ec.line)
75 369 3373 - 3373 TypeApply org.locationtech.geomesa.utils.collection.CloseableIterator.single$default$2 org.locationtech.geomesa.utils.collection.CloseableIterator.single$default$2[Nothing]
75 370 3355 - 3388 Apply org.locationtech.geomesa.utils.collection.CloseableIterator.single org.locationtech.geomesa.utils.collection.CloseableIterator.single[T](element, org.locationtech.geomesa.utils.collection.CloseableIterator.single$default$2[Nothing])
75 371 3390 - 3399 Select org.locationtech.geomesa.convert2.AbstractCompositeConverter.PredicateContext.context p.context
75 372 3335 - 3400 Apply org.locationtech.geomesa.convert2.ParsingConverter.convert p.converter.convert(org.locationtech.geomesa.utils.collection.CloseableIterator.single[T](element, org.locationtech.geomesa.utils.collection.CloseableIterator.single$default$2[Nothing]), p.context)
77 380 3415 - 3551 Apply scala.Option.getOrElse converted.getOrElse[org.locationtech.geomesa.utils.collection.CloseableIterator[org.geotools.api.feature.simple.SimpleFeature]]({ routing.update(java.lang.System.nanoTime().-(start)); ec.failure.inc(); org.locationtech.geomesa.utils.collection.CloseableIterator.empty[Nothing] })
78 376 3460 - 3485 Apply scala.Long.- java.lang.System.nanoTime().-(start)
78 377 3445 - 3486 Apply com.codahale.metrics.Histogram.update routing.update(java.lang.System.nanoTime().-(start))
79 378 3495 - 3511 Apply com.codahale.metrics.Counter.inc ec.failure.inc()
80 379 3520 - 3543 TypeApply org.locationtech.geomesa.utils.collection.CloseableIterator.empty org.locationtech.geomesa.utils.collection.CloseableIterator.empty[Nothing]
84 381 3574 - 3630 Apply org.locationtech.geomesa.convert2.metrics.ConverterMetrics.histogram predicates.head.context.metrics.histogram("parse.nanos")
85 382 3661 - 3674 Apply org.locationtech.geomesa.convert2.AbstractCompositeConverter.parse AbstractCompositeConverter.this.parse(is, ec)
85 383 3676 - 3685 Select org.locationtech.geomesa.convert2.AbstractCompositeConverter.errorMode AbstractCompositeConverter.this.errorMode
85 384 3705 - 3709 Apply org.locationtech.geomesa.convert2.AbstractCompositeConverter.eval eval(element)
85 385 3635 - 3710 Apply org.locationtech.geomesa.utils.collection.CloseableIterator.flatMap new org.locationtech.geomesa.convert2.ErrorHandlingIterator[T](AbstractCompositeConverter.this.parse(is, ec), AbstractCompositeConverter.this.errorMode, ec, hist).flatMap[org.geotools.api.feature.simple.SimpleFeature]({ ((element: T) => eval(element)) })
88 386 3778 - 3782 Select scala.Tuple2._2 x$3._2
88 387 3777 - 3777 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert2.ParsingConverter[T]]
88 388 3764 - 3783 ApplyToImplicitArgs scala.collection.TraversableLike.map AbstractCompositeConverter.this.delegates.map[org.locationtech.geomesa.convert2.ParsingConverter[T], Seq[org.locationtech.geomesa.convert2.ParsingConverter[T]]](((x$3: (org.locationtech.geomesa.convert2.transforms.Predicate, org.locationtech.geomesa.convert2.ParsingConverter[T])) => x$3._2))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert2.ParsingConverter[T]])
88 389 3763 - 3763 Select org.locationtech.geomesa.utils.io.IsCloseableImplicits.iterableIsCloseable io.this.IsCloseable.iterableIsCloseable
88 390 3747 - 3784 ApplyToImplicitArgs org.locationtech.geomesa.utils.io.CloseWithLogging.apply org.locationtech.geomesa.utils.io.`package`.CloseWithLogging.apply[Seq[org.locationtech.geomesa.convert2.ParsingConverter[T]]](AbstractCompositeConverter.this.delegates.map[org.locationtech.geomesa.convert2.ParsingConverter[T], Seq[org.locationtech.geomesa.convert2.ParsingConverter[T]]](((x$3: (org.locationtech.geomesa.convert2.transforms.Predicate, org.locationtech.geomesa.convert2.ParsingConverter[T])) => x$3._2))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert2.ParsingConverter[T]]))(io.this.IsCloseable.iterableIsCloseable)
88 391 3763 - 3763 Literal <nosymbol> ()
95 392 4024 - 4055 Throw <nosymbol> throw new scala.NotImplementedError()
96 393 4101 - 4132 Throw <nosymbol> throw new scala.NotImplementedError()
97 394 4190 - 4221 Throw <nosymbol> throw new scala.NotImplementedError()
99 395 4317 - 4348 Throw <nosymbol> throw new scala.NotImplementedError()
100 396 4409 - 4440 Throw <nosymbol> throw new scala.NotImplementedError()
109 397 4707 - 4760 Apply org.locationtech.geomesa.convert2.SimpleFeatureConverter.createEvaluationContext converters.head.createEvaluationContext(globalParams)
110 398 4838 - 4850 Select org.locationtech.geomesa.convert.EvaluationContext.success head.success
110 399 4852 - 4864 Select org.locationtech.geomesa.convert.EvaluationContext.failure head.failure
110 400 4798 - 4865 Apply org.locationtech.geomesa.convert2.SimpleFeatureConverter.createEvaluationContext x$4.createEvaluationContext(globalParams, head.success, head.failure)
110 401 4797 - 4797 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert.EvaluationContext]
110 402 4778 - 4866 ApplyToImplicitArgs scala.collection.TraversableLike.map converters.tail.map[org.locationtech.geomesa.convert.EvaluationContext, Seq[org.locationtech.geomesa.convert.EvaluationContext]](((x$4: _$1) => x$4.createEvaluationContext(globalParams, head.success, head.failure)))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert.EvaluationContext])
111 403 4905 - 4905 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert.EvaluationContext]
111 404 4900 - 4912 ApplyToImplicitArgs scala.collection.SeqLike.+: tail.+:[org.locationtech.geomesa.convert.EvaluationContext, Seq[org.locationtech.geomesa.convert.EvaluationContext]](x$5)(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert.EvaluationContext])
111 405 4914 - 4926 Select org.locationtech.geomesa.convert.EvaluationContext.success head.success
111 406 4928 - 4940 Select org.locationtech.geomesa.convert.EvaluationContext.failure head.failure
111 407 4873 - 4941 Apply org.locationtech.geomesa.convert2.AbstractCompositeConverter.CompositeEvaluationContext.apply AbstractCompositeConverter.this.CompositeEvaluationContext.apply({ <synthetic> <artifact> val x$5: org.locationtech.geomesa.convert.EvaluationContext = head; tail.+:[org.locationtech.geomesa.convert.EvaluationContext, Seq[org.locationtech.geomesa.convert.EvaluationContext]](x$5)(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert.EvaluationContext]) }, head.success, head.failure)
119 408 5178 - 5235 Apply org.locationtech.geomesa.convert2.SimpleFeatureConverter.createEvaluationContext x$6.createEvaluationContext(globalParams, success, failure)
119 409 5177 - 5177 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert.EvaluationContext]
119 410 5163 - 5236 ApplyToImplicitArgs scala.collection.TraversableLike.map converters.map[org.locationtech.geomesa.convert.EvaluationContext, Seq[org.locationtech.geomesa.convert.EvaluationContext]](((x$6: _$2) => x$6.createEvaluationContext(globalParams, success, failure)))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.convert.EvaluationContext])
120 411 5243 - 5297 Apply org.locationtech.geomesa.convert2.AbstractCompositeConverter.CompositeEvaluationContext.apply AbstractCompositeConverter.this.CompositeEvaluationContext.apply(contexts, success, failure)