Skip to content

Commit a3582dc

Browse files
committed
added support for esper style time windows
1 parent 51f3b40 commit a3582dc

File tree

6 files changed

+34
-6
lines changed

6 files changed

+34
-6
lines changed

lib/grammar.coffee

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,14 @@ grammar =
3636
]
3737

3838
SelectClause: [
39-
o 'SELECT Fields FROM Literal', -> new Select($2, $4, false)
40-
o 'SELECT DISTINCT Fields FROM Literal', -> new Select($3, $5, true)
39+
o 'SELECT Fields FROM Table', -> new Select($2, $4, false)
40+
o 'SELECT DISTINCT Fields FROM Table', -> new Select($3, $5, true)
41+
]
42+
43+
Table: [
44+
o 'Literal', -> new Table($1)
45+
o 'Literal WINDOW WINDOW_FUNCTION LEFT_PAREN Number RIGHT_PAREN',
46+
-> new Table($1, $2, $3, $5)
4147
]
4248

4349
WhereClause: [

lib/lexer.coffee

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class Lexer
99
bytesConsumed = @keywordToken() or
1010
@starToken() or
1111
@functionToken() or
12+
@windowExtension() or
1213
@sortOrderToken() or
1314
@seperatorToken() or
1415
@operatorToken() or
@@ -73,6 +74,13 @@ class Lexer
7374
@tokenizeFromRegex('LEFT_PAREN', /^\(/,) or
7475
@tokenizeFromRegex('RIGHT_PAREN', /^\)/,)
7576

77+
windowExtension: ->
78+
match = (/^\.(win):(length)/i).exec(@chunk)
79+
return 0 unless match
80+
@token('WINDOW', match[1])
81+
@token('WINDOW_FUNCTION', match[2])
82+
match[0].length
83+
7684
whitespaceToken: ->
7785
return 0 unless match = WHITESPACE.exec(@chunk)
7886
partMatch = match[0]

lib/nodes.coffee

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ exports.Limit = class Limit
4444
constructor: (@value) -> null
4545
toString: -> "LIMIT #{@value}"
4646

47+
exports.Table = class Table
48+
constructor: (@name, @win=null, @winFn=null, @winArg=null) -> null
49+
toString: ->
50+
if @win
51+
"#{@name}.#{@win}:#{@winFn}(#{@winArg})"
52+
else
53+
@name.toString()
54+
4755
exports.Group = class Group
4856
constructor: (@fields) ->
4957
@having = null

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "sql-parser",
33
"description": "Lexer and Parser for SQL Syntax",
4-
"version": "0.1.3",
4+
"version": "0.1.4",
55
"author": {
66
"name": "Andy Kent",
77
"email": "andy@forward.co.uk"

spec/grammar.spec.coffee

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,3 +102,9 @@ describe "SQL Grammer", ->
102102
SELECT LENGTH(`a`)
103103
FROM `my_table`
104104
"""
105+
106+
it "supports time window extensions", ->
107+
expect(parse("SELECT * FROM my_table.win:length(123)").toString()).toEqual """
108+
SELECT *
109+
FROM `my_table`.win:length(123)
110+
"""

spec/lexer.spec.coffee

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ describe "SQL Lexer", ->
2626
#
2727
# tokens = lexer.tokenize """
2828
# SELECT x AS `first_name`, min(age)
29-
# FROM my_stream
29+
# FROM my_stream.win:length(123)
3030
# WHERE age > 10.2 AND (age < 30 OR first_name = 'andy')
3131
# GROUP BY age, name
3232
# ORDER BY age DESC
3333
# HAVING COUNT(*) > 5"""
34-
35-
console.log(tokens)
34+
#
35+
# console.log(tokens)

0 commit comments

Comments
 (0)