@@ -4,32 +4,33 @@ defmodule PgInterop.Interval.PostgresAndSQLParser do
44 """
55 alias PgInterop.Interval
66
7- @ parse_part_regexes [
8- unmarked_end: ~r/ (?<=\s |^)(?<second>(?:\+ |-)?\s *\d +(?:\. \d +)?)(?=\s *$)/ ,
9- microsecond:
10- ~r/ (?<=\s |^)(?<microsecond>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:us|usecs?|microseconds?)(?=\s |$)/ ,
11- millisecond:
12- ~r/ (?<=\s |^)(?<millisecond>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:ms|msecs?|milliseconds?)(?=\s |$)/ ,
13- second: ~r/ (?<=\s |^)(?<second>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:s|secs?|seconds?)(?=\s |$)/ ,
14- minute: ~r/ (?<=\s |^)(?<minute>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:m|mins?|minutes?)(?=\s |$)/ ,
15- hour: ~r/ (?<=\s |^)(?<hour>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:h|hours?)(?=\s |$)/ ,
16- day: ~r/ (?<=\s |^)(?<day>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:d|days?)(?=\s |$)/ ,
17- week: ~r/ (?<=\s |^)(?<week>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:w|weeks?)(?=\s |$)/ ,
18- month: ~r/ (?<=\s |^)(?<month>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:m|mons?|months?)(?=\s |$)/ ,
19- year: ~r/ (?<=\s |^)(?<year>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:y|years?)(?=\s |$)/ ,
20- decade: ~r/ (?<=\s |^)(?<decade>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:decs?|decades?)(?=\s |$)/ ,
21- century:
22- ~r/ (?<=\s |^)(?<century>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:c|cent|century|centuries)(?=\s |$)/ ,
23- millennium:
24- ~r/ (?<=\s |^)(?<millennium>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:mils|millenniums)(?=\s |$)/ ,
25- sql_ym: ~r/ (?<=\s |^)(?<sign>\+ |-)?\s *(?<year>\d +)-(?<month>\- ?\d +)(?=\s |$)/ ,
26- sql_dhm:
27- ~r/ (?<=\s |^)(?<day>(?:\+ |-)?\s *\d +(?:\. \d +)?)?\s +(?<sign>\+ |-)?\s *(?<hour>\d +):(?<minute>\d +)(?=\s |$)/ ,
28- sql_dhms:
29- ~r/ (?<=\s |^)(?<day>(?:\+ |-)?\s *\d +(?:\. \d +)?)?\s +(?<sign>\+ |-)?\s *(?<hour>\d +):(?<minute>\d +):(?<second>\d +(?:\. \d +)?)(?=\s |$)/ ,
30- sql_dms:
31- ~r/ (?<=\s |^)(?<day>(?:\+ |-)?\s *\d +(?:\. \d +)?)?\s +(?<sign>\+ |-)?\s *(?<minute>\d +):(?<second>\d +\. \d +)(?=\s |$)/
32- ]
7+ defp parse_part_regexes ,
8+ do: [
9+ unmarked_end: ~r/ (?<=\s |^)(?<second>(?:\+ |-)?\s *\d +(?:\. \d +)?)(?=\s *$)/ ,
10+ microsecond:
11+ ~r/ (?<=\s |^)(?<microsecond>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:us|usecs?|microseconds?)(?=\s |$)/ ,
12+ millisecond:
13+ ~r/ (?<=\s |^)(?<millisecond>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:ms|msecs?|milliseconds?)(?=\s |$)/ ,
14+ second: ~r/ (?<=\s |^)(?<second>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:s|secs?|seconds?)(?=\s |$)/ ,
15+ minute: ~r/ (?<=\s |^)(?<minute>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:m|mins?|minutes?)(?=\s |$)/ ,
16+ hour: ~r/ (?<=\s |^)(?<hour>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:h|hours?)(?=\s |$)/ ,
17+ day: ~r/ (?<=\s |^)(?<day>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:d|days?)(?=\s |$)/ ,
18+ week: ~r/ (?<=\s |^)(?<week>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:w|weeks?)(?=\s |$)/ ,
19+ month: ~r/ (?<=\s |^)(?<month>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:m|mons?|months?)(?=\s |$)/ ,
20+ year: ~r/ (?<=\s |^)(?<year>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:y|years?)(?=\s |$)/ ,
21+ decade: ~r/ (?<=\s |^)(?<decade>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:decs?|decades?)(?=\s |$)/ ,
22+ century:
23+ ~r/ (?<=\s |^)(?<century>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:c|cent|century|centuries)(?=\s |$)/ ,
24+ millennium:
25+ ~r/ (?<=\s |^)(?<millennium>(?:\+ |-)?\s *\d +(?:\. \d +)?)\s *(?:mils|millenniums)(?=\s |$)/ ,
26+ sql_ym: ~r/ (?<=\s |^)(?<sign>\+ |-)?\s *(?<year>\d +)-(?<month>\- ?\d +)(?=\s |$)/ ,
27+ sql_dhm:
28+ ~r/ (?<=\s |^)(?<day>(?:\+ |-)?\s *\d +(?:\. \d +)?)?\s +(?<sign>\+ |-)?\s *(?<hour>\d +):(?<minute>\d +)(?=\s |$)/ ,
29+ sql_dhms:
30+ ~r/ (?<=\s |^)(?<day>(?:\+ |-)?\s *\d +(?:\. \d +)?)?\s +(?<sign>\+ |-)?\s *(?<hour>\d +):(?<minute>\d +):(?<second>\d +(?:\. \d +)?)(?=\s |$)/ ,
31+ sql_dms:
32+ ~r/ (?<=\s |^)(?<day>(?:\+ |-)?\s *\d +(?:\. \d +)?)?\s +(?<sign>\+ |-)?\s *(?<minute>\d +):(?<second>\d +\. \d +)(?=\s |$)/
33+ ]
3334
3435 @ doc """
3536 Parses an Postgres classic and SQL formatted duration string into
@@ -105,7 +106,7 @@ defmodule PgInterop.Interval.PostgresAndSQLParser do
105106
106107 def parse ( str ) do
107108 { parsed_parts , rest } =
108- Enum . map_reduce ( @ parse_part_regexes , str , fn { key , regex } , str ->
109+ Enum . map_reduce ( parse_part_regexes ( ) , str , fn { key , regex } , str ->
109110 { { key , Regex . named_captures ( regex , str ) } , Regex . replace ( regex , str , "" ) }
110111 end )
111112
0 commit comments