1
Fork 0

add support for a bunch of keyword binary operators

This commit is contained in:
Jake Wheat 2013-12-13 21:41:50 +02:00
parent 546d9b023d
commit b14af47773
2 changed files with 29 additions and 13 deletions
Language/SQL/SimpleSQL
Tests.lhs

View file

@ -227,7 +227,18 @@ to be.
> ,"||"]
> binOpKeywordNames :: [String]
> binOpKeywordNames = ["and", "or", "like"]
> binOpKeywordNames = ["and", "or", "like"
> ,"overlaps"]
> binOpMultiKeywordNames :: [[String]]
> binOpMultiKeywordNames = map words
> ["not like"
> ,"not similar"
> ,"is similar to"
> ,"is not similar to"
> ,"is distinct from"
> ,"is not distinct from"]
used for between parsing
@ -296,11 +307,16 @@ postgresql handles this
> ,betweenSuffix e0
> ,postfixOp e0
> ] >>= trysuffix
> opSymbol = choice (map (try . symbol) binOpSymbolNames
> ++ map (try . keyword)
> (if bExpr
> then binOpKeywordNamesNoAnd
> else binOpKeywordNames))
> opSymbol = choice
> (map (try . symbol) binOpSymbolNames
> ++ map (try . keywords) binOpMultiKeywordNames
> ++ map (try . keyword)
> (if bExpr
> then binOpKeywordNamesNoAnd
> else binOpKeywordNames))
> keywords ks = intercalate " " <$> keywords' ks
> keywords' [] = return []
> keywords' (k:ks) = (:) <$> keyword k <*> keywords' ks
> sparens :: P ScalarExpr
> sparens = Parens <$> parens scalarExpr'

View file

@ -161,13 +161,13 @@
> ,("a is not false", PostfixOp "is not false" (Iden "a"))
> ,("a is unknown", PostfixOp "is unknown" (Iden "a"))
> ,("a is not unknown", PostfixOp "is not unknown" (Iden "a"))
> --,("a is distinct from b", Op "not" [])
> --,("a is not distinct from b", Op "not" [])
> --,("a like b", Op "not" [])
> --,("a not like b", Op "not" [])
> --,("a is similar to b", Op "not" [])
> --,("a is not similar to b", Op "not" [])
> --,("a overlaps b", Op "not" [])
> ,("a is distinct from b", BinOp "is distinct from" (Iden "a") (Iden "b"))
> ,("a is not distinct from b", BinOp "is not distinct from" (Iden "a") (Iden "b"))
> ,("a like b", BinOp "like" (Iden "a") (Iden "b"))
> ,("a not like b", BinOp "not like" (Iden "a") (Iden "b"))
> ,("a is similar to b", BinOp "is similar to" (Iden "a") (Iden "b"))
> ,("a is not similar to b", BinOp "is not similar to" (Iden "a") (Iden "b"))
> ,("a overlaps b", BinOp "overlaps" (Iden "a") (Iden "b"))
> --,("extract(day from t)", Op "not" [])
> ]