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.tools.stats
10 
11 import com.beust.jcommander.ParameterException
12 import org.locationtech.geomesa.index.geotools.GeoMesaDataStore
13 import org.locationtech.geomesa.index.metadata.GeoMesaMetadata
14 import org.locationtech.geomesa.tools.stats.StatsAnalyzeCommand.StatsAnalyzeParams
15 import org.locationtech.geomesa.tools.{CatalogParam, Command, DataStoreCommand, TypeNameParam}
16 import org.locationtech.geomesa.utils.stats._
17 import org.locationtech.jts.geom.Geometry
18 
19 trait StatsAnalyzeCommand[DS <: GeoMesaDataStore[DS]] extends DataStoreCommand[DS] {
20 
21   import org.locationtech.geomesa.utils.geotools.RichSimpleFeatureType.RichSimpleFeatureType
22 
23   import scala.collection.JavaConverters._
24 
25   override val name = "stats-analyze"
26   override def params: StatsAnalyzeParams
27 
28   override def execute(): Unit = withDataStore(analyze)
29 
30   private def analyze(ds: DS): Unit = {
31     val sft = ds.getSchema(params.featureName)
32     if (sft == null) {
33       throw new ParameterException(s"Schema '${params.featureName}' does not exist")
34     }
35 
36     def noStats = ds.metadata.read(sft.getTypeName, GeoMesaMetadata.StatsGenerationKey, cache = false).isEmpty
37 
38     Command.user.info(s"Running stat analysis for feature type ${sft.getTypeName}...")
39     val stats = if (noStats) {
40       // this is the first time anyone has accessed this data store since stats were implemented
41       // stats should be kicked off and run in the background, we just have to wait for it to finish
42       // note: if something goes wrong this will just hang... but this is kind of a fringe case
43       while (noStats) {
44         Thread.sleep(1000)
45       }
46       // sleep an additional bit so that the stat table gets configured
47       Thread.sleep(1000)
48       val queries = sft.getAttributeDescriptors.asScala.map(d => Stat.MinMax(d.getLocalName))
49       ds.stats.getStat[CountStat](sft, Stat.Count()) ++ ds.stats.getSeqStat[MinMax[Any]](sft, queries.toSeq)
50     } else {
51       ds.stats.writer.analyze(sft)
52     }
53 
54     val strings = stats.collect {
55       case s: CountStat   => s"Total features: ${s.count}"
56       case s: MinMax[Any] =>
57         val bounds = if (s.isEmpty) {
58           "[ no matching data ]"
59         } else if (sft.getGeomField == s.property) {
60           val e = s.min.asInstanceOf[Geometry].getEnvelopeInternal
61           e.expandToInclude(s.max.asInstanceOf[Geometry].getEnvelopeInternal)
62           s"[ ${e.getMinX}, ${e.getMinY}, ${e.getMaxX}, ${e.getMaxY} ] cardinality: ${s.cardinality}"
63         } else {
64           val stringify = Stat.stringifier(sft.getDescriptor(s.property).getType.getBinding)
65           s"[ ${stringify(s.min)} to ${stringify(s.max)} ] cardinality: ${s.cardinality}"
66         }
67         s"Bounds for ${s.property}: $bounds"
68     }
69 
70     Command.user.info("Stats analyzed:")
71     Command.output.info(strings.mkString("  ", "\n  ", ""))
72     Command.user.info("Use 'stats-histogram', 'stats-top-k' or 'stats-count' commands for more details")
73   }
74 }
75 
76 object StatsAnalyzeCommand {
77   // @Parameters(commandDescription = "Analyze statistics on a GeoMesa feature type")
78   trait StatsAnalyzeParams extends CatalogParam with TypeNameParam
79 }
Line Stmt Id Pos Tree Symbol Tests Code
25 79220 1198 - 1213 Literal <nosymbol> "stats-analyze"
28 79221 1304 - 1311 Apply org.locationtech.geomesa.tools.stats.StatsAnalyzeCommand.analyze StatsAnalyzeCommand.this.analyze(ds)
28 79222 1290 - 1312 Apply org.locationtech.geomesa.tools.DataStoreCommand.withDataStore StatsAnalyzeCommand.this.withDataStore[Unit]({ ((ds: DS) => StatsAnalyzeCommand.this.analyze(ds)) })
31 79223 1381 - 1399 Select org.locationtech.geomesa.tools.TypeNameParam.featureName StatsAnalyzeCommand.this.params.featureName
31 79224 1368 - 1400 Apply org.locationtech.geomesa.index.geotools.GeoMesaDataStore.getSchema ds.getSchema(StatsAnalyzeCommand.this.params.featureName)
32 79225 1409 - 1420 Apply java.lang.Object.== sft.==(null)
32 79229 1405 - 1405 Block <nosymbol> ()
32 79228 1405 - 1405 Literal <nosymbol> ()
33 79227 1430 - 1508 Block <nosymbol> throw new com.beust.jcommander.ParameterException(scala.StringContext.apply("Schema \'", "\' does not exist").s(StatsAnalyzeCommand.this.params.featureName))
33 79226 1430 - 1508 Throw <nosymbol> throw new com.beust.jcommander.ParameterException(scala.StringContext.apply("Schema \'", "\' does not exist").s(StatsAnalyzeCommand.this.params.featureName))
36 79231 1568 - 1602 Select org.locationtech.geomesa.index.metadata.GeoMesaMetadata.StatsGenerationKey org.locationtech.geomesa.index.metadata.GeoMesaMetadata.StatsGenerationKey
36 79230 1551 - 1566 Apply org.geotools.api.feature.simple.SimpleFeatureType.getTypeName sft.getTypeName()
36 79233 1534 - 1626 Select scala.Option.isEmpty ds.metadata.read(sft.getTypeName(), org.locationtech.geomesa.index.metadata.GeoMesaMetadata.StatsGenerationKey, false).isEmpty
36 79232 1612 - 1617 Literal <nosymbol> false
39 79257 1744 - 2404 Block <nosymbol> { while$1(){ if (noStats) { java.lang.Thread.sleep(1000L); while$1() } else () }; java.lang.Thread.sleep(1000L); val queries: scala.collection.mutable.Buffer[String] = scala.collection.JavaConverters.asScalaBufferConverter[org.geotools.api.feature.type.AttributeDescriptor](sft.getAttributeDescriptors()).asScala.map[String, scala.collection.mutable.Buffer[String]](((d: org.geotools.api.feature.type.AttributeDescriptor) => org.locationtech.geomesa.utils.stats.Stat.MinMax(d.getLocalName())))(mutable.this.Buffer.canBuildFrom[String]); scala.this.Option.option2Iterable[org.locationtech.geomesa.utils.stats.CountStat]({ <artifact> val qual$1: org.locationtech.geomesa.index.stats.GeoMesaStats = ds.stats; <artifact> val x$1: org.geotools.api.feature.simple.SimpleFeatureType = sft; <artifact> val x$2: String = org.locationtech.geomesa.utils.stats.Stat.Count(); <artifact> val x$3: org.geotools.api.filter.Filter = qual$1.getStat$default$3[org.locationtech.geomesa.utils.stats.CountStat]; <artifact> val x$4: Boolean = qual$1.getStat$default$4[org.locationtech.geomesa.utils.stats.CountStat]; qual$1.getStat[org.locationtech.geomesa.utils.stats.CountStat](x$1, x$2, x$3, x$4) }).++[org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat}}}, Iterable[org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat}}}]]({ <artifact> val qual$2: org.locationtech.geomesa.index.stats.GeoMesaStats = ds.stats; <artifact> val x$5: org.geotools.api.feature.simple.SimpleFeatureType = sft; <artifact> val x$6: Seq[String] @scala.reflect.internal.annotations.uncheckedBounds = queries.toSeq; <artifact> val x$7: org.geotools.api.filter.Filter = qual$2.getSeqStat$default$3[org.locationtech.geomesa.utils.stats.MinMax[Any]]; <artifact> val x$8: Boolean = qual$2.getSeqStat$default$4[org.locationtech.geomesa.utils.stats.MinMax[Any]]; qual$2.getSeqStat[org.locationtech.geomesa.utils.stats.MinMax[Any]](x$5, x$6, x$7, x$8) })(collection.this.Iterable.canBuildFrom[org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat}}}]) }
43 79237 2046 - 2046 Literal <nosymbol> ()
43 79236 2072 - 2090 Block <nosymbol> { java.lang.Thread.sleep(1000L); while$1() }
43 79238 2046 - 2046 Block <nosymbol> ()
44 79235 2084 - 2084 Apply org.locationtech.geomesa.tools.stats.StatsAnalyzeCommand.while$1 while$1()
44 79234 2072 - 2090 Apply java.lang.Thread.sleep java.lang.Thread.sleep(1000L)
47 79239 2177 - 2195 Apply java.lang.Thread.sleep java.lang.Thread.sleep(1000L)
48 79241 2273 - 2287 Apply org.geotools.api.feature.type.AttributeDescriptor.getLocalName d.getLocalName()
48 79240 2216 - 2243 Apply org.geotools.api.feature.simple.SimpleFeatureType.getAttributeDescriptors sft.getAttributeDescriptors()
48 79243 2255 - 2255 TypeApply scala.collection.mutable.Buffer.canBuildFrom mutable.this.Buffer.canBuildFrom[String]
48 79242 2261 - 2288 Apply org.locationtech.geomesa.utils.stats.Stat.MinMax org.locationtech.geomesa.utils.stats.Stat.MinMax(d.getLocalName())
48 79244 2216 - 2289 ApplyToImplicitArgs scala.collection.TraversableLike.map scala.collection.JavaConverters.asScalaBufferConverter[org.geotools.api.feature.type.AttributeDescriptor](sft.getAttributeDescriptors()).asScala.map[String, scala.collection.mutable.Buffer[String]](((d: org.geotools.api.feature.type.AttributeDescriptor) => org.locationtech.geomesa.utils.stats.Stat.MinMax(d.getLocalName())))(mutable.this.Buffer.canBuildFrom[String])
49 79245 2296 - 2304 Select org.locationtech.geomesa.index.stats.HasGeoMesaStats.stats ds.stats
49 79247 2312 - 2312 TypeApply org.locationtech.geomesa.index.stats.GeoMesaStats.getStat$default$3 qual$1.getStat$default$3[org.locationtech.geomesa.utils.stats.CountStat]
49 79246 2329 - 2341 Apply org.locationtech.geomesa.utils.stats.Stat.Count org.locationtech.geomesa.utils.stats.Stat.Count()
49 79249 2296 - 2342 Apply org.locationtech.geomesa.index.stats.GeoMesaStats.getStat qual$1.getStat[org.locationtech.geomesa.utils.stats.CountStat](x$1, x$2, x$3, x$4)
49 79248 2312 - 2312 TypeApply org.locationtech.geomesa.index.stats.GeoMesaStats.getStat$default$4 qual$1.getStat$default$4[org.locationtech.geomesa.utils.stats.CountStat]
49 79251 2384 - 2397 Select scala.collection.SeqLike.toSeq queries.toSeq
49 79250 2346 - 2354 Select org.locationtech.geomesa.index.stats.HasGeoMesaStats.stats ds.stats
49 79253 2365 - 2365 TypeApply org.locationtech.geomesa.index.stats.GeoMesaStats.getSeqStat$default$4 qual$2.getSeqStat$default$4[org.locationtech.geomesa.utils.stats.MinMax[Any]]
49 79252 2365 - 2365 TypeApply org.locationtech.geomesa.index.stats.GeoMesaStats.getSeqStat$default$3 qual$2.getSeqStat$default$3[org.locationtech.geomesa.utils.stats.MinMax[Any]]
49 79255 2343 - 2343 TypeApply scala.collection.Iterable.canBuildFrom collection.this.Iterable.canBuildFrom[org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat}}}]
49 79254 2346 - 2398 Apply org.locationtech.geomesa.index.stats.GeoMesaStats.getSeqStat qual$2.getSeqStat[org.locationtech.geomesa.utils.stats.MinMax[Any]](x$5, x$6, x$7, x$8)
49 79256 2296 - 2398 ApplyToImplicitArgs scala.collection.TraversableLike.++ scala.this.Option.option2Iterable[org.locationtech.geomesa.utils.stats.CountStat]({ <artifact> val qual$1: org.locationtech.geomesa.index.stats.GeoMesaStats = ds.stats; <artifact> val x$1: org.geotools.api.feature.simple.SimpleFeatureType = sft; <artifact> val x$2: String = org.locationtech.geomesa.utils.stats.Stat.Count(); <artifact> val x$3: org.geotools.api.filter.Filter = qual$1.getStat$default$3[org.locationtech.geomesa.utils.stats.CountStat]; <artifact> val x$4: Boolean = qual$1.getStat$default$4[org.locationtech.geomesa.utils.stats.CountStat]; qual$1.getStat[org.locationtech.geomesa.utils.stats.CountStat](x$1, x$2, x$3, x$4) }).++[org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat}}}, Iterable[org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat}}}]]({ <artifact> val qual$2: org.locationtech.geomesa.index.stats.GeoMesaStats = ds.stats; <artifact> val x$5: org.geotools.api.feature.simple.SimpleFeatureType = sft; <artifact> val x$6: Seq[String] @scala.reflect.internal.annotations.uncheckedBounds = queries.toSeq; <artifact> val x$7: org.geotools.api.filter.Filter = qual$2.getSeqStat$default$3[org.locationtech.geomesa.utils.stats.MinMax[Any]]; <artifact> val x$8: Boolean = qual$2.getSeqStat$default$4[org.locationtech.geomesa.utils.stats.MinMax[Any]]; qual$2.getSeqStat[org.locationtech.geomesa.utils.stats.MinMax[Any]](x$5, x$6, x$7, x$8) })(collection.this.Iterable.canBuildFrom[org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat{type S >: org.locationtech.geomesa.utils.stats.CountStat with org.locationtech.geomesa.utils.stats.MinMax[Any] <: org.locationtech.geomesa.utils.stats.Stat}}}])
51 79259 2418 - 2446 Block org.locationtech.geomesa.index.stats.GeoMesaStats.GeoMesaStatWriter.analyze ds.stats.writer.analyze(sft)
51 79258 2418 - 2446 Apply org.locationtech.geomesa.index.stats.GeoMesaStats.GeoMesaStatWriter.analyze ds.stats.writer.analyze(sft)
54 79307 2486 - 2486 Apply org.locationtech.geomesa.tools.stats.StatsAnalyzeCommand.$anonfun.<init> new $anonfun()
54 79309 2472 - 3207 ApplyToImplicitArgs scala.collection.TraversableLike.collect stats.collect[String, Iterable[String]](({ @SerialVersionUID(value = 0) final <synthetic> class $anonfun extends scala.runtime.AbstractPartialFunction[org.locationtech.geomesa.utils.stats.Stat,String] with Serializable { def <init>(): <$anon: org.locationtech.geomesa.utils.stats.Stat => String> = { $anonfun.super.<init>(); () }; final override def applyOrElse[A1 <: org.locationtech.geomesa.utils.stats.Stat, B1 >: String](x1: A1, default: A1 => B1): B1 = ((x1.asInstanceOf[org.locationtech.geomesa.utils.stats.Stat]: org.locationtech.geomesa.utils.stats.Stat): org.locationtech.geomesa.utils.stats.Stat @unchecked) match { case (s @ (_: org.locationtech.geomesa.utils.stats.CountStat)) => scala.StringContext.apply("Total features: ", "").s(s.count) case (s @ (_: org.locationtech.geomesa.utils.stats.MinMax[Any])) => { val bounds: String = if (s.isEmpty) "[ no matching data ]" else if (org.locationtech.geomesa.utils.geotools.RichSimpleFeatureType.RichSimpleFeatureType(sft).getGeomField.==(s.property)) { val e: org.locationtech.jts.geom.Envelope = s.min.asInstanceOf[org.locationtech.jts.geom.Geometry].getEnvelopeInternal(); e.expandToInclude(s.max.asInstanceOf[org.locationtech.jts.geom.Geometry].getEnvelopeInternal()); scala.StringContext.apply("[ ", ", ", ", ", ", ", " ] cardinality: ", "").s(e.getMinX(), e.getMinY(), e.getMaxX(), e.getMaxY(), s.cardinality) } else { val stringify: Any => String = org.locationtech.geomesa.utils.stats.Stat.stringifier[?0](sft.getDescriptor(s.property).getType().getBinding(), org.locationtech.geomesa.utils.stats.Stat.stringifier$default$2[Nothing]); scala.StringContext.apply("[ ", " to ", " ] cardinality: ", "").s(stringify.apply(s.min), stringify.apply(s.max), s.cardinality) }; scala.StringContext.apply("Bounds for ", ": ", "").s(s.property, bounds) } case (defaultCase$ @ _) => default.apply(x1) }; final def isDefinedAt(x1: org.locationtech.geomesa.utils.stats.Stat): Boolean = ((x1.asInstanceOf[org.locationtech.geomesa.utils.stats.Stat]: org.locationtech.geomesa.utils.stats.Stat): org.locationtech.geomesa.utils.stats.Stat @unchecked) match { case (s @ (_: org.locationtech.geomesa.utils.stats.CountStat)) => true case (s @ (_: org.locationtech.geomesa.utils.stats.MinMax[Any])) => true case (defaultCase$ @ _) => false } }; new $anonfun() }: PartialFunction[org.locationtech.geomesa.utils.stats.Stat,String]))(collection.this.Iterable.canBuildFrom[String])
54 79308 2486 - 2486 TypeApply scala.collection.Iterable.canBuildFrom collection.this.Iterable.canBuildFrom[String]
55 79261 2545 - 2546 Literal <nosymbol> ""
55 79260 2519 - 2536 Literal <nosymbol> "Total features: "
55 79263 2517 - 2546 Apply scala.StringContext.s scala.StringContext.apply("Total features: ", "").s(s.count)
55 79262 2537 - 2544 Select org.locationtech.geomesa.utils.stats.CountStat.count s.count
55 79264 2517 - 2546 Block scala.StringContext.s scala.StringContext.apply("Total features: ", "").s(s.count)
56 79306 2573 - 3201 Block <nosymbol> { val bounds: String = if (s.isEmpty) "[ no matching data ]" else if (org.locationtech.geomesa.utils.geotools.RichSimpleFeatureType.RichSimpleFeatureType(sft).getGeomField.==(s.property)) { val e: org.locationtech.jts.geom.Envelope = s.min.asInstanceOf[org.locationtech.jts.geom.Geometry].getEnvelopeInternal(); e.expandToInclude(s.max.asInstanceOf[org.locationtech.jts.geom.Geometry].getEnvelopeInternal()); scala.StringContext.apply("[ ", ", ", ", ", ", ", " ] cardinality: ", "").s(e.getMinX(), e.getMinY(), e.getMaxX(), e.getMaxY(), s.cardinality) } else { val stringify: Any => String = org.locationtech.geomesa.utils.stats.Stat.stringifier[?0](sft.getDescriptor(s.property).getType().getBinding(), org.locationtech.geomesa.utils.stats.Stat.stringifier$default$2[Nothing]); scala.StringContext.apply("[ ", " to ", " ] cardinality: ", "").s(stringify.apply(s.min), stringify.apply(s.max), s.cardinality) }; scala.StringContext.apply("Bounds for ", ": ", "").s(s.property, bounds) }
57 79265 2601 - 2610 Select org.locationtech.geomesa.utils.stats.MinMax.isEmpty s.isEmpty
58 79267 2624 - 2646 Block <nosymbol> "[ no matching data ]"
58 79266 2624 - 2646 Literal <nosymbol> "[ no matching data ]"
59 79269 2666 - 2696 Apply java.lang.Object.== org.locationtech.geomesa.utils.geotools.RichSimpleFeatureType.RichSimpleFeatureType(sft).getGeomField.==(s.property)
59 79268 2686 - 2696 Select org.locationtech.geomesa.utils.stats.MinMax.property s.property
59 79285 2698 - 2956 Block <nosymbol> { val e: org.locationtech.jts.geom.Envelope = s.min.asInstanceOf[org.locationtech.jts.geom.Geometry].getEnvelopeInternal(); e.expandToInclude(s.max.asInstanceOf[org.locationtech.jts.geom.Geometry].getEnvelopeInternal()); scala.StringContext.apply("[ ", ", ", ", ", ", ", " ] cardinality: ", "").s(e.getMinX(), e.getMinY(), e.getMaxX(), e.getMaxY(), s.cardinality) }
59 79300 2662 - 3156 If <nosymbol> if (org.locationtech.geomesa.utils.geotools.RichSimpleFeatureType.RichSimpleFeatureType(sft).getGeomField.==(s.property)) { val e: org.locationtech.jts.geom.Envelope = s.min.asInstanceOf[org.locationtech.jts.geom.Geometry].getEnvelopeInternal(); e.expandToInclude(s.max.asInstanceOf[org.locationtech.jts.geom.Geometry].getEnvelopeInternal()); scala.StringContext.apply("[ ", ", ", ", ", ", ", " ] cardinality: ", "").s(e.getMinX(), e.getMinY(), e.getMaxX(), e.getMaxY(), s.cardinality) } else { val stringify: Any => String = org.locationtech.geomesa.utils.stats.Stat.stringifier[?0](sft.getDescriptor(s.property).getType().getBinding(), org.locationtech.geomesa.utils.stats.Stat.stringifier$default$2[Nothing]); scala.StringContext.apply("[ ", " to ", " ] cardinality: ", "").s(stringify.apply(s.min), stringify.apply(s.max), s.cardinality) }
60 79270 2718 - 2766 Apply org.locationtech.jts.geom.Geometry.getEnvelopeInternal s.min.asInstanceOf[org.locationtech.jts.geom.Geometry].getEnvelopeInternal()
61 79271 2795 - 2843 Apply org.locationtech.jts.geom.Geometry.getEnvelopeInternal s.max.asInstanceOf[org.locationtech.jts.geom.Geometry].getEnvelopeInternal()
61 79272 2777 - 2844 Apply org.locationtech.jts.geom.Envelope.expandToInclude e.expandToInclude(s.max.asInstanceOf[org.locationtech.jts.geom.Geometry].getEnvelopeInternal())
62 79273 2857 - 2860 Literal <nosymbol> "[ "
62 79275 2885 - 2888 Literal <nosymbol> ", "
62 79274 2871 - 2874 Literal <nosymbol> ", "
62 79277 2913 - 2930 Literal <nosymbol> " ] cardinality: "
62 79276 2899 - 2902 Literal <nosymbol> ", "
62 79279 2861 - 2870 Apply org.locationtech.jts.geom.Envelope.getMinX e.getMinX()
62 79278 2945 - 2946 Literal <nosymbol> ""
62 79281 2889 - 2898 Apply org.locationtech.jts.geom.Envelope.getMaxX e.getMaxX()
62 79280 2875 - 2884 Apply org.locationtech.jts.geom.Envelope.getMinY e.getMinY()
62 79283 2931 - 2944 Select org.locationtech.geomesa.utils.stats.MinMax.cardinality s.cardinality
62 79282 2903 - 2912 Apply org.locationtech.jts.geom.Envelope.getMaxY e.getMaxY()
62 79284 2855 - 2946 Apply scala.StringContext.s scala.StringContext.apply("[ ", ", ", ", ", ", ", " ] cardinality: ", "").s(e.getMinX(), e.getMinY(), e.getMaxX(), e.getMaxY(), s.cardinality)
63 79299 2962 - 3156 Block <nosymbol> { val stringify: Any => String = org.locationtech.geomesa.utils.stats.Stat.stringifier[?0](sft.getDescriptor(s.property).getType().getBinding(), org.locationtech.geomesa.utils.stats.Stat.stringifier$default$2[Nothing]); scala.StringContext.apply("[ ", " to ", " ] cardinality: ", "").s(stringify.apply(s.min), stringify.apply(s.max), s.cardinality) }
64 79287 2995 - 2995 TypeApply org.locationtech.geomesa.utils.stats.Stat.stringifier$default$2 org.locationtech.geomesa.utils.stats.Stat.stringifier$default$2[Nothing]
64 79286 3007 - 3055 Apply org.geotools.api.feature.type.PropertyType.getBinding sft.getDescriptor(s.property).getType().getBinding()
64 79288 2990 - 3056 Apply org.locationtech.geomesa.utils.stats.Stat.stringifier org.locationtech.geomesa.utils.stats.Stat.stringifier[?0](sft.getDescriptor(s.property).getType().getBinding(), org.locationtech.geomesa.utils.stats.Stat.stringifier$default$2[Nothing])
65 79289 3069 - 3072 Literal <nosymbol> "[ "
65 79291 3113 - 3130 Literal <nosymbol> " ] cardinality: "
65 79290 3090 - 3095 Literal <nosymbol> " to "
65 79293 3083 - 3088 Select org.locationtech.geomesa.utils.stats.MinMax.min s.min
65 79292 3145 - 3146 Literal <nosymbol> ""
65 79295 3106 - 3111 Select org.locationtech.geomesa.utils.stats.MinMax.max s.max
65 79294 3073 - 3089 Apply scala.Function1.apply stringify.apply(s.min)
65 79297 3131 - 3144 Select org.locationtech.geomesa.utils.stats.MinMax.cardinality s.cardinality
65 79296 3096 - 3112 Apply scala.Function1.apply stringify.apply(s.max)
65 79298 3067 - 3146 Apply scala.StringContext.s scala.StringContext.apply("[ ", " to ", " ] cardinality: ", "").s(stringify.apply(s.min), stringify.apply(s.max), s.cardinality)
67 79301 3167 - 3179 Literal <nosymbol> "Bounds for "
67 79303 3200 - 3201 Literal <nosymbol> ""
67 79302 3191 - 3194 Literal <nosymbol> ": "
67 79305 3165 - 3201 Apply scala.StringContext.s scala.StringContext.apply("Bounds for ", ": ", "").s(s.property, bounds)
67 79304 3180 - 3190 Select org.locationtech.geomesa.utils.stats.MinMax.property s.property