packages feed

txt-sushi-0.1: Setup.hs

import Distribution.PackageDescription(PackageDescription)
import Distribution.Simple
import Distribution.Simple.LocalBuildInfo(LocalBuildInfo)

import Text.ParserCombinators.Parsec

import TxtSushi.SQLParser

main = defaultMainWithHooks $ simpleUserHooks {runTests = runTxtSushiTests}

--------------------------------------------------------------------------------
-- Test code
--------------------------------------------------------------------------------

runTxtSushiTests :: Args -> Bool -> PackageDescription -> LocalBuildInfo -> IO ()
runTxtSushiTests _ _ _ _ = do
    let
        -- test statement 1
        stmt1 = SelectStatement {
                    columnSelections = [
                        ExpressionColumn {expression = ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "col1"}}},
                        AllColumnsFrom {sourceTableName = "table2"}],
                    maybeFromTable = Just (
                        InnerJoin {
                            leftJoinTable = TableIdentifier {tableName = "table1", maybeTableAlias = Nothing},
                            rightJoinTable = TableIdentifier {tableName = "table2", maybeTableAlias = Nothing},
                            onCondition = FunctionExpression {
                                sqlFunction = SQLFunction {functionName = "=", minArgCount = 2, argCountIsFixed = True},
                                functionArguments = [
                                    ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "col1"}},
                                    ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table2", columnId = "col1"}}]},
                            maybeTableAlias = Nothing}),
                    maybeWhereFilter = Nothing,
                    orderByItems = []}
        stmt1_1Txt =
            "select table1.col1, table2.* " ++
            "from table1 inner join table2 on table1.col1 = table2.col1"
        stmt1_2Txt =
            "select table1.col1, table2.* " ++
            "from table1 join table2 on table1.col1 = table2.col1"
        
        -- test statement 2
        stmt2 = SelectStatement {
                    columnSelections = [
                        ExpressionColumn {expression = ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "col1"}}},
                        AllColumnsFrom {sourceTableName = "table2"}],
                    maybeFromTable = Just (
                        InnerJoin {
                            leftJoinTable = TableIdentifier {tableName = "table1", maybeTableAlias = Nothing},
                            rightJoinTable = TableIdentifier {tableName = "table2", maybeTableAlias = Nothing},
                            onCondition = FunctionExpression {
                                sqlFunction = SQLFunction {functionName = "=", minArgCount = 2, argCountIsFixed = True},
                                functionArguments = [
                                    ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "col1"}},
                                    ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table2", columnId = "col1"}}]},
                            maybeTableAlias = Nothing}),
                    maybeWhereFilter = Just (
                        FunctionExpression {
                            sqlFunction = SQLFunction {functionName = "<>", minArgCount = 2, argCountIsFixed = True},
                            functionArguments = [
                                FunctionExpression {
                                    sqlFunction = SQLFunction {functionName = "UPPER", minArgCount = 1, argCountIsFixed = True},
                                    functionArguments = [ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "col1"}}]},
                                FunctionExpression {
                                    sqlFunction = SQLFunction {functionName = "LOWER", minArgCount = 1, argCountIsFixed = True},
                                    functionArguments = [ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "col1"}}]}]}),
                    orderByItems = []}
        stmt2_1Txt =
            "select table1.col1, table2.* " ++
            "from table1 join table2 on table1.col1 = table2.col1 " ++
            "where upper(table1.col1)<>lower(table1.col1)"
        stmt2_2Txt =
            "select table1.col1, table2.* " ++
            "from table1 join table2 on table1.col1 = table2.col1 " ++
            "where upper(table1.col1) <> lower(table1.col1)"
        
        -- test statement 3
        stmt3 = SelectStatement {
                    columnSelections = [
                        ExpressionColumn {expression = ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "col1"}}},
                        AllColumnsFrom {sourceTableName = "table2"}],
                    maybeFromTable = Just (
                        InnerJoin {
                            leftJoinTable = TableIdentifier {tableName = "table1", maybeTableAlias = Nothing},
                            rightJoinTable = TableIdentifier {tableName = "table2", maybeTableAlias = Nothing},
                            onCondition = FunctionExpression {
                                sqlFunction = SQLFunction {functionName = "=", minArgCount = 2, argCountIsFixed = True},
                                functionArguments = [
                                    ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "col1"}},
                                    ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table2", columnId = "col1"}}]},
                            maybeTableAlias = Nothing}),
                    maybeWhereFilter = Just (
                        FunctionExpression {
                            sqlFunction = SQLFunction {functionName = "<>", minArgCount = 2, argCountIsFixed = True},
                            functionArguments = [
                                FunctionExpression {
                                    sqlFunction = SQLFunction {functionName = "UPPER", minArgCount = 1, argCountIsFixed = True},
                                    functionArguments = [ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "col1"}}]},
                                FunctionExpression {
                                    sqlFunction = SQLFunction {functionName = "LOWER", minArgCount = 1, argCountIsFixed = True},
                                    functionArguments = [ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "col1"}}]}]}),
                    orderByItems = [OrderByItem {
                        orderExpression = ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "firstName"}},
                        orderAscending = True}]}
        stmt3_1Txt =
            "select table1.col1, table2.* " ++
            "from table1 join table2 on table1.col1 = table2.col1 " ++
            "where upper(table1.col1)<>lower(table1.col1) order by table1.firstName asc"
        stmt3_2Txt =
            "select table1.col1, table2.* " ++
            "from table1 join table2 on table1.col1 = table2.col1 " ++
            "where upper(table1.col1)<>lower(table1.col1) order by table1.firstName"
        stmt3_3Txt =
            "select table1.col1, table2.* " ++
            "from table1 join table2 on table1.col1 = table2.col1 " ++
            "where upper (table1.col1) <> lower ( table1.col1 ) order by  table1.firstName ascending"
        
        -- test statement 4
        stmt4 = SelectStatement {
                    columnSelections = [
                        ExpressionColumn {expression = ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "col1"}}},
                        AllColumnsFrom {sourceTableName = "table2"}],
                    maybeFromTable = Just (
                        InnerJoin {
                            leftJoinTable = TableIdentifier {tableName = "table1", maybeTableAlias = Nothing},
                            rightJoinTable = TableIdentifier {tableName = "table2", maybeTableAlias = Nothing},
                            onCondition = FunctionExpression {
                                sqlFunction = SQLFunction {functionName = "=", minArgCount = 2, argCountIsFixed = True},
                                functionArguments = [
                                    ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "col1"}},
                                    ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table2", columnId = "col1"}}]},
                            maybeTableAlias = Nothing}),
                    maybeWhereFilter = Just (
                        FunctionExpression {
                            sqlFunction = SQLFunction {functionName = "<>", minArgCount = 2, argCountIsFixed = True},
                            functionArguments = [
                                FunctionExpression {
                                    sqlFunction = SQLFunction {functionName = "UPPER", minArgCount = 1, argCountIsFixed = True},
                                    functionArguments = [ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "col1"}}]},
                                FunctionExpression {
                                    sqlFunction = SQLFunction {functionName = "LOWER", minArgCount = 1, argCountIsFixed = True},
                                    functionArguments = [ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "col1"}}]}]}),
                    orderByItems = [OrderByItem {
                        orderExpression = ColumnExpression {column = ColumnIdentifier {maybeTableName = Just "table1", columnId = "firstName"}},
                        orderAscending = False}]}
        stmt4_1Txt =
            "select table1.col1, table2.* " ++
            "from table1 join table2 on table1.col1 = table2.col1 " ++
            "where upper (table1.col1) <> lower ( table1.col1 ) order by  table1.firstName descending"
        stmt4_2Txt =
            "select table1.col1, table2.* " ++
            "from table1 join table2 on table1.col1 = table2.col1 " ++
            "where upper (table1.col1) <> lower ( table1.col1 ) order by  table1.firstName DESCENDING"
        stmt4_3Txt =
            "select table1.col1, table2.* " ++
            "from table1 join table2 on table1.col1 = table2.col1 " ++
            "where upper (table1.col1) <> lower ( table1.col1 ) order by  table1.firstName desc"
        stmt4_4Txt =
            "select table1.col1, table2.* " ++
            "from table1 join table2 on table1.col1 = table2.col1 " ++
            "where upper (table1.col1) <> lower ( table1.col1 ) order by  table1.firstName DESC"
    
    testSqlSelect stmt1 stmt1_1Txt
    testSqlSelect stmt1 stmt1_2Txt
    
    testSqlSelect stmt2 stmt2_1Txt
    testSqlSelect stmt2 stmt2_2Txt
    
    testSqlSelect stmt3 stmt3_1Txt
    testSqlSelect stmt3 stmt3_2Txt
    testSqlSelect stmt3 stmt3_3Txt

    testSqlSelect stmt4 stmt4_1Txt
    testSqlSelect stmt4 stmt4_2Txt
    testSqlSelect stmt4 stmt4_3Txt
    testSqlSelect stmt4 stmt4_4Txt

testSqlSelect :: SelectStatement -> String -> IO ()
testSqlSelect expectedResult selectStatementText = do
    let stmtParseResult = parse parseSelectStatement "" selectStatementText
        colNums = take (length selectStatementText) ([1 .. 9] ++ cycle [0 .. 9])
    putStrLn ""
    putStrLn "Testing:"
    putStrLn $ concat (map show colNums)
    putStrLn selectStatementText
    case stmtParseResult of
        Left errMsg -> error $ show errMsg
        Right selectStatement ->
            if selectStatement == expectedResult
                then
                    putStrLn "Success"
                else
                    error $ "\n" ++ (show selectStatement) ++ "\nNOT EQUAL TO\n" ++ (show expectedResult)