Skip to content

Commit 5e71234

Browse files
Revert changes to TypeQL runner to support multiple queries (#987)
## Goal Reverts changes to TypeQL runner to support multiple queries so we can run multiple queries in a single transaction. "Hidden segments" are now called "hidden sections", and are simply joined to the existing segment without starting a new one.
1 parent 39b5e2c commit 5e71234

File tree

3 files changed

+40
-38
lines changed

3 files changed

+40
-38
lines changed

reference/modules/ROOT/pages/typeql/statements/relates.adoc

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ The `relates` keyword can be used to undefine a role type from a relation.
5555
5656
[,typeql]
5757
----
58-
#!test[schema]
58+
#!test[schema, rollback]
5959
#{{
6060
undefine as parent from fathership relates father;
6161
#}}
62-
#!test[schema, rollback]
62+
#---
6363
undefine relates parent from parentship;
6464
----
6565
@@ -69,11 +69,7 @@ The `relates ... as` construction can be used to undefine a role type specializa
6969
7070
[,typeql]
7171
----
72-
#!test[schema]
73-
#{{
74-
define fathership relates father as parent;
75-
#}}
76-
#!test[schema]
72+
#!test[schema, rollback]
7773
undefine as parent from fathership relates father;
7874
----
7975

test/parser/parser.py

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,20 @@
1010
MARKERS = {
1111
"typeql": {
1212
"test_start": "#!test", # may have options, e.g. '#!test[write, reset, count=3]', see README.md
13-
"hidden_segment_start": "#{{",
14-
"hidden_segment_end": "#}}",
13+
"hidden_section_start": "#{{",
14+
"hidden_section_end": "#}}",
1515
"segment_separator": "#---", # used to separate non-hidden queries
1616
},
1717
"python": {
1818
"test_start": "#!test",
19-
"hidden_segment_start": "#{{",
20-
"hidden_segment_end": "#}}",
19+
"hidden_section_start": "#{{",
20+
"hidden_section_end": "#}}",
2121
"segment_separator": "#---",
2222
},
2323
"rust": {
2424
"test_start": "//!test",
25-
"hidden_segment_start": "//{{",
26-
"hidden_segment_end": "//}}",
25+
"hidden_section_start": "//{{",
26+
"hidden_section_end": "//}}",
2727
"segment_separator": "//---",
2828
}
2929
}
@@ -225,24 +225,22 @@ def parse_tests(self) -> List[ParsedTest]:
225225
continue
226226

227227
if self.in_language_block and self.in_test:
228-
if line.startswith(MARKERS[self.language]['hidden_segment_start']):
229-
logger.debug(f"line {self.line_number}: found hidden segment start")
228+
if line.startswith(MARKERS[self.language]['hidden_section_start']):
229+
logger.debug(f"line {self.line_number}: found hidden section start")
230230
if self.in_segment:
231-
self.error("Nested hidden segment found.")
232-
self.finalize_current_segment()
231+
self.error("Nested hidden section found.")
233232
self.in_segment = True
234233

235-
elif line.startswith(MARKERS[self.language]['hidden_segment_end']):
236-
logger.debug(f"line {self.line_number}: found hidden segment end")
234+
elif line.startswith(MARKERS[self.language]['hidden_section_end']):
235+
logger.debug(f"line {self.line_number}: found hidden section end")
237236
if not self.in_segment:
238-
self.error("No hidden segment to end found.")
239-
self.finalize_current_segment()
237+
self.error("No hidden section to end found.")
240238
self.in_segment = False
241239

242240
elif line.startswith(MARKERS[self.language]['segment_separator']):
243241
logger.debug(f"line {self.line_number}: found segment separator")
244242
if self.in_segment:
245-
self.error("Cannot separate in a hidden segment")
243+
self.error("Cannot separate in a hidden section")
246244
self.finalize_current_segment()
247245

248246
elif line.startswith("include::"):

test/runners/typeql_runner.py

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,14 @@ def check_config(self, adoc_config: Dict[str, str]):
7777
return False
7878
return True
7979

80-
def run_failing_queries(self, parsed_test: ParsedTest, type: TransactionType) -> str:
81-
query = "\n".join(parsed_test.segments)
80+
def run_failing_queries(self, queries: List[str], type: TransactionType) -> str:
8281
with self.driver.transaction(self.db, type) as tx:
8382
try:
84-
tx.query(query).resolve()
83+
promises = []
84+
for q in queries:
85+
promises += [tx.query(q)]
86+
for p in promises:
87+
p.resolve()
8588
except:
8689
return FailureMode.Runtime
8790
try:
@@ -90,22 +93,27 @@ def run_failing_queries(self, parsed_test: ParsedTest, type: TransactionType) ->
9093
return FailureMode.Commit
9194
return FailureMode.NoFailure
9295

93-
def run_transaction(self, parsed_test: ParsedTest, type: TransactionType, counted=False, rollback=False, documents=False) -> Union[int, None]:
96+
def run_transaction(self, queries: List[str], type: TransactionType, counted=False, rollback=False, documents=False) -> Union[int, None]:
9497
count_var_name = "automatic_test_count"
95-
query = "\n".join(parsed_test.segments)
9698
if counted:
97-
query += f"\nreduce ${count_var_name} = count;"
99+
queries[-1] = queries[-1] + f"\nreduce ${count_var_name} = count;"
98100
with self.driver.transaction(self.db, type) as tx:
99101
try:
100-
result = tx.query(query).resolve()
102+
promises = []
103+
results = []
104+
for q in queries:
105+
promises.append(tx.query(q))
106+
for p in promises:
107+
results.append(p.resolve())
101108
if rollback:
102109
tx.rollback()
103110
tx.close()
104111
elif type == TransactionType.READ:
105-
if documents:
106-
consumed_iterator = list(result.as_concept_documents())
107-
else:
108-
consumed_iterator = list(result.as_concept_rows())
112+
for r in results:
113+
if documents:
114+
consumed_iterator = list(r.as_concept_documents())
115+
else:
116+
consumed_iterator = list(r.as_concept_rows())
109117
tx.close()
110118
else:
111119
tx.commit()
@@ -115,8 +123,8 @@ def run_transaction(self, parsed_test: ParsedTest, type: TransactionType, counte
115123
if type == TransactionType.READ:
116124
count = consumed_iterator[0].get(count_var_name).get_integer()
117125
else:
118-
rows = list(result.as_concept_rows())
119-
count = rows[0].get(count_var_name).get_integer()
126+
last_result = list(results[-1].as_concept_rows())
127+
count = last_result[0].get(count_var_name).get_integer()
120128
return count
121129
except Exception as e:
122130
raise Exception(f"{e}") from e
@@ -165,15 +173,15 @@ def run_test(self, parsed_test: ParsedTest, adoc_path: str):
165173
ref_failure_mode = FailureMode.Runtime
166174
case x if x == TEST_FAIL_COMMIT_VAL:
167175
ref_failure_mode = FailureMode.Commit
168-
failure_mode = self.run_failing_queries(parsed_test, type)
176+
failure_mode = self.run_failing_queries(parsed_test.segments, type)
169177
if failure_mode != ref_failure_mode:
170178
raise RuntimeError(f"[{adoc_path}]: Failure mode: expected {ref_failure_mode} but got {failure_mode}")
171179
elif counted == True:
172-
count = self.run_transaction(parsed_test, type, counted, rollback, documents)
180+
count = self.run_transaction(parsed_test.segments, type, counted, rollback, documents)
173181
if count != reference_count:
174182
raise RuntimeError(f"[{adoc_path}]: Query count: expected {reference_count} but got {count}")
175183
else:
176-
self.run_transaction(parsed_test, type, counted, rollback, documents)
184+
self.run_transaction(parsed_test.segments, type, counted, rollback, documents)
177185

178186
self.after_run_test(parsed_test)
179187

0 commit comments

Comments
 (0)