esqueleto-postgis 1.2.0 → 2.0.0
raw patch · 13 files changed
+64/−97 lines, 13 filesdep ~geojsonPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: geojson
API changes (from Hackage documentation)
- Database.Esqueleto.Postgis.Ewkb.Geometry: EwkbGeom :: WkbGeometryType -> SridType -> EwkbGeometryType
- Database.Esqueleto.Postgis.Ewkb.Geometry: NoSrid :: SridType
- Database.Esqueleto.Postgis.Ewkb.Geometry: Srid :: Word32 -> SridType
- Database.Esqueleto.Postgis.Ewkb.Geometry: builderEwkbGeom :: EndianType -> EwkbGeometryType -> Builder
- Database.Esqueleto.Postgis.Ewkb.Geometry: builderWkbGeom :: EndianType -> WkbGeometryType -> Builder
- Database.Esqueleto.Postgis.Ewkb.Geometry: data EwkbGeometryType
- Database.Esqueleto.Postgis.Ewkb.Geometry: data SridType
- Database.Esqueleto.Postgis.Ewkb.Geometry: getEwkbGeom :: EndianType -> Get EwkbGeometryType
- Database.Esqueleto.Postgis.Ewkb.Geometry: getWkbGeom :: EndianType -> Get WkbGeometryType
- Database.Esqueleto.Postgis.Ewkb.Geometry: instance GHC.Classes.Eq Database.Esqueleto.Postgis.Ewkb.Geometry.EwkbGeometryType
- Database.Esqueleto.Postgis.Ewkb.Geometry: instance GHC.Classes.Eq Database.Esqueleto.Postgis.Ewkb.Geometry.SridType
- Database.Esqueleto.Postgis.Ewkb.Geometry: instance GHC.Show.Show Database.Esqueleto.Postgis.Ewkb.Geometry.EwkbGeometryType
- Database.Esqueleto.Postgis.Ewkb.Geometry: instance GHC.Show.Show Database.Esqueleto.Postgis.Ewkb.Geometry.SridType
- Database.Esqueleto.Postgis.Hex: Hex :: ByteString -> Hex
- Database.Esqueleto.Postgis.Hex: newtype Hex
- Database.Esqueleto.Postgis.Hex: safeConvert :: (ByteString -> Either String GeospatialGeometry) -> Hex -> Either String GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Endian: BigEndian :: EndianType
- Database.Esqueleto.Postgis.Wkb.Endian: LittleEndian :: EndianType
- Database.Esqueleto.Postgis.Wkb.Endian: builderDouble :: EndianType -> Double -> Builder
- Database.Esqueleto.Postgis.Wkb.Endian: builderEndianType :: EndianType -> Builder
- Database.Esqueleto.Postgis.Wkb.Endian: builderFourBytes :: EndianType -> Word32 -> Builder
- Database.Esqueleto.Postgis.Wkb.Endian: data EndianType
- Database.Esqueleto.Postgis.Wkb.Endian: getDouble :: EndianType -> Get Double
- Database.Esqueleto.Postgis.Wkb.Endian: getEndianType :: Get EndianType
- Database.Esqueleto.Postgis.Wkb.Endian: getFourBytes :: EndianType -> Get Word32
- Database.Esqueleto.Postgis.Wkb.Endian: instance GHC.Classes.Eq Database.Esqueleto.Postgis.Wkb.Endian.EndianType
- Database.Esqueleto.Postgis.Wkb.Endian: instance GHC.Show.Show Database.Esqueleto.Postgis.Wkb.Endian.EndianType
- Database.Esqueleto.Postgis.Wkb.Geometry: Geometry :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: GeometryCollection :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: LineString :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: M :: CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: MultiLineString :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: MultiPoint :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: MultiPolygon :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: Point :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: Polygon :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: TwoD :: CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: WkbGeom :: GeometryType -> CoordinateType -> WkbGeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: Z :: CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: ZM :: CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: builderWkbGeom :: EndianType -> WkbGeometryType -> Builder
- Database.Esqueleto.Postgis.Wkb.Geometry: coordTypeOfLinearRings :: Seq (LinearRing GeoPositionWithoutCRS) -> CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: coordTypeOfSequence :: Seq GeoPositionWithoutCRS -> CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: data CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: data GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: data WkbGeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: geoPositionWithoutCRSToCoordinateType :: GeoPositionWithoutCRS -> Maybe CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: getWkbGeom :: EndianType -> Get WkbGeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: instance GHC.Classes.Eq Database.Esqueleto.Postgis.Wkb.Geometry.CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: instance GHC.Classes.Eq Database.Esqueleto.Postgis.Wkb.Geometry.GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: instance GHC.Classes.Eq Database.Esqueleto.Postgis.Wkb.Geometry.WkbGeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: instance GHC.Show.Show Database.Esqueleto.Postgis.Wkb.Geometry.CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: instance GHC.Show.Show Database.Esqueleto.Postgis.Wkb.Geometry.GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: instance GHC.Show.Show Database.Esqueleto.Postgis.Wkb.Geometry.WkbGeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: type BuilderWkbGeometryType = EndianType -> WkbGeometryType -> Builder
- Database.Esqueleto.Postgis.Wkb.GeometryCollection: builderGeometryCollection :: BuilderGeospatialFeature -> BuilderWkbGeometryType -> EndianType -> Seq GeospatialGeometry -> Builder
- Database.Esqueleto.Postgis.Wkb.GeometryCollection: getEnclosedFeature :: (EndianType -> Get WkbGeometryType) -> GeometryType -> (EndianType -> CoordinateType -> Get feature) -> Get feature
- Database.Esqueleto.Postgis.Wkb.GeometryCollection: getGeometryCollection :: Get GeospatialGeometry -> EndianType -> CoordinateType -> Get GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Geospatial: builderGeospatialGeometry :: BuilderWkbGeometryType -> EndianType -> GeospatialGeometry -> Builder
- Database.Esqueleto.Postgis.Wkb.Geospatial: getGeospatialGeometry :: (EndianType -> Get WkbGeometryType) -> Get GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Line: builderLine :: BuilderWkbGeometryType -> EndianType -> GeoLine -> Builder
- Database.Esqueleto.Postgis.Wkb.Line: builderMultiLine :: BuilderWkbGeometryType -> EndianType -> GeoMultiLine -> Builder
- Database.Esqueleto.Postgis.Wkb.Line: getLine :: EndianType -> CoordinateType -> Get GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Line: getMultiLine :: (EndianType -> Get WkbGeometryType) -> EndianType -> CoordinateType -> Get GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Point: builderCoordPoint :: EndianType -> GeoPositionWithoutCRS -> Builder
- Database.Esqueleto.Postgis.Wkb.Point: builderCoordPoints :: EndianType -> Seq GeoPositionWithoutCRS -> Builder
- Database.Esqueleto.Postgis.Wkb.Point: builderMultiPoint :: BuilderWkbGeometryType -> EndianType -> GeoMultiPoint -> Builder
- Database.Esqueleto.Postgis.Wkb.Point: builderPoint :: BuilderWkbGeometryType -> EndianType -> GeoPoint -> Builder
- Database.Esqueleto.Postgis.Wkb.Point: getCoordPoint :: EndianType -> CoordinateType -> Get GeoPositionWithoutCRS
- Database.Esqueleto.Postgis.Wkb.Point: getCoordPoints :: EndianType -> CoordinateType -> Word32 -> Get (Seq GeoPositionWithoutCRS)
- Database.Esqueleto.Postgis.Wkb.Point: getGeoPoint :: EndianType -> CoordinateType -> Get GeoPoint
- Database.Esqueleto.Postgis.Wkb.Point: getMultiPoint :: (EndianType -> Get WkbGeometryType) -> EndianType -> CoordinateType -> Get GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Point: getPoint :: EndianType -> CoordinateType -> Get GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Polygon: builderMultiPolygon :: BuilderWkbGeometryType -> EndianType -> GeoMultiPolygon -> Builder
- Database.Esqueleto.Postgis.Wkb.Polygon: builderPolygon :: BuilderWkbGeometryType -> EndianType -> GeoPolygon -> Builder
- Database.Esqueleto.Postgis.Wkb.Polygon: getMultiPolygon :: (EndianType -> Get WkbGeometryType) -> EndianType -> CoordinateType -> Get GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Polygon: getPolygon :: EndianType -> CoordinateType -> Get GeospatialGeometry
+ Database.Esqueleto.Postgis.Ewkb: EwkbGeom :: WkbGeometryType -> SridType -> EwkbGeometryType
+ Database.Esqueleto.Postgis.Ewkb: NoSrid :: SridType
+ Database.Esqueleto.Postgis.Ewkb: Srid :: Word32 -> SridType
+ Database.Esqueleto.Postgis.Ewkb: builderEwkbGeom :: EndianType -> EwkbGeometryType -> Builder
+ Database.Esqueleto.Postgis.Ewkb: builderWkbGeom :: EndianType -> WkbGeometryType -> Builder
+ Database.Esqueleto.Postgis.Ewkb: data EwkbGeometryType
+ Database.Esqueleto.Postgis.Ewkb: data SridType
+ Database.Esqueleto.Postgis.Ewkb: getEwkbGeom :: EndianType -> Get EwkbGeometryType
+ Database.Esqueleto.Postgis.Ewkb: getWkbGeom :: EndianType -> Get WkbGeometryType
+ Database.Esqueleto.Postgis.Wkb: BigEndian :: EndianType
+ Database.Esqueleto.Postgis.Wkb: Geometry :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: GeometryCollection :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: LineString :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: LittleEndian :: EndianType
+ Database.Esqueleto.Postgis.Wkb: M :: CoordinateType
+ Database.Esqueleto.Postgis.Wkb: MultiLineString :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: MultiPoint :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: MultiPolygon :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: Point :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: Polygon :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: TwoD :: CoordinateType
+ Database.Esqueleto.Postgis.Wkb: WkbGeom :: GeometryType -> CoordinateType -> WkbGeometryType
+ Database.Esqueleto.Postgis.Wkb: Z :: CoordinateType
+ Database.Esqueleto.Postgis.Wkb: ZM :: CoordinateType
+ Database.Esqueleto.Postgis.Wkb: builderCoordPoint :: EndianType -> GeoPositionWithoutCRS -> Builder
+ Database.Esqueleto.Postgis.Wkb: builderCoordPoints :: EndianType -> Seq GeoPositionWithoutCRS -> Builder
+ Database.Esqueleto.Postgis.Wkb: builderDouble :: EndianType -> Double -> Builder
+ Database.Esqueleto.Postgis.Wkb: builderEndianType :: EndianType -> Builder
+ Database.Esqueleto.Postgis.Wkb: builderFourBytes :: EndianType -> Word32 -> Builder
+ Database.Esqueleto.Postgis.Wkb: builderMultiPoint :: BuilderWkbGeometryType -> EndianType -> GeoMultiPoint -> Builder
+ Database.Esqueleto.Postgis.Wkb: builderPoint :: BuilderWkbGeometryType -> EndianType -> GeoPoint -> Builder
+ Database.Esqueleto.Postgis.Wkb: builderWkbGeom :: EndianType -> WkbGeometryType -> Builder
+ Database.Esqueleto.Postgis.Wkb: coordTypeOfLinearRings :: Seq (LinearRing GeoPositionWithoutCRS) -> CoordinateType
+ Database.Esqueleto.Postgis.Wkb: coordTypeOfSequence :: Seq GeoPositionWithoutCRS -> CoordinateType
+ Database.Esqueleto.Postgis.Wkb: data CoordinateType
+ Database.Esqueleto.Postgis.Wkb: data EndianType
+ Database.Esqueleto.Postgis.Wkb: data GeometryType
+ Database.Esqueleto.Postgis.Wkb: data WkbGeometryType
+ Database.Esqueleto.Postgis.Wkb: geoPositionWithoutCRSToCoordinateType :: GeoPositionWithoutCRS -> Maybe CoordinateType
+ Database.Esqueleto.Postgis.Wkb: getCoordPoint :: EndianType -> CoordinateType -> Get GeoPositionWithoutCRS
+ Database.Esqueleto.Postgis.Wkb: getCoordPoints :: EndianType -> CoordinateType -> Word32 -> Get (Seq GeoPositionWithoutCRS)
+ Database.Esqueleto.Postgis.Wkb: getDouble :: EndianType -> Get Double
+ Database.Esqueleto.Postgis.Wkb: getEndianType :: Get EndianType
+ Database.Esqueleto.Postgis.Wkb: getFourBytes :: EndianType -> Get Word32
+ Database.Esqueleto.Postgis.Wkb: getGeoPoint :: EndianType -> CoordinateType -> Get GeoPoint
+ Database.Esqueleto.Postgis.Wkb: getMultiPoint :: (EndianType -> Get WkbGeometryType) -> EndianType -> CoordinateType -> Get GeospatialGeometry
+ Database.Esqueleto.Postgis.Wkb: getPoint :: EndianType -> CoordinateType -> Get GeospatialGeometry
+ Database.Esqueleto.Postgis.Wkb: getWkbGeom :: EndianType -> Get WkbGeometryType
+ Database.Esqueleto.Postgis.Wkb: type BuilderWkbGeometryType = EndianType -> WkbGeometryType -> Builder
- Database.Esqueleto.Postgis.Ewkb: parseHexByteString :: Hex -> Either String GeospatialGeometry
+ Database.Esqueleto.Postgis.Ewkb: parseHexByteString :: Base16 ByteString -> Either String GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb: parseHexByteString :: Hex -> Either String GeospatialGeometry
+ Database.Esqueleto.Postgis.Wkb: parseHexByteString :: Base16 ByteString -> Either String GeospatialGeometry
Files
- Changelog.md +5/−0
- esqueleto-postgis.cabal +7/−8
- src/Database/Esqueleto/Postgis.hs +5/−4
- src/Database/Esqueleto/Postgis/Ewkb.hs +15/−9
- src/Database/Esqueleto/Postgis/Hex.hs +0/−23
- src/Database/Esqueleto/Postgis/Wkb.hs +21/−8
- test/Data/SpecHelper.hs +3/−4
- test/Ewkb/GeometrySpec.hs +3/−3
- test/Test.hs +0/−2
- test/Wkb/EndianSpec.hs +1/−1
- test/Wkb/GeometrySpec.hs +2/−2
- test/Wkb/HexParsingSpec.hs +0/−31
- test/Wkb/PointSpec.hs +2/−2
Changelog.md view
@@ -1,5 +1,10 @@ # Change log for esqueleto-postgis project +## Version 2.0.0 +* Hide irrelevant modules+* delete hex module, use base16 hex approach instead.+* Much better docs that explain what's going on.+ ## Version 1.2.0 + re-export point, less annoying to use. + adopt wkt-geom package and put it in as a submodule,
esqueleto-postgis.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: esqueleto-postgis-version: 1.2.0+version: 2.0.0 homepage: https://github.com/jappeace/esqueleto-postgis#readme bug-reports: https://github.com/jappeace/esqueleto-postgis/issues author: Jappie Klooster@@ -64,7 +64,7 @@ esqueleto >= 3.5.10 && < 3.7, text >= 1.2.5 && < 2.2, persistent >= 2.13.3 && < 2.19,- geojson >= 4.1.0 && < 4.2,+ geojson >= 4.1.1 && < 4.2, bytestring < 2, base16 >= 1.0 && < 1.1, binary < 1,@@ -77,16 +77,16 @@ exposed-modules: Database.Esqueleto.Postgis Database.Esqueleto.Postgis.Ewkb- Database.Esqueleto.Postgis.Hex- Database.Esqueleto.Postgis.Ewkb.Geometry+ Database.Esqueleto.Postgis.Wkb+ other-modules: Database.Esqueleto.Postgis.Wkb.Endian+ Database.Esqueleto.Postgis.Wkb.Point Database.Esqueleto.Postgis.Wkb.Geometry+ Database.Esqueleto.Postgis.Ewkb.Geometry Database.Esqueleto.Postgis.Wkb.GeometryCollection- Database.Esqueleto.Postgis.Wkb.Geospatial Database.Esqueleto.Postgis.Wkb.Line- Database.Esqueleto.Postgis.Wkb.Point Database.Esqueleto.Postgis.Wkb.Polygon- Database.Esqueleto.Postgis.Wkb+ Database.Esqueleto.Postgis.Wkb.Geospatial hs-source-dirs: src@@ -104,7 +104,6 @@ Wkb.EndianSpec Wkb.GeometryCollectionSpec Wkb.GeometrySpec- Wkb.HexParsingSpec Wkb.LineSpec Wkb.PointSpec Wkb.PolygonSpec
src/Database/Esqueleto/Postgis.hs view
@@ -32,7 +32,6 @@ import Data.Foldable (Foldable (toList), fold) import Data.Geospatial (GeoPoint (..), GeoPositionWithoutCRS (..), GeospatialGeometry, PointXY (..), PointXYZ (..), PointXYZM (..)) import Data.Geospatial qualified as Geospatial-import Database.Esqueleto.Postgis.Hex (Hex (..)) import Data.LineString (LineString, fromLineString, lineStringHead) import Data.LinearRing (LinearRing, fromLinearRing, makeLinearRing, ringHead, toSeq) import Data.List qualified as List@@ -49,6 +48,8 @@ import Database.Esqueleto.Experimental (SqlExpr, Value) import Database.Esqueleto.Internal.Internal (unsafeSqlFunction) import Database.Persist.Sql+import Data.Base16.Types(assertBase16)+import Data.ByteString(fromStrict) -- | unwrap postgis geometry so you can for example return it from an API getPoints :: PostgisGeometry point -> NonEmpty point@@ -205,7 +206,7 @@ toPersistValue geom = PersistText $ toStrict $ toLazyText $ renderGeometry $ renderPair <$> geom fromPersistValue (PersistLiteral_ Escaped bs) = do- result <- first pack $ parseHexByteString (Hex bs)+ result <- first pack $ parseHexByteString $ assertBase16 $ fromStrict bs first tshow $ (from2dGeospatialGeometry from2dGeoPositionWithoutCRSToPoint) result fromPersistValue other = Left ("PersistField.Polygon: invalid persist value:" <> tshow other) @@ -213,7 +214,7 @@ toPersistValue geom = PersistText $ toStrict $ toLazyText $ renderGeometry $ renderXYZ <$> geom fromPersistValue (PersistLiteral_ Escaped bs) = do- result <- first pack $ parseHexByteString (Hex bs)+ result <- first pack $ parseHexByteString $ assertBase16 $ fromStrict bs first tshow $ (from2dGeospatialGeometry from3dGeoPositionWithoutCRSToPoint) result fromPersistValue other = Left ("PersistField.Polygon: invalid persist value:" <> tshow other) @@ -221,7 +222,7 @@ toPersistValue geom = PersistText $ toStrict $ toLazyText $ renderGeometry $ renderXYZM <$> geom fromPersistValue (PersistLiteral_ Escaped bs) = do- result <- first pack $ parseHexByteString (Hex bs)+ result <- first pack $ parseHexByteString $ assertBase16 $ fromStrict bs first tshow $ (from2dGeospatialGeometry from4dGeoPositionWithoutCRSToPoint) result fromPersistValue other = Left ("PersistField.Polygon: invalid persist value:" <> tshow other)
src/Database/Esqueleto/Postgis/Ewkb.hs view
@@ -1,4 +1,4 @@--- | I copied these because the original libraryy doesn't+-- I copied these because the original libraryy doesn't -- appear to be maintained. -- I'm only interested in this parseHexBytestring function. --@@ -7,27 +7,33 @@ -- Apache license -- ----- Refer to the eWKB Postgis Documentation <https://postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT>+-- | Ewkb is the basis for postgis in postgres.+-- This module Allows parsing of ByteString into a Geospatial Object. ----- Allows parsing of ByteString into a Geospatial Object.+-- These functions are used in the instance 'Database.Persist.Class.PersistField' instance+-- to parse the database base16 output into types we can use. ----------------------------------------------------------------------+-- Refer to the eWKB Postgis Documentation <https://postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT>+-- module Database.Esqueleto.Postgis.Ewkb ( parseByteString , parseHexByteString , toByteString+ -- * Core+ -- | the greasy gears inside for experienced users or the brave!+ , module EwkbGeometry ) where import qualified Data.Binary.Get as BinaryGet import qualified Data.ByteString.Builder as ByteStringBuilder import qualified Data.ByteString.Lazy as LazyByteString import qualified Data.Geospatial as Geospatial-import qualified Database.Esqueleto.Postgis.Hex as Hex -import qualified Database.Esqueleto.Postgis.Ewkb.Geometry as EwkbGeometry+import Database.Esqueleto.Postgis.Ewkb.Geometry as EwkbGeometry import qualified Database.Esqueleto.Postgis.Wkb.Endian as Endian import qualified Database.Esqueleto.Postgis.Wkb.Geospatial as WkbGeospatial-+import Data.ByteString.Lazy.Base16(decodeBase16)+import Data.Base16.Types(Base16) -- | -- Representation of EWKB as Binary parseByteString :: LazyByteString.ByteString -> Either String Geospatial.GeospatialGeometry@@ -40,8 +46,8 @@ -- | -- Representation of EWKB as a String in Base16/Hex form i.e. "0101000000000000000000f03f0000000000000040" is POINT 1.0 2.0-parseHexByteString :: Hex.Hex -> Either String Geospatial.GeospatialGeometry-parseHexByteString = Hex.safeConvert parseByteString+parseHexByteString :: Base16 LazyByteString.ByteString -> Either String Geospatial.GeospatialGeometry+parseHexByteString = parseByteString . decodeBase16 -- | -- Produce the binary representation of EWKB given its EndianType (Little or Big - Intel is Little) and SRID (4326 for example).
− src/Database/Esqueleto/Postgis/Hex.hs
@@ -1,23 +0,0 @@---- | friendly copied from github.com/zellige/wkt-geom.git--- Copyright 2017-2018 wkt-geom Project--- Apache license-module Database.Esqueleto.Postgis.Hex- ( safeConvert- , Hex(..)- ) where--import qualified Data.ByteString as ByteString-import qualified Data.ByteString.Base16 as ByteStringBase16-import qualified Data.ByteString.Char8 as ByteStringChar8-import qualified Data.ByteString.Lazy as LazyByteString-import qualified Data.Geospatial as Geospatial--newtype Hex = Hex ByteString.ByteString--safeConvert :: (LazyByteString.ByteString -> Either String Geospatial.GeospatialGeometry) -> Hex -> Either String Geospatial.GeospatialGeometry-safeConvert f (Hex byteString) =- case ByteStringBase16.decodeBase16Untyped byteString of- Left _ -> Left $ "Invalid hex representation: " <> ByteStringChar8.unpack byteString- Right decoded -> f $ LazyByteString.fromStrict decoded-
src/Database/Esqueleto/Postgis/Wkb.hs view
@@ -1,23 +1,36 @@--- Refer to the WKB Wikipedia page <https://en.wikipedia.org/wiki/Well-known_text#Well-known_binary>+-- | Ewkb is deeply integrated into Wkb, which is why we kept this around.+-- For postgis we mostly want Ewkb. ----- Allows parsing of ByteString into a Geospatial Object.+-- This module Allows parsing of ByteString into a Geospatial Object,+-- and provides foundational elements for constructing an Ewkb. ----------------------------------------------------------------------+-- Refer to the WKB Wikipedia page <https://en.wikipedia.org/wiki/Well-known_text#Well-known_binary> module Database.Esqueleto.Postgis.Wkb ( parseByteString , parseHexByteString , toByteString+ -- * Core+ -- | the greasy gears inside for experienced users or the brave!++ -- ** Geometry+ , module Geometry+ -- ** Endian+ , module Endian+ -- ** Point+ , module Point ) where import qualified Data.Binary.Get as BinaryGet import qualified Data.ByteString.Builder as ByteStringBuilder import qualified Data.ByteString.Lazy as LazyByteString import qualified Data.Geospatial as Geospatial-import qualified Database.Esqueleto.Postgis.Hex as Hex -import qualified Database.Esqueleto.Postgis.Wkb.Endian as Endian-import qualified Database.Esqueleto.Postgis.Wkb.Geometry as Geometry+import Database.Esqueleto.Postgis.Wkb.Endian as Endian+import Database.Esqueleto.Postgis.Wkb.Geometry as Geometry+import Database.Esqueleto.Postgis.Wkb.Point as Point import qualified Database.Esqueleto.Postgis.Wkb.Geospatial as WkbGeospatial+import Data.ByteString.Lazy.Base16(decodeBase16)+import Data.Base16.Types(Base16) -- | -- Representation of WKB as Binary@@ -31,8 +44,8 @@ -- | -- Representation of WKB as a String in Base16/Hex form i.e. "0101000000000000000000f03f0000000000000040" is POINT 1.0 2.0-parseHexByteString :: Hex.Hex -> Either String Geospatial.GeospatialGeometry-parseHexByteString = Hex.safeConvert parseByteString+parseHexByteString :: Base16 LazyByteString.ByteString -> Either String Geospatial.GeospatialGeometry+parseHexByteString = parseByteString . decodeBase16 -- | -- Produce the binary representation of WKB given its EndianType (Little or Big - Intel is Little). Use EWKB when you know the SRID.
test/Data/SpecHelper.hs view
@@ -12,9 +12,8 @@ import Test.Hspec (Spec, it) import qualified Database.Esqueleto.Postgis.Ewkb as Ewkb-import qualified Database.Esqueleto.Postgis.Ewkb.Geometry as EwkbGeometry-import qualified Database.Esqueleto.Postgis.Wkb.Endian as Endian-import qualified Database.Esqueleto.Postgis.Wkb.Geometry as Geometry+import qualified Database.Esqueleto.Postgis.Wkb as Endian+import qualified Database.Esqueleto.Postgis.Wkb as Geometry import qualified Database.Esqueleto.Postgis.Wkb as Wkb -- Helpers@@ -47,7 +46,7 @@ roundTripEwkb :: MonadTest m => Endian.EndianType -> Geospatial.GeospatialGeometry -> m () roundTripEwkb endianType geometry = let- p = Ewkb.parseByteString . Ewkb.toByteString endianType (EwkbGeometry.Srid (4326 :: Word.Word32))+ p = Ewkb.parseByteString . Ewkb.toByteString endianType (Ewkb.Srid (4326 :: Word.Word32)) in p geometry === Right geometry
test/Ewkb/GeometrySpec.hs view
@@ -7,9 +7,9 @@ import qualified Data.Word as Word import Test.Hspec (Spec, describe, it, shouldBe) -import qualified Database.Esqueleto.Postgis.Ewkb.Geometry as Ewkb-import qualified Database.Esqueleto.Postgis.Wkb.Endian as Endian-import qualified Database.Esqueleto.Postgis.Wkb.Geometry as Wkb+import qualified Database.Esqueleto.Postgis.Ewkb as Ewkb+import qualified Database.Esqueleto.Postgis.Wkb as Endian+import qualified Database.Esqueleto.Postgis.Wkb as Wkb spec :: Spec spec =
test/Test.hs view
@@ -55,7 +55,6 @@ import qualified Wkb.EndianSpec import qualified Wkb.GeometryCollectionSpec import qualified Wkb.GeometrySpec-import qualified Wkb.HexParsingSpec import qualified Wkb.LineSpec import qualified Wkb.PointSpec import qualified Wkb.PolygonSpec@@ -114,7 +113,6 @@ testSpec "Wkb.EndianSpec" Wkb.EndianSpec.spec, testSpec "Wkb.GeometryCollectionSpec" Wkb.GeometryCollectionSpec.spec, testSpec "Wkb.GeometrySpec" Wkb.GeometrySpec.spec,- testSpec "Wkb.HexParsingSpec" Wkb.HexParsingSpec.spec, testSpec "Wkb.LineSpec" Wkb.LineSpec.spec, testSpec "Wkb.PointSpec" Wkb.PointSpec.spec, testSpec "Wkb.PolygonSpec" Wkb.PolygonSpec.spec
test/Wkb/EndianSpec.hs view
@@ -6,7 +6,7 @@ import qualified Data.ByteString.Builder as ByteStringBuilder import Test.Hspec (Spec, describe, it, shouldBe) -import qualified Database.Esqueleto.Postgis.Wkb.Endian as Endian+import qualified Database.Esqueleto.Postgis.Wkb as Endian spec :: Spec spec =
test/Wkb/GeometrySpec.hs view
@@ -6,8 +6,8 @@ import qualified Data.ByteString.Builder as ByteStringBuilder import Test.Hspec (Spec, describe, it, shouldBe) -import qualified Database.Esqueleto.Postgis.Wkb.Endian as Endian-import qualified Database.Esqueleto.Postgis.Wkb.Geometry as Geometry+import qualified Database.Esqueleto.Postgis.Wkb as Endian+import qualified Database.Esqueleto.Postgis.Wkb as Geometry spec :: Spec spec =
− test/Wkb/HexParsingSpec.hs
@@ -1,31 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module Wkb.HexParsingSpec where--import qualified Data.Geospatial as Geospatial-import Test.Hspec (Spec, describe, it, shouldBe)--import qualified Database.Esqueleto.Postgis.Hex as Hex-import qualified Database.Esqueleto.Postgis.Wkb as Wkb--spec :: Spec-spec =- testWkbHexParsing--testWkbHexParsing :: Spec-testWkbHexParsing =- describe "Test hex encoded wkb point" $ do- it "Parse valid hex wkb" $- Wkb.parseHexByteString exampleHexPoint `shouldBe` Right expectedPoint- it "Not parse valid hex but invalid wkb" $- Wkb.parseHexByteString (Hex.Hex "deadbeef") `shouldBe` Left "Could not parse wkb: Invalid EndianType"- it "Some valid, some invalid hex" $- Wkb.parseHexByteString (Hex.Hex "deadfish") `shouldBe` Left "Invalid hex representation: deadfish"- it "All bad" $- Wkb.parseHexByteString (Hex.Hex "cowboyx") `shouldBe` Left "Invalid hex representation: cowboyx"--exampleHexPoint :: Hex.Hex-exampleHexPoint = Hex.Hex "0101000000000000000000f03f0000000000000040"--expectedPoint :: Geospatial.GeospatialGeometry-expectedPoint = Geospatial.Point (Geospatial.GeoPoint (Geospatial.GeoPointXY (Geospatial.PointXY 1.0 2.0)))
test/Wkb/PointSpec.hs view
@@ -9,8 +9,8 @@ import Hedgehog import Test.Hspec (Spec, describe, it) -import qualified Database.Esqueleto.Postgis.Wkb.Geometry as Geometry-import qualified Database.Esqueleto.Postgis.Wkb.Point as Point+import qualified Database.Esqueleto.Postgis.Wkb as Geometry+import qualified Database.Esqueleto.Postgis.Wkb as Point import qualified Data.SpecHelper as SpecHelper spec :: Spec