Parse range queries
This commit is contained in:
@@ -21,10 +21,11 @@ import qualified Data.ByteString.Char8 as BS
|
|||||||
|
|
||||||
import PgStructure (printTables, printColumns)
|
import PgStructure (printTables, printColumns)
|
||||||
import PgQuery (selectWhere)
|
import PgQuery (selectWhere)
|
||||||
|
import RangeQuery
|
||||||
|
|
||||||
import Data.Maybe (fromMaybe)
|
import Data.Maybe (fromMaybe)
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import Text.Regex.Posix ((=~))
|
import Text.Regex.TDFA ((=~))
|
||||||
import Text.Read (readMaybe)
|
import Text.Read (readMaybe)
|
||||||
|
|
||||||
data AppConfig = AppConfig {
|
data AppConfig = AppConfig {
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ selectWhere ver table qq conn = do
|
|||||||
\ from (select * from %I.%I) t"
|
\ from (select * from %I.%I) t"
|
||||||
[toSql ver, toSql table]
|
[toSql ver, toSql table]
|
||||||
|
|
||||||
|
|
||||||
whereClause :: Connection -> Query -> IO BS.ByteString
|
whereClause :: Connection -> Query -> IO BS.ByteString
|
||||||
whereClause _ [] = return ""
|
whereClause _ [] = return ""
|
||||||
whereClause conn qs =
|
whereClause conn qs =
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
|
module RangeQuery where
|
||||||
|
|
||||||
|
import Control.Applicative
|
||||||
|
import Network.HTTP.Types.Header
|
||||||
|
|
||||||
|
import Data.Ranged.Boundaries
|
||||||
|
import Data.Ranged.Ranges
|
||||||
|
|
||||||
|
import qualified Data.ByteString.Char8 as BS
|
||||||
|
import Text.Regex.TDFA ((=~))
|
||||||
|
import Text.Read (readMaybe)
|
||||||
|
|
||||||
|
import Data.Maybe (fromMaybe, listToMaybe)
|
||||||
|
|
||||||
|
rangeGeq :: Int -> Range Int
|
||||||
|
rangeGeq n =
|
||||||
|
head $ rangeUnion (singletonRange n) $ Range (BoundaryAbove n) BoundaryAboveAll
|
||||||
|
|
||||||
|
rangeLeq :: Int -> Range Int
|
||||||
|
rangeLeq n =
|
||||||
|
head $ rangeUnion (singletonRange n) $ Range BoundaryBelowAll (BoundaryBelow n)
|
||||||
|
|
||||||
|
parseRange :: String -> Maybe(Range Int)
|
||||||
|
parseRange range = do
|
||||||
|
let rangeRegex = "^([0-9]+)-([0-9]*)$" :: String
|
||||||
|
|
||||||
|
parsedRange <- listToMaybe (range =~ rangeRegex :: [[String]])
|
||||||
|
|
||||||
|
let [_, from, to] = readMaybe <$> parsedRange
|
||||||
|
let lower = fromMaybe emptyRange (rangeGeq <$> from)
|
||||||
|
let upper = fromMaybe (rangeGeq 0) (rangeLeq <$> to)
|
||||||
|
|
||||||
|
return $ rangeIntersection lower upper
|
||||||
|
|
||||||
|
requestedRange :: RequestHeaders -> Maybe(Range Int)
|
||||||
|
requestedRange hdrs = parseRange =<< BS.unpack <$> lookup hRange hdrs
|
||||||
+4
-1
@@ -15,6 +15,7 @@ executable dbapi
|
|||||||
ghc-options: -Wall
|
ghc-options: -Wall
|
||||||
other-modules: PgStructure
|
other-modules: PgStructure
|
||||||
, PgQuery
|
, PgQuery
|
||||||
|
, RangeQuery
|
||||||
other-extensions: OverloadedStrings
|
other-extensions: OverloadedStrings
|
||||||
build-depends: base >=4.6 && <5
|
build-depends: base >=4.6 && <5
|
||||||
, HDBC, HDBC-postgresql
|
, HDBC, HDBC-postgresql
|
||||||
@@ -22,6 +23,8 @@ executable dbapi
|
|||||||
, bytestring, aeson, network
|
, bytestring, aeson, network
|
||||||
, text, optparse-applicative
|
, text, optparse-applicative
|
||||||
, unordered-containers
|
, unordered-containers
|
||||||
, http-media, regex-posix
|
, regex-base
|
||||||
|
, http-media, regex-tdfa
|
||||||
|
, Ranged-sets
|
||||||
-- hs-source-dirs:
|
-- hs-source-dirs:
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
|
|||||||
Reference in New Issue
Block a user