GeoTrellis is a geographic data processing engine for high performance applications.
echeipesh on master
Fixes fallback implementation o… (compare)
echeipesh on master
Update hbase 2.1.8 for tests (compare)
echeipesh on master
remove unnecessary calculations… (compare)
com.fasterxml.jackson.databind.JsonMappingException: Incompatible Jackson version: 2.9.8
This is kinda a Scala typing question, but I'm confused about why these aren't both true
(and it's causing Spark Catalyst issues):
scala> classOf[geotrellis.raster.CellGrid[_]].isAssignableFrom(classOf[geotrellis.raster.Tile])
res0: Boolean = false
scala> classOf[geotrellis.raster.CellGrid[_]].isInstance(geotrellis.raster.IntConstantTile(1,2,3))
res1: Boolean = true
As a refresher, the docs on isAssignableFrom
say:
Determines if the class or interface represented by this Class object is either the same as, or is a superclass or superinterface of, the class or interface represented by the specified Class parameter.
This is also false
:
scala> classOf[geotrellis.raster.CellGrid[Int]].isAssignableFrom(classOf[geotrellis.raster.Tile])
res2: Boolean = false
This is only now relevant for me due to CellGrid
now having a type parameter. Thoughts? Something obvious?
classOf
wouldn't hold any information about the type parameter though
CellGrid
doesn't show up through reflection!:scala> classOf[Tile].getInterfaces
scala> classOf[Tile].getSuperclass
scala> classOf[Tile].getGenericInterfaces
res0: Array[Class[_]] = Array(interface geotrellis.raster.IterableTile, interface geotrellis.raster.MappableTile)
res1: Class[_ >: geotrellis.raster.Tile] = null
res2: Array[java.lang.reflect.Type] = Array(interface geotrellis.raster.IterableTile, geotrellis.raster.MappableTile<geotrellis.raster.Tile>)
Yeh, I'm more hung up on the fact that the relationship doesn't exist in the JVM. Here's the trigger:
scala> val rc = classOf[Raster[Tile]]
rc: Class[geotrellis.raster.Raster[geotrellis.raster.Tile]] = class geotrellis.raster.Raster
scala> rc.getConstructors
res0: Array[java.lang.reflect.Constructor[_]] = Array(public geotrellis.raster.Raster(geotrellis.raster.CellGrid,geotrellis.vector.Extent))
scala> rc.getConstructor(classOf[Tile], classOf[Extent])
java.lang.NoSuchMethodException: geotrellis.raster.Raster.<init>(geotrellis.raster.Tile, geotrellis.vector.Extent)
However, it's clearly in the compile-time typing:
scala> import scala.reflect.runtime.universe._
scala> typeOf[Tile].baseClasses
res0: List[reflect.runtime.universe.Symbol] = List(trait Tile, trait MappableTile, trait MacroMappableTile, trait IterableTile, trait MacroIterableTile, class CellGrid, class Grid, trait Serializable, trait Serializable, class Object, class Any)
case classes
) expects a ctor to exist:scala> rf.printSchema()
raster
|-- tile: tile (nullable = true)
|-- extent: struct (nullable = true)
| |-- xmin: double (nullable = false)
| |-- ymin: double (nullable = false)
| |-- xmax: double (nullable = false)
| |-- ymax: double (nullable = false)
scala> rf .select(col("raster").as[Raster[Tile]])
ERROR CodeGenerator: failed to compile: org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 102, Column 11: No applicable constructor/method found for actual parameters "geotrellis.raster.Tile, geotrellis.vector.Extent"; candidates are: "geotrellis.raster.Raster(geotrellis.raster.CellGrid, geotrellis.vector.Extent)"
org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 102, Column 11: No applicable constructor/method found for actual parameters "geotrellis.raster.Tile, geotrellis.vector.Extent"; candidates are: "geotrellis.raster.Raster(geotrellis.raster.CellGrid, geotrellis.vector.Extent)"
Encoder
s make a lot of assumptions.
:javap geotrellis.raster.Tile
Size 5432 bytes
MD5 checksum 130428f0bb0a80b0748ad561f426f1ab
Compiled from "Tile.scala"
public interface geotrellis.raster.Tile extends geotrellis.raster.IterableTile, geotrellis.raster.MappableTile<geotrellis.raster.Tile>