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 
10 package org.locationtech.geomesa.filter.function
11 
12 import org.geotools.api.temporal.Instant
13 import org.geotools.filter.FunctionExpressionImpl
14 import org.geotools.filter.capability.FunctionNameImpl
15 import org.geotools.filter.capability.FunctionNameImpl._
16 import org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteArrayCallback
17 import org.locationtech.geomesa.utils.bin.BinaryOutputEncoder
18 import org.locationtech.jts.geom.{Geometry, Point}
19 
20 import java.time.temporal.{ChronoField, Temporal}
21 import java.util.{Base64, Date}
22 
23 class Convert2ViewerFunction extends FunctionExpressionImpl(Convert2ViewerFunction.Name) {
24 
25   override def evaluate(obj: AnyRef): String = {
26     val id    = getExpression(0).evaluate(obj).asInstanceOf[String]
27     val track = BinaryOutputEncoder.convertToTrack(id)
28     val label = BinaryOutputEncoder.convertToLabel(id)
29     val geom  = getExpression(1).evaluate(obj).asInstanceOf[Point]
30     val dtg   = Convert2ViewerFunction.dtg2Long(getExpression(2).evaluate(obj))
31     ByteArrayCallback.apply(track, geom.getY.toFloat, geom.getX.toFloat, dtg, label)
32     Base64.getEncoder.encodeToString(ByteArrayCallback.result)
33   }
34 }
35 
36 object Convert2ViewerFunction {
37 
38   val Name = new FunctionNameImpl(
39     "convert2viewer",
40     classOf[String],
41     parameter("id", classOf[String]),
42     parameter("geom", classOf[Geometry]),
43     parameter("dtg", classOf[Long])
44   )
45 
46   private def dtg2Long(dtg: Any): Long = dtg match {
47     case d: Long     => d
48     case d: Date     => d.getTime
49     case d: Temporal => d.getLong(ChronoField.INSTANT_SECONDS) + d.get(ChronoField.MILLI_OF_SECOND)
50     case d: Instant  => d.getPosition.getDate.getTime
51   }
52 }
Line Stmt Id Pos Tree Symbol Tests Code
26 26073 1168 - 1169 Literal <nosymbol> 0
26 26074 1154 - 1205 TypeApply scala.Any.asInstanceOf Convert2ViewerFunction.this.getExpression(0).evaluate(obj).asInstanceOf[String]
27 26075 1222 - 1260 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.convertToTrack org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.convertToTrack(id)
28 26076 1277 - 1315 Apply org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.convertToLabel org.locationtech.geomesa.utils.bin.BinaryOutputEncoder.convertToLabel(id)
29 26077 1346 - 1347 Literal <nosymbol> 1
29 26078 1332 - 1382 TypeApply scala.Any.asInstanceOf Convert2ViewerFunction.this.getExpression(1).evaluate(obj).asInstanceOf[org.locationtech.jts.geom.Point]
30 26079 1431 - 1461 Apply org.geotools.api.filter.expression.Expression.evaluate Convert2ViewerFunction.this.getExpression(2).evaluate(obj)
30 26080 1399 - 1462 Apply org.locationtech.geomesa.filter.function.Convert2ViewerFunction.dtg2Long Convert2ViewerFunction.dtg2Long(Convert2ViewerFunction.this.getExpression(2).evaluate(obj))
31 26081 1498 - 1515 Select scala.Double.toFloat geom.getY().toFloat
31 26082 1517 - 1534 Select scala.Double.toFloat geom.getX().toFloat
31 26083 1467 - 1547 Apply org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.apply org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteArrayCallback.apply(track, geom.getY().toFloat, geom.getX().toFloat, dtg, label)
32 26084 1585 - 1609 Select org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteArrayCallback.result org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteArrayCallback.result
32 26085 1552 - 1610 Apply java.util.Base64.Encoder.encodeToString java.util.Base64.getEncoder().encodeToString(org.locationtech.geomesa.utils.bin.BinaryEncodeCallback.ByteArrayCallback.result)
38 26091 1664 - 1848 Apply org.geotools.filter.capability.FunctionNameImpl.<init> new org.geotools.filter.capability.FunctionNameImpl("convert2viewer", classOf[java.lang.String], org.geotools.filter.capability.FunctionNameImpl.parameter[String]("id", classOf[java.lang.String]), org.geotools.filter.capability.FunctionNameImpl.parameter[org.locationtech.jts.geom.Geometry]("geom", classOf[org.locationtech.jts.geom.Geometry]), org.geotools.filter.capability.FunctionNameImpl.parameter[Long]("dtg", classOf[scala.Long]))
39 26086 1690 - 1706 Literal <nosymbol> "convert2viewer"
40 26087 1712 - 1727 Literal <nosymbol> classOf[java.lang.String]
41 26088 1733 - 1765 Apply org.geotools.filter.capability.FunctionNameImpl.parameter org.geotools.filter.capability.FunctionNameImpl.parameter[String]("id", classOf[java.lang.String])
42 26089 1771 - 1807 Apply org.geotools.filter.capability.FunctionNameImpl.parameter org.geotools.filter.capability.FunctionNameImpl.parameter[org.locationtech.jts.geom.Geometry]("geom", classOf[org.locationtech.jts.geom.Geometry])
43 26090 1813 - 1844 Apply org.geotools.filter.capability.FunctionNameImpl.parameter org.geotools.filter.capability.FunctionNameImpl.parameter[Long]("dtg", classOf[scala.Long])
47 26092 1927 - 1928 Ident org.locationtech.geomesa.filter.function.Convert2ViewerFunction.d d
48 26093 1953 - 1962 Apply java.util.Date.getTime d.getTime()
48 26094 1953 - 1962 Block java.util.Date.getTime d.getTime()
49 26095 1997 - 2024 Literal <nosymbol> INSTANT_SECONDS
49 26096 2028 - 2062 Apply java.time.temporal.TemporalAccessor.get d.get(MILLI_OF_SECOND)
49 26097 1987 - 2062 Apply scala.Long.+ d.getLong(INSTANT_SECONDS).+(d.get(MILLI_OF_SECOND))
49 26098 1987 - 2062 Block scala.Long.+ d.getLong(INSTANT_SECONDS).+(d.get(MILLI_OF_SECOND))
50 26099 2087 - 2116 Apply java.util.Date.getTime d.getPosition().getDate().getTime()
50 26100 2087 - 2116 Block java.util.Date.getTime d.getPosition().getDate().getTime()