๐Ÿ“ฆ PeDro0210 / PostgreSQL-Concurrency-BenchMark

๐Ÿ“„ SqlParser.hs ยท 47 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47module Parsers.SqlParser where

import Data.List (isSuffixOf)

parser :: String -> String -> IO [[String]]
parser file null_val = do
  contents <- readFile file
  let lines = words contents

  -- acumulator example
  let (_, _, query_list) =
        -- ik this ain't pure cause is mutating, but I couldn't find another solution
        foldl
          ( \(actualQuery, actualQueryFamily, queriesFamily) line ->
              queryConcatenator
                line
                null_val
                actualQuery
                actualQueryFamily
                queriesFamily
          )
          ("", [], [])
          lines
  return query_list

queryConcatenator :: String -> String -> String -> [String] -> [[String]] -> (String, [String], [[String]])
queryConcatenator -- ngl, like the way the hsl refactors code
  line
  null_val
  currentQuery
  currentQueryFamily
  completedQueriesFamily
    | null_val `isSuffixOf` line -- pattern for the null_val (separator)
      =
        ( "",
          [],
          completedQueriesFamily ++ [currentQueryFamily] -- appends to the family
        )
    | ";" `isSuffixOf` line -- for setting end of a query
      =
        let fullQuery = currentQuery ++ line
         in ("", currentQueryFamily ++ [fullQuery], completedQueriesFamily)
    | otherwise -- self-explanatory asf
      =
        let newCurrent = currentQuery ++ line ++ " "
         in (newCurrent, currentQueryFamily, completedQueriesFamily)