Skip to content

Commit e22e65f

Browse files
Teach ANALYZE to take an optional analysis program.
1 parent 20a9d6a commit e22e65f

File tree

4 files changed

+39
-18
lines changed

4 files changed

+39
-18
lines changed

src/ast.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@
117117
'ckpt_iterations',
118118
'ckpt_seconds',
119119
'wait',
120+
'program',
120121
])
121122
DropModels = namedtuple('DropModels', [
122123
'generator',

src/grammar.y

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,8 @@ command(init_models) ::= K_INITIALIZE L_INTEGER(n) K_MODEL|K_MODELS
113113
command(analyze_models) ::= K_ANALYZE generator_name(generator)
114114
anmodelset_opt(models) anlimit(anlimit)
115115
anckpt_opt(anckpt)
116-
wait_opt(wait).
116+
wait_opt(wait)
117+
analysis_program_opt(program).
117118
command(drop_models) ::= K_DROP K_MODEL|K_MODELS modelset_opt(models)
118119
K_FROM generator_name(generator).
119120

@@ -148,6 +149,13 @@ anduration(seconds) ::= L_INTEGER(n) K_SECOND|K_SECONDS.
148149
wait_opt(none) ::= .
149150
wait_opt(some) ::= K_WAIT.
150151

152+
analysis_program_opt(none) ::= .
153+
analysis_program_opt(some) ::= T_LROUND analysis_program(p) T_RROUND.
154+
analysis_program(empty) ::= .
155+
analysis_program(nonempty) ::= analysis_program(p) analysis_token(t).
156+
analysis_token(compound) ::= T_LROUND analysis_program(p) T_RROUND.
157+
analysis_token(primitive) ::= ANY(t).
158+
151159
simulate(s) ::= K_SIMULATE simulate_columns(cols)
152160
K_FROM population_name(population)
153161
modelledby_opt(generator)

src/parse.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ def p_stattype_s(self, name):
218218
def p_command_init_models(self, n, ifnotexists, generator):
219219
return ast.InitModels(ifnotexists, generator, n)
220220
def p_command_analyze_models(self, generator, models, anlimit, anckpt,
221-
wait):
221+
wait, program):
222222
self._ensure_wizard_mode(generator)
223223
iterations = anlimit[1] if anlimit[0] == 'iterations' else None
224224
seconds = anlimit[1] if anlimit[0] == 'seconds' else None
@@ -228,7 +228,7 @@ def p_command_analyze_models(self, generator, models, anlimit, anckpt,
228228
ckpt_iterations = anckpt[1] if anckpt[0] == 'iterations' else None
229229
ckpt_seconds = anckpt[1] if anckpt[0] == 'seconds' else None
230230
return ast.AnalyzeModels(generator, models, iterations, seconds,
231-
ckpt_iterations, ckpt_seconds, wait)
231+
ckpt_iterations, ckpt_seconds, wait, program)
232232
def p_command_drop_models(self, models, generator):
233233
return ast.DropModels(generator, models)
234234

@@ -259,6 +259,13 @@ def p_anduration_seconds(self, n): return ('seconds', n)
259259
def p_wait_opt_none(self): return False
260260
def p_wait_opt_some(self): return True
261261

262+
def p_analysis_program_opt_none(self): return None
263+
def p_analysis_program_opt_some(self, p): return p
264+
def p_analysis_program_empty(self): return []
265+
def p_analysis_program_nonempty(self, p, t): p += t; return p
266+
def p_analysis_token_compound(self, p): return ['('] + p + [')']
267+
def p_analysis_token_primitive(self, t): return [t]
268+
262269
def p_simulate_s(self, cols, population, generator, constraints, lim):
263270
return ast.Simulate(cols, population, generator, constraints,
264271
lim.limit)

tests/test_parse.py

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -547,37 +547,42 @@ def test_trivial_commands():
547547
assert parse_bql_string('initialize 2 models if not exists for t;') == \
548548
[ast.InitModels(True, 't', 2)]
549549
assert parse_bql_string('analyze t for 1 iteration;') == \
550-
[ast.AnalyzeModels('t', None, 1, None, None, None, False)]
550+
[ast.AnalyzeModels('t', None, 1, None, None, None, False, None)]
551551
assert parse_bql_string('analyze t for 1 iteration wait;') == \
552-
[ast.AnalyzeModels('t', None, 1, None, None, None, True)]
552+
[ast.AnalyzeModels('t', None, 1, None, None, None, True, None)]
553553
assert parse_bql_string('analyze t for 1 minute;') == \
554-
[ast.AnalyzeModels('t', None, None, 60, None, None, False)]
554+
[ast.AnalyzeModels('t', None, None, 60, None, None, False, None)]
555555
assert parse_bql_string('analyze t for 1 minute wait;') == \
556-
[ast.AnalyzeModels('t', None, None, 60, None, None, True)]
556+
[ast.AnalyzeModels('t', None, None, 60, None, None, True, None)]
557557
assert parse_bql_string('analyze t for 2 minutes;') == \
558-
[ast.AnalyzeModels('t', None, None, 120, None, None, False)]
558+
[ast.AnalyzeModels('t', None, None, 120, None, None, False, None)]
559559
assert parse_bql_string('analyze t for 2 minutes wait;') == \
560-
[ast.AnalyzeModels('t', None, None, 120, None, None, True)]
560+
[ast.AnalyzeModels('t', None, None, 120, None, None, True, None)]
561561
assert parse_bql_string('analyze t for 1 second;') == \
562-
[ast.AnalyzeModels('t', None, None, 1, None, None, False)]
562+
[ast.AnalyzeModels('t', None, None, 1, None, None, False, None)]
563563
assert parse_bql_string('analyze t for 1 second wait;') == \
564-
[ast.AnalyzeModels('t', None, None, 1, None, None, True)]
564+
[ast.AnalyzeModels('t', None, None, 1, None, None, True, None)]
565565
assert parse_bql_string('analyze t for 2 seconds;') == \
566-
[ast.AnalyzeModels('t', None, None, 2, None, None, False)]
566+
[ast.AnalyzeModels('t', None, None, 2, None, None, False, None)]
567567
assert parse_bql_string('analyze t for 2 seconds wait;') == \
568-
[ast.AnalyzeModels('t', None, None, 2, None, None, True)]
568+
[ast.AnalyzeModels('t', None, None, 2, None, None, True, None)]
569569
assert parse_bql_string('analyze t model 1 for 1 iteration;') == \
570-
[ast.AnalyzeModels('t', [1], 1, None, None, None, False)]
570+
[ast.AnalyzeModels('t', [1], 1, None, None, None, False, None)]
571571
assert parse_bql_string('analyze t models 1,2,3 for 1 iteration;') == \
572-
[ast.AnalyzeModels('t', [1,2,3], 1, None, None, None, False)]
572+
[ast.AnalyzeModels('t', [1,2,3], 1, None, None, None, False, None)]
573573
assert parse_bql_string('analyze t models 1-3,5 for 1 iteration;') == \
574-
[ast.AnalyzeModels('t', [1,2,3,5], 1, None, None, None, False)]
574+
[ast.AnalyzeModels('t', [1,2,3,5], 1, None, None, None, False, None)]
575575
assert parse_bql_string('analyze t for 10 iterations'
576576
' checkpoint 3 iterations') == \
577-
[ast.AnalyzeModels('t', None, 10, None, 3, None, False)]
577+
[ast.AnalyzeModels('t', None, 10, None, 3, None, False, None)]
578+
assert parse_bql_string('analyze t for 10 iterations wait'
579+
' (mh(default, one, 10))') == \
580+
[ast.AnalyzeModels('t', None, 10, None, None, None, True, [
581+
'mh', '(', 'default', ',', 'one', ',', 10, ')'
582+
])]
578583
assert parse_bql_string('analyze t for 10 seconds'
579584
' checkpoint 3 seconds') == \
580-
[ast.AnalyzeModels('t', None, None, 10, None, 3, False)]
585+
[ast.AnalyzeModels('t', None, None, 10, None, 3, False, None)]
581586
assert parse_bql_string('create temporary table tx as'
582587
' infer explicit x, predict x as xi confidence xc from t_cc') == \
583588
[ast.CreateTabAs(True, False, 'tx',

0 commit comments

Comments
 (0)