synalog 2.4.0__tar.gz → 2.4.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {synalog-2.4.0 → synalog-2.4.1}/Cargo.lock +2 -2
- {synalog-2.4.0 → synalog-2.4.1}/Cargo.toml +1 -1
- {synalog-2.4.0 → synalog-2.4.1}/PKG-INFO +1 -1
- {synalog-2.4.0 → synalog-2.4.1}/pyproject.toml +1 -1
- {synalog-2.4.0 → synalog-2.4.1}/src/python.rs +120 -98
- {synalog-2.4.0 → synalog-2.4.1}/uv.lock +1 -1
- {synalog-2.4.0 → synalog-2.4.1}/verified/Cargo.toml +1 -1
- {synalog-2.4.0 → synalog-2.4.1}/.gitignore +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/LICENSE +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/NOTICE +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/README.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/assertions.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/assets/synalog-dark.svg +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/assets/synalog-light.svg +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/assets/synalog_favicon.png +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/benchmark/results.json +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/benchmark/speedup_by_engine.png +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/benchmark/speedup_distribution.png +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/benchmark/summary.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/benchmark/summary.png +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/benchmark/time_comparison.png +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/benchmark/verify_by_engine.png +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/benchmark.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/cli.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/development.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/differences-datalog.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/differences.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/engines.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/aggregation.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/aggregation.log +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/directives.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/directives.log +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/functions.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/functions.log +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/functors.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/functors.log +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/getting_started.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/getting_started.log +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/knowledge_graphs.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/knowledge_graphs.log +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/recursion.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/recursion.log +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/run.py +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/shop/concepts/customer.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/shop/concepts/order_status.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/shop/data/orders.csv +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/shop/layer.toml +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/shop/rules/customer_revenue.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/shop/rules/orders_by_status.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/shop/rules/top_customers.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/shop/tables/orders.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/shop.log +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/smoke/concepts/device.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/smoke/concepts/test_status.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/smoke/data/smoke_tests.csv +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/smoke/layer.toml +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/smoke/rules/failures_by_device.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/smoke/rules/runs_per_day.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/smoke/tables/smoke_tests.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/smoke.log +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/syntax.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/syntax.log +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/temporal.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/temporal.log +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/temporal_graph.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/temporal_graph.log +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/verification.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/examples/verification.log +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/getting-started.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/index.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/javascripts/playground.js +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/javascripts/summarize.js +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/javascripts/synalog-highlight.js +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/knowledge-graphs.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/language/aggregation.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/language/directives.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/language/functions.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/language/functors.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/language/index.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/language/recursion.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/language/syntax.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/language/temporal.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/playground/vendor/codemirror.js +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/playground.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/python-api.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/stylesheets/extra.css +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/verification.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/docs/why.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/img/synalog-dark.svg +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/img/synalog-light.svg +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/python/synalog/__init__.py +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/python/synalog/__main__.py +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/python/synalog/checking.py +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/python/synalog/cli.py +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/python/synalog/config.py +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/python/synalog/execution.py +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/python/synalog/introspect.py +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/python/synalog/project.py +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/python/synalog/runners.py +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/SKILL.md +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/company/concepts/department.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/company/concepts/person.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/company/concepts/works_in.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/company/data/departments.csv +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/company/data/employees.csv +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/company/layer.toml +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/company/rules/team_mate.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/company/tables/departments.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/company/tables/employees.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/org/concepts/all_managers.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/org/data/employees.csv +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/org/layer.toml +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/org/tables/employees.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/sales/concepts/region.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/sales/data/sales.csv +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/sales/layer.toml +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/sales/rules/monthly_sales.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/sales/rules/top_region.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/sales/rules/total_by_region.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/skills/synalog/examples/sales/tables/sales.l +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/assertion/mod.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/assertion/parse.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/assertion/report.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/assertion/translate.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/annotations.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/annotations_test.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/dialects.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/dialects_test.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/expr_translate.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/expr_translate_test.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/functors.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/functors_test.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/mod.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/rule_translate.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/rule_translate_test.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/type_inference/builder.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/type_inference/built_in.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/type_inference/edge.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/type_inference/expression.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/type_inference/graph.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/type_inference/inference.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/type_inference/intersection.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/type_inference/mod.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/type_inference/types.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/universe.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/compiler/universe_test.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/errors.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/lib.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/parser/json.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/parser/json_test.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/parser/mod.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/parser/names.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/parser/parse.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/parser/parse_test.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/parser/rewrite.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/parser/rewrite_test.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/parser/span.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/parser/span_test.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/parser/traverse.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/parser/traverse_test.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/arity.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/assertions.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/cast.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/contradiction.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/dependencies.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/directives.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/front_matter.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/functors.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/mod.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/orderby.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/positional.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/recursion.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/reserved.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/safety.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/sqlexpr.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/stratification.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/undefined.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/verifier/vars.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/src/wasm.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/verified/src/arity.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/verified/src/cast.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/verified/src/contradiction.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/verified/src/lib.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/verified/src/membership.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/verified/src/page.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/verified/src/plan.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/verified/src/quote.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/verified/src/recursion.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/verified/src/safety.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/verified/src/strata.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/verified/src/types.rs +0 -0
- {synalog-2.4.0 → synalog-2.4.1}/zensical.toml +0 -0
|
@@ -300,7 +300,7 @@ dependencies = [
|
|
|
300
300
|
|
|
301
301
|
[[package]]
|
|
302
302
|
name = "synalog"
|
|
303
|
-
version = "2.4.
|
|
303
|
+
version = "2.4.1"
|
|
304
304
|
dependencies = [
|
|
305
305
|
"anyhow",
|
|
306
306
|
"indexmap",
|
|
@@ -316,7 +316,7 @@ dependencies = [
|
|
|
316
316
|
|
|
317
317
|
[[package]]
|
|
318
318
|
name = "synalog-verified"
|
|
319
|
-
version = "2.4.
|
|
319
|
+
version = "2.4.1"
|
|
320
320
|
dependencies = [
|
|
321
321
|
"vstd",
|
|
322
322
|
]
|
|
@@ -195,22 +195,25 @@ fn search(
|
|
|
195
195
|
#[pyfunction]
|
|
196
196
|
#[pyo3(signature = (source, engine=None, import_root=None))]
|
|
197
197
|
fn compile_all(
|
|
198
|
+
py: Python<'_>,
|
|
198
199
|
source: &str,
|
|
199
200
|
engine: Option<&str>,
|
|
200
201
|
import_root: Option<Vec<String>>,
|
|
201
202
|
) -> PyResult<HashMap<String, String>> {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
203
|
+
py.detach(|| {
|
|
204
|
+
check_engine(engine)?;
|
|
205
|
+
let parsed = parse_source(source, None, import_root)?;
|
|
206
|
+
let program = build_program(&parsed, engine)?;
|
|
207
|
+
let mut out = HashMap::new();
|
|
208
|
+
let pagination = Pagination { limit: None, offset: None };
|
|
209
|
+
for name in program.user_defined_predicates() {
|
|
210
|
+
let sql = program
|
|
211
|
+
.formatted_predicate_sql_with_pagination(&name, &pagination)
|
|
212
|
+
.map_err(map_err)?;
|
|
213
|
+
out.insert(name, sql);
|
|
214
|
+
}
|
|
215
|
+
Ok(out)
|
|
216
|
+
})
|
|
214
217
|
}
|
|
215
218
|
|
|
216
219
|
/// Validate a Synalog program; returns `(errors, warnings)`, two lists of
|
|
@@ -225,17 +228,20 @@ fn compile_all(
|
|
|
225
228
|
#[pyfunction]
|
|
226
229
|
#[pyo3(signature = (source, engine=None, import_root=None))]
|
|
227
230
|
fn check(
|
|
231
|
+
py: Python<'_>,
|
|
228
232
|
source: &str,
|
|
229
233
|
engine: Option<&str>,
|
|
230
234
|
import_root: Option<Vec<String>>,
|
|
231
235
|
) -> PyResult<(Vec<String>, Vec<String>)> {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
236
|
+
py.detach(|| {
|
|
237
|
+
check_engine(engine)?;
|
|
238
|
+
let parsed = parse_source(source, None, import_root)?;
|
|
239
|
+
let names = PredicateNames::of(&parsed);
|
|
240
|
+
let result = validate(&parsed);
|
|
241
|
+
let errors = result.errors.iter().map(|e| names.written(&e.to_string())).collect();
|
|
242
|
+
let warnings = result.warnings.iter().map(|w| names.written(w)).collect();
|
|
243
|
+
Ok((errors, warnings))
|
|
244
|
+
})
|
|
239
245
|
}
|
|
240
246
|
|
|
241
247
|
/// Every `@Assert` of a program and where it stands.
|
|
@@ -261,11 +267,12 @@ fn assertions(
|
|
|
261
267
|
engine: Option<&str>,
|
|
262
268
|
import_root: Option<Vec<String>>,
|
|
263
269
|
) -> PyResult<Vec<Py<PyAny>>> {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
270
|
+
let (names, found) = py.detach(|| {
|
|
271
|
+
check_engine(engine)?;
|
|
272
|
+
let parsed = parse_source(source, None, import_root)?;
|
|
273
|
+
PyResult::Ok((PredicateNames::of(&parsed), validate(&parsed).assertions))
|
|
274
|
+
})?;
|
|
275
|
+
found
|
|
269
276
|
.into_iter()
|
|
270
277
|
.map(|assertion| {
|
|
271
278
|
let dict = pyo3::types::PyDict::new(py);
|
|
@@ -291,18 +298,24 @@ fn assertions(
|
|
|
291
298
|
/// from here. Raises ValueError on syntax errors.
|
|
292
299
|
#[pyfunction]
|
|
293
300
|
#[pyo3(signature = (source, import_root=None))]
|
|
294
|
-
fn dependencies(
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
301
|
+
fn dependencies(
|
|
302
|
+
py: Python<'_>,
|
|
303
|
+
source: &str,
|
|
304
|
+
import_root: Option<Vec<String>>,
|
|
305
|
+
) -> PyResult<BTreeMap<String, Vec<String>>> {
|
|
306
|
+
py.detach(|| {
|
|
307
|
+
let parsed = parse_source(source, None, import_root)?;
|
|
308
|
+
let names = PredicateNames::of(&parsed);
|
|
309
|
+
let rules: Vec<&Json> = parsed.as_object().get("rule").map(|r| r.as_array().iter().collect()).unwrap_or_default();
|
|
310
|
+
Ok(program_dependencies(&rules)
|
|
311
|
+
.into_iter()
|
|
312
|
+
.map(|(name, refs)| {
|
|
313
|
+
let mut refs: Vec<String> = refs.iter().map(|r| names.written(r)).collect();
|
|
314
|
+
refs.sort();
|
|
315
|
+
(names.written(&name), refs)
|
|
316
|
+
})
|
|
317
|
+
.collect())
|
|
318
|
+
})
|
|
306
319
|
}
|
|
307
320
|
|
|
308
321
|
/// Compile the search for the counterexamples of an assertion to SQL.
|
|
@@ -316,7 +329,9 @@ fn dependencies(source: &str, import_root: Option<Vec<String>>) -> PyResult<BTre
|
|
|
316
329
|
/// checked, and on syntax or compilation errors.
|
|
317
330
|
#[pyfunction]
|
|
318
331
|
#[pyo3(signature = (source, predicate, name, limit=None, offset=None, engine=None, import_root=None))]
|
|
332
|
+
#[allow(clippy::too_many_arguments)]
|
|
319
333
|
fn counterexamples(
|
|
334
|
+
py: Python<'_>,
|
|
320
335
|
source: &str,
|
|
321
336
|
predicate: &str,
|
|
322
337
|
name: &str,
|
|
@@ -325,19 +340,21 @@ fn counterexamples(
|
|
|
325
340
|
engine: Option<&str>,
|
|
326
341
|
import_root: Option<Vec<String>>,
|
|
327
342
|
) -> PyResult<String> {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
343
|
+
py.detach(|| {
|
|
344
|
+
check_engine(engine)?;
|
|
345
|
+
let parsed = parse_source(source, None, import_root.clone())?;
|
|
346
|
+
let names = PredicateNames::of(&parsed);
|
|
347
|
+
let rules: Vec<&Json> = parsed.as_object()["rule"].as_array().iter().collect();
|
|
348
|
+
let translation = assertion_check(&rules, &names.internal(predicate), name).map_err(written_err(&names))?;
|
|
349
|
+
// The counterexamples are a predicate of the program like any other.
|
|
350
|
+
let extended = format!("{}\n{}\n", source, translation.rules);
|
|
351
|
+
let parsed = parse_source(&extended, None, import_root)?;
|
|
352
|
+
let program = build_program(&parsed, engine)?;
|
|
353
|
+
let pagination = Pagination { limit, offset };
|
|
354
|
+
program
|
|
355
|
+
.formatted_predicate_sql_with_pagination(&translation.predicate, &pagination)
|
|
356
|
+
.map_err(map_err)
|
|
357
|
+
})
|
|
341
358
|
}
|
|
342
359
|
|
|
343
360
|
/// Compile the search for the counterexamples of several assertions to SQL;
|
|
@@ -353,6 +370,7 @@ fn counterexamples(
|
|
|
353
370
|
#[pyfunction]
|
|
354
371
|
#[pyo3(signature = (source, assertions=None, limit=None, offset=None, engine=None, import_root=None))]
|
|
355
372
|
fn counterexamples_all(
|
|
373
|
+
py: Python<'_>,
|
|
356
374
|
source: &str,
|
|
357
375
|
assertions: Option<Vec<(String, String)>>,
|
|
358
376
|
limit: Option<u64>,
|
|
@@ -360,37 +378,39 @@ fn counterexamples_all(
|
|
|
360
378
|
engine: Option<&str>,
|
|
361
379
|
import_root: Option<Vec<String>>,
|
|
362
380
|
) -> PyResult<HashMap<(String, String), String>> {
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
381
|
+
py.detach(|| {
|
|
382
|
+
check_engine(engine)?;
|
|
383
|
+
let parsed = parse_source(source, None, import_root.clone())?;
|
|
384
|
+
let names = PredicateNames::of(&parsed);
|
|
385
|
+
let assertions = match assertions {
|
|
386
|
+
Some(assertions) => assertions,
|
|
387
|
+
None => validate(&parsed)
|
|
388
|
+
.assertions
|
|
389
|
+
.into_iter()
|
|
390
|
+
.filter(|assertion| assertion.status == AssertionStatus::Unchecked)
|
|
391
|
+
.map(|assertion| (names.written(&assertion.predicate), assertion.name))
|
|
392
|
+
.collect(),
|
|
393
|
+
};
|
|
394
|
+
let rules: Vec<&Json> = parsed.as_object()["rule"].as_array().iter().collect();
|
|
395
|
+
let mut extended = format!("{}\n", source);
|
|
396
|
+
let mut checks = Vec::new();
|
|
397
|
+
for (predicate, name) in assertions {
|
|
398
|
+
let translation = assertion_check(&rules, &names.internal(&predicate), &name).map_err(written_err(&names))?;
|
|
399
|
+
extended.push_str(&translation.rules);
|
|
400
|
+
extended.push('\n');
|
|
401
|
+
checks.push(((predicate, name), translation.predicate));
|
|
402
|
+
}
|
|
403
|
+
let parsed = parse_source(&extended, None, import_root)?;
|
|
404
|
+
let program = build_program(&parsed, engine)?;
|
|
405
|
+
let pagination = Pagination { limit, offset };
|
|
406
|
+
checks
|
|
370
407
|
.into_iter()
|
|
371
|
-
.
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
let mut checks = Vec::new();
|
|
378
|
-
for (predicate, name) in assertions {
|
|
379
|
-
let translation = assertion_check(&rules, &names.internal(&predicate), &name).map_err(written_err(&names))?;
|
|
380
|
-
extended.push_str(&translation.rules);
|
|
381
|
-
extended.push('\n');
|
|
382
|
-
checks.push(((predicate, name), translation.predicate));
|
|
383
|
-
}
|
|
384
|
-
let parsed = parse_source(&extended, None, import_root)?;
|
|
385
|
-
let program = build_program(&parsed, engine)?;
|
|
386
|
-
let pagination = Pagination { limit, offset };
|
|
387
|
-
checks
|
|
388
|
-
.into_iter()
|
|
389
|
-
.map(|(key, predicate)| {
|
|
390
|
-
let sql = program.formatted_predicate_sql_with_pagination(&predicate, &pagination).map_err(map_err)?;
|
|
391
|
-
Ok((key, sql))
|
|
392
|
-
})
|
|
393
|
-
.collect()
|
|
408
|
+
.map(|(key, predicate)| {
|
|
409
|
+
let sql = program.formatted_predicate_sql_with_pagination(&predicate, &pagination).map_err(map_err)?;
|
|
410
|
+
Ok((key, sql))
|
|
411
|
+
})
|
|
412
|
+
.collect()
|
|
413
|
+
})
|
|
394
414
|
}
|
|
395
415
|
|
|
396
416
|
/// The steps that compute a predicate, for a runner that executes them.
|
|
@@ -419,25 +439,27 @@ fn plan(
|
|
|
419
439
|
pattern: Option<&str>,
|
|
420
440
|
assertion: Option<&str>,
|
|
421
441
|
) -> PyResult<Vec<Py<PyAny>>> {
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
442
|
+
let steps = py.detach(|| {
|
|
443
|
+
check_engine(engine)?;
|
|
444
|
+
let (source, predicate) = match assertion {
|
|
445
|
+
Some(name) => {
|
|
446
|
+
let parsed = parse_source(source, None, import_root.clone())?;
|
|
447
|
+
let names = PredicateNames::of(&parsed);
|
|
448
|
+
let rules: Vec<&Json> = parsed.as_object()["rule"].as_array().iter().collect();
|
|
449
|
+
let translation =
|
|
450
|
+
assertion_check(&rules, &names.internal(predicate), name).map_err(written_err(&names))?;
|
|
451
|
+
(format!("{}\n{}\n", source, translation.rules), translation.predicate)
|
|
452
|
+
}
|
|
453
|
+
None => (source.to_string(), predicate.to_string()),
|
|
454
|
+
};
|
|
455
|
+
let parsed = parse_source(&source, None, import_root)?;
|
|
456
|
+
let names = PredicateNames::of(&parsed);
|
|
457
|
+
let program = build_program(&parsed, engine)?;
|
|
458
|
+
let pagination = Pagination { limit, offset };
|
|
459
|
+
program
|
|
460
|
+
.formatted_predicate_plan(&names.internal(&predicate), Some(&pagination), pattern)
|
|
461
|
+
.map_err(written_err(&names))
|
|
462
|
+
})?;
|
|
441
463
|
steps
|
|
442
464
|
.into_iter()
|
|
443
465
|
.map(|step| {
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|