@lix-js/sdk 0.6.0-preview.3 → 0.6.0-preview.5
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.
- package/README.md +1 -1
- package/SKILL.md +105 -65
- package/dist/engine-wasm/index.js +4 -4
- package/dist/engine-wasm/wasm/lix_engine.d.ts +30 -6
- package/dist/engine-wasm/wasm/lix_engine.js +187 -117
- package/dist/engine-wasm/wasm/lix_engine.wasm +0 -0
- package/dist/engine-wasm/wasm/lix_engine.wasm.d.ts +14 -8
- package/dist/generated/builtin-schemas.d.ts +69 -69
- package/dist/generated/builtin-schemas.js +94 -94
- package/dist/open-lix.d.ts +42 -28
- package/dist/open-lix.js +49 -10
- package/dist/sqlite/index.js +86 -30
- package/dist-engine-src/README.md +3 -3
- package/dist-engine-src/src/backend/capabilities.rs +67 -0
- package/dist-engine-src/src/backend/conformance/baseline.rs +1127 -0
- package/dist-engine-src/src/backend/conformance/factory.rs +93 -0
- package/dist-engine-src/src/backend/conformance/failure_tests.rs +608 -0
- package/dist-engine-src/src/backend/conformance/fixtures.rs +26 -0
- package/dist-engine-src/src/backend/conformance/mod.rs +75 -0
- package/dist-engine-src/src/backend/conformance/model.rs +28 -0
- package/dist-engine-src/src/backend/conformance/model_based.rs +257 -0
- package/dist-engine-src/src/backend/conformance/persistence.rs +204 -0
- package/dist-engine-src/src/backend/conformance/projection.rs +21 -0
- package/dist-engine-src/src/backend/conformance/pushdown.rs +24 -0
- package/dist-engine-src/src/backend/conformance/runner.rs +90 -0
- package/dist-engine-src/src/backend/conformance/scan.rs +24 -0
- package/dist-engine-src/src/backend/conformance/write.rs +16 -0
- package/dist-engine-src/src/backend/error.rs +94 -0
- package/dist-engine-src/src/backend/in_memory.rs +670 -0
- package/dist-engine-src/src/backend/mod.rs +36 -9
- package/dist-engine-src/src/backend/predicate.rs +80 -0
- package/dist-engine-src/src/backend/traits.rs +260 -0
- package/dist-engine-src/src/backend/types.rs +224 -81
- package/dist-engine-src/src/binary_cas/context.rs +8 -8
- package/dist-engine-src/src/binary_cas/kv.rs +234 -259
- package/dist-engine-src/src/{version → branch}/context.rs +12 -12
- package/dist-engine-src/src/branch/lifecycle.rs +221 -0
- package/dist-engine-src/src/branch/mod.rs +13 -0
- package/dist-engine-src/src/branch/refs.rs +321 -0
- package/dist-engine-src/src/branch/stage_rows.rs +67 -0
- package/dist-engine-src/src/branch/types.rs +21 -0
- package/dist-engine-src/src/catalog/context.rs +18 -18
- package/dist-engine-src/src/catalog/snapshot.rs +8 -8
- package/dist-engine-src/src/changelog/bench_support.rs +785 -0
- package/dist-engine-src/src/changelog/change.rs +1 -0
- package/dist-engine-src/src/changelog/codec.rs +497 -0
- package/dist-engine-src/src/changelog/commit.rs +1 -0
- package/dist-engine-src/src/changelog/context.rs +1614 -0
- package/dist-engine-src/src/changelog/mod.rs +29 -0
- package/dist-engine-src/src/changelog/store.rs +163 -0
- package/dist-engine-src/src/changelog/test_support.rs +54 -0
- package/dist-engine-src/src/changelog/types.rs +213 -0
- package/dist-engine-src/src/commit_graph/context.rs +317 -274
- package/dist-engine-src/src/commit_graph/mod.rs +2 -4
- package/dist-engine-src/src/commit_graph/types.rs +22 -42
- package/dist-engine-src/src/commit_graph/walker.rs +133 -103
- package/dist-engine-src/src/common/error.rs +52 -18
- package/dist-engine-src/src/common/identity.rs +2 -2
- package/dist-engine-src/src/common/mod.rs +1 -1
- package/dist-engine-src/src/domain.rs +42 -46
- package/dist-engine-src/src/engine.rs +74 -96
- package/dist-engine-src/src/{entity_identity.rs → entity_pk.rs} +89 -92
- package/dist-engine-src/src/functions/context.rs +56 -52
- package/dist-engine-src/src/functions/state.rs +51 -52
- package/dist-engine-src/src/init.rs +288 -154
- package/dist-engine-src/src/json_store/context.rs +15 -266
- package/dist-engine-src/src/json_store/mod.rs +26 -0
- package/dist-engine-src/src/json_store/store.rs +103 -718
- package/dist-engine-src/src/json_store/types.rs +4 -9
- package/dist-engine-src/src/lib.rs +49 -19
- package/dist-engine-src/src/live_state/context.rs +654 -790
- package/dist-engine-src/src/live_state/mod.rs +9 -3
- package/dist-engine-src/src/live_state/overlay.rs +4 -4
- package/dist-engine-src/src/live_state/types.rs +30 -21
- package/dist-engine-src/src/live_state/visibility.rs +514 -71
- package/dist-engine-src/src/plugin/install.rs +48 -48
- package/dist-engine-src/src/plugin/manifest.rs +7 -7
- package/dist-engine-src/src/plugin/materializer.rs +0 -275
- package/dist-engine-src/src/plugin/plugin_manifest.json +4 -3
- package/dist-engine-src/src/schema/builtin/lix_binary_blob_ref.json +2 -2
- package/dist-engine-src/src/schema/builtin/lix_branch_descriptor.json +34 -0
- package/dist-engine-src/src/schema/builtin/lix_branch_ref.json +48 -0
- package/dist-engine-src/src/schema/builtin/lix_change.json +3 -3
- package/dist-engine-src/src/schema/builtin/lix_commit.json +1 -1
- package/dist-engine-src/src/schema/builtin/lix_label_assignment.json +6 -6
- package/dist-engine-src/src/schema/builtin/mod.rs +18 -20
- package/dist-engine-src/src/schema/compatibility.rs +11 -11
- package/dist-engine-src/src/schema/definition.json +2 -2
- package/dist-engine-src/src/schema/definition.rs +5 -5
- package/dist-engine-src/src/schema/key.rs +3 -3
- package/dist-engine-src/src/schema/mod.rs +1 -1
- package/dist-engine-src/src/schema/tests.rs +18 -18
- package/dist-engine-src/src/session/context.rs +819 -124
- package/dist-engine-src/src/session/create_branch.rs +94 -0
- package/dist-engine-src/src/session/execute.rs +260 -57
- package/dist-engine-src/src/session/merge/analysis.rs +9 -3
- package/dist-engine-src/src/session/merge/{version.rs → branch.rs} +119 -129
- package/dist-engine-src/src/session/merge/conflicts.rs +2 -2
- package/dist-engine-src/src/session/merge/mod.rs +5 -6
- package/dist-engine-src/src/session/merge/stats.rs +7 -11
- package/dist-engine-src/src/session/mod.rs +19 -16
- package/dist-engine-src/src/session/switch_branch.rs +113 -0
- package/dist-engine-src/src/session/transaction.rs +557 -0
- package/dist-engine-src/src/sql2/bind/classify.rs +102 -0
- package/dist-engine-src/src/sql2/bind/error.rs +5 -0
- package/dist-engine-src/src/sql2/bind/expr.rs +29 -0
- package/dist-engine-src/src/sql2/bind/mod.rs +12 -0
- package/dist-engine-src/src/sql2/{udfs/public_call.rs → bind/public_udf.rs} +98 -3
- package/dist-engine-src/src/sql2/bind/read.rs +65 -0
- package/dist-engine-src/src/sql2/bind/statement.rs +2236 -0
- package/dist-engine-src/src/sql2/bind/table.rs +273 -0
- package/dist-engine-src/src/sql2/bind/write.rs +86 -0
- package/dist-engine-src/src/sql2/branch_scope.rs +436 -0
- package/dist-engine-src/src/sql2/catalog/capability.rs +20 -0
- package/dist-engine-src/src/sql2/catalog/entity_surface.rs +296 -0
- package/dist-engine-src/src/sql2/catalog/mod.rs +15 -0
- package/dist-engine-src/src/sql2/catalog/registry.rs +556 -0
- package/dist-engine-src/src/sql2/catalog/schema.rs +88 -0
- package/dist-engine-src/src/sql2/catalog/surface.rs +41 -0
- package/dist-engine-src/src/sql2/change_materialization.rs +122 -0
- package/dist-engine-src/src/sql2/context.rs +36 -30
- package/dist-engine-src/src/sql2/error.rs +4 -5
- package/dist-engine-src/src/sql2/exec/bound_public_write.rs +1593 -0
- package/dist-engine-src/src/sql2/exec/datafusion.rs +5266 -0
- package/dist-engine-src/src/sql2/exec/fast_write.rs +82 -0
- package/dist-engine-src/src/sql2/exec/mod.rs +24 -0
- package/dist-engine-src/src/sql2/exec/write.rs +661 -0
- package/dist-engine-src/src/sql2/filesystem_planner.rs +72 -77
- package/dist-engine-src/src/sql2/filesystem_visibility.rs +21 -21
- package/dist-engine-src/src/sql2/history_projection.rs +8 -8
- package/dist-engine-src/src/sql2/history_route.rs +35 -31
- package/dist-engine-src/src/sql2/mod.rs +30 -24
- package/dist-engine-src/src/sql2/optimize/datafusion.rs +1 -0
- package/dist-engine-src/src/sql2/optimize/mod.rs +2 -0
- package/dist-engine-src/src/sql2/optimize/simple_write.rs +116 -0
- package/dist-engine-src/src/sql2/parse/mod.rs +69 -0
- package/dist-engine-src/src/sql2/parse/normalize.rs +1 -0
- package/dist-engine-src/src/sql2/plan/branch_scope.rs +24 -0
- package/dist-engine-src/src/sql2/plan/mod.rs +5 -0
- package/dist-engine-src/src/sql2/plan/predicate.rs +22 -0
- package/dist-engine-src/src/sql2/plan/write.rs +147 -0
- package/dist-engine-src/src/sql2/predicate_typecheck.rs +258 -0
- package/dist-engine-src/src/sql2/{version_provider.rs → providers/branch.rs} +218 -214
- package/dist-engine-src/src/sql2/{change_provider.rs → providers/change.rs} +156 -42
- package/dist-engine-src/src/sql2/{directory_provider.rs → providers/directory.rs} +291 -322
- package/dist-engine-src/src/sql2/{directory_history_provider.rs → providers/directory_history.rs} +56 -42
- package/dist-engine-src/src/sql2/providers/entity.rs +1484 -0
- package/dist-engine-src/src/sql2/{entity_history_provider.rs → providers/entity_history.rs} +43 -31
- package/dist-engine-src/src/sql2/{file_provider.rs → providers/file.rs} +323 -316
- package/dist-engine-src/src/sql2/{file_history_provider.rs → providers/file_history.rs} +60 -46
- package/dist-engine-src/src/sql2/{history_provider.rs → providers/history.rs} +46 -32
- package/dist-engine-src/src/sql2/{lix_state_provider.rs → providers/lix_state.rs} +359 -329
- package/dist-engine-src/src/sql2/providers/mod.rs +508 -0
- package/dist-engine-src/src/sql2/read_only.rs +2 -2
- package/dist-engine-src/src/sql2/session.rs +47 -96
- package/dist-engine-src/src/sql2/storage/constraints.rs +1 -0
- package/dist-engine-src/src/sql2/storage/mod.rs +1 -0
- package/dist-engine-src/src/sql2/test_support/differential.rs +712 -0
- package/dist-engine-src/src/sql2/test_support/generators.rs +354 -0
- package/dist-engine-src/src/sql2/test_support/mod.rs +2 -0
- package/dist-engine-src/src/sql2/udfs/{lix_active_version_commit_id.rs → lix_active_branch_commit_id.rs} +7 -7
- package/dist-engine-src/src/sql2/udfs/mod.rs +3 -6
- package/dist-engine-src/src/sql2/write_normalization.rs +45 -22
- package/dist-engine-src/src/storage/conformance.rs +399 -0
- package/dist-engine-src/src/storage/context.rs +552 -288
- package/dist-engine-src/src/storage/mod.rs +48 -10
- package/dist-engine-src/src/storage/point.rs +440 -0
- package/dist-engine-src/src/storage/read_scope.rs +43 -64
- package/dist-engine-src/src/storage/reader.rs +867 -0
- package/dist-engine-src/src/storage/scan.rs +784 -0
- package/dist-engine-src/src/storage/spaces.rs +236 -0
- package/dist-engine-src/src/storage/stats.rs +80 -0
- package/dist-engine-src/src/storage/write_set.rs +962 -0
- package/dist-engine-src/src/storage_bench.rs +136 -4828
- package/dist-engine-src/src/test_support.rs +360 -138
- package/dist-engine-src/src/tracked_state/bench_support.rs +394 -0
- package/dist-engine-src/src/tracked_state/codec.rs +155 -1057
- package/dist-engine-src/src/tracked_state/commit_root_rebuild.rs +358 -0
- package/dist-engine-src/src/tracked_state/context.rs +1927 -993
- package/dist-engine-src/src/tracked_state/diff.rs +1715 -261
- package/dist-engine-src/src/tracked_state/merge.rs +74 -88
- package/dist-engine-src/src/tracked_state/mod.rs +19 -16
- package/dist-engine-src/src/tracked_state/{materialization.rs → row_materialization.rs} +50 -178
- package/dist-engine-src/src/tracked_state/storage.rs +243 -191
- package/dist-engine-src/src/tracked_state/tree.rs +247 -371
- package/dist-engine-src/src/tracked_state/types.rs +49 -42
- package/dist-engine-src/src/transaction/bench_support.rs +407 -0
- package/dist-engine-src/src/transaction/commit.rs +821 -713
- package/dist-engine-src/src/transaction/context.rs +705 -600
- package/dist-engine-src/src/transaction/mod.rs +13 -2
- package/dist-engine-src/src/transaction/normalization.rs +63 -76
- package/dist-engine-src/src/transaction/prep.rs +13 -13
- package/dist-engine-src/src/transaction/schema_resolver.rs +19 -5
- package/dist-engine-src/src/transaction/staging.rs +228 -434
- package/dist-engine-src/src/transaction/types.rs +41 -98
- package/dist-engine-src/src/transaction/validation.rs +382 -446
- package/dist-engine-src/src/untracked_state/codec.rs +337 -29
- package/dist-engine-src/src/untracked_state/context.rs +7 -7
- package/dist-engine-src/src/untracked_state/materialization.rs +2 -2
- package/dist-engine-src/src/untracked_state/mod.rs +1 -1
- package/dist-engine-src/src/untracked_state/storage.rs +659 -157
- package/dist-engine-src/src/untracked_state/types.rs +21 -21
- package/package.json +71 -68
- package/dist-engine-src/src/backend/kv.rs +0 -358
- package/dist-engine-src/src/backend/testing.rs +0 -658
- package/dist-engine-src/src/commit_store/codec.rs +0 -887
- package/dist-engine-src/src/commit_store/context.rs +0 -944
- package/dist-engine-src/src/commit_store/materialization.rs +0 -84
- package/dist-engine-src/src/commit_store/mod.rs +0 -16
- package/dist-engine-src/src/commit_store/storage.rs +0 -600
- package/dist-engine-src/src/commit_store/types.rs +0 -215
- package/dist-engine-src/src/schema/builtin/lix_version_descriptor.json +0 -34
- package/dist-engine-src/src/schema/builtin/lix_version_ref.json +0 -48
- package/dist-engine-src/src/session/create_version.rs +0 -88
- package/dist-engine-src/src/session/merge/apply.rs +0 -23
- package/dist-engine-src/src/session/optimization9_sql2_bench.rs +0 -100
- package/dist-engine-src/src/session/switch_version.rs +0 -109
- package/dist-engine-src/src/sql2/classify.rs +0 -182
- package/dist-engine-src/src/sql2/entity_provider.rs +0 -3211
- package/dist-engine-src/src/sql2/execute.rs +0 -3440
- package/dist-engine-src/src/sql2/public_bind/assignment.rs +0 -46
- package/dist-engine-src/src/sql2/public_bind/capability.rs +0 -41
- package/dist-engine-src/src/sql2/public_bind/dml.rs +0 -166
- package/dist-engine-src/src/sql2/public_bind/mod.rs +0 -25
- package/dist-engine-src/src/sql2/public_bind/table.rs +0 -168
- package/dist-engine-src/src/sql2/version_scope.rs +0 -394
- package/dist-engine-src/src/storage/types.rs +0 -501
- package/dist-engine-src/src/tracked_state/by_file_index.rs +0 -98
- package/dist-engine-src/src/tracked_state/materializer.rs +0 -488
- package/dist-engine-src/src/transaction/live_state_overlay.rs +0 -35
- package/dist-engine-src/src/version/lifecycle.rs +0 -221
- package/dist-engine-src/src/version/mod.rs +0 -13
- package/dist-engine-src/src/version/refs.rs +0 -330
- package/dist-engine-src/src/version/stage_rows.rs +0 -67
- package/dist-engine-src/src/version/types.rs +0 -21
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
use crate::changelog::ChangeRecord;
|
|
2
|
+
use crate::entity_pk::EntityPk;
|
|
3
|
+
use crate::json_store::{JsonLoadRequestRef, JsonReadScopeRef, JsonRef, JsonStoreReader};
|
|
4
|
+
use crate::storage::StorageRead;
|
|
5
|
+
use crate::{parse_row_metadata, LixError};
|
|
6
|
+
|
|
7
|
+
/// Read-boundary view of a changelog change with JSON refs resolved.
|
|
8
|
+
///
|
|
9
|
+
/// `lix_change` materializes direct durable `changelog.change` facts and
|
|
10
|
+
/// derived `lix_commit` changes from `changelog.commit`. History surfaces
|
|
11
|
+
/// materialize reachability-aware commit-graph changes, while traversal context
|
|
12
|
+
/// stays outside this row shape.
|
|
13
|
+
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
14
|
+
pub(crate) struct MaterializedChange {
|
|
15
|
+
pub(crate) id: String,
|
|
16
|
+
pub(crate) entity_pk: EntityPk,
|
|
17
|
+
pub(crate) schema_key: String,
|
|
18
|
+
pub(crate) file_id: Option<String>,
|
|
19
|
+
pub(crate) snapshot_content: Option<String>,
|
|
20
|
+
pub(crate) metadata: Option<String>,
|
|
21
|
+
pub(crate) created_at: String,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
pub(crate) async fn materialize_located_history_change<S>(
|
|
25
|
+
json_reader: &mut JsonStoreReader<S>,
|
|
26
|
+
change: crate::commit_graph::CommitGraphChange,
|
|
27
|
+
) -> Result<MaterializedChange, LixError>
|
|
28
|
+
where
|
|
29
|
+
S: StorageRead,
|
|
30
|
+
{
|
|
31
|
+
materialize_commit_graph_change(json_reader, change).await
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
pub(crate) async fn materialize_changelog_change_record<S>(
|
|
35
|
+
json_reader: &mut JsonStoreReader<S>,
|
|
36
|
+
change: ChangeRecord,
|
|
37
|
+
) -> Result<MaterializedChange, LixError>
|
|
38
|
+
where
|
|
39
|
+
S: StorageRead,
|
|
40
|
+
{
|
|
41
|
+
materialize_commit_graph_change(
|
|
42
|
+
json_reader,
|
|
43
|
+
crate::commit_graph::CommitGraphChange {
|
|
44
|
+
id: change.change_id,
|
|
45
|
+
entity_pk: change.entity_pk,
|
|
46
|
+
schema_key: change.schema_key,
|
|
47
|
+
file_id: change.file_id,
|
|
48
|
+
snapshot_ref: change.snapshot_ref,
|
|
49
|
+
metadata_ref: change.metadata_ref,
|
|
50
|
+
created_at: change.created_at,
|
|
51
|
+
},
|
|
52
|
+
)
|
|
53
|
+
.await
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
pub(crate) async fn materialize_commit_graph_change<S>(
|
|
57
|
+
json_reader: &mut JsonStoreReader<S>,
|
|
58
|
+
change: crate::commit_graph::CommitGraphChange,
|
|
59
|
+
) -> Result<MaterializedChange, LixError>
|
|
60
|
+
where
|
|
61
|
+
S: StorageRead,
|
|
62
|
+
{
|
|
63
|
+
let snapshot_content = load_optional_changelog_json_text(
|
|
64
|
+
json_reader,
|
|
65
|
+
change.snapshot_ref.as_ref(),
|
|
66
|
+
"snapshot_ref",
|
|
67
|
+
)
|
|
68
|
+
.await?;
|
|
69
|
+
let metadata = match load_optional_changelog_json_text(
|
|
70
|
+
json_reader,
|
|
71
|
+
change.metadata_ref.as_ref(),
|
|
72
|
+
"metadata_ref",
|
|
73
|
+
)
|
|
74
|
+
.await?
|
|
75
|
+
{
|
|
76
|
+
Some(value) => Some(parse_row_metadata(&value, "changelog change metadata_ref")?),
|
|
77
|
+
None => None,
|
|
78
|
+
};
|
|
79
|
+
Ok(MaterializedChange {
|
|
80
|
+
id: change.id,
|
|
81
|
+
entity_pk: change.entity_pk,
|
|
82
|
+
schema_key: change.schema_key,
|
|
83
|
+
file_id: change.file_id,
|
|
84
|
+
snapshot_content,
|
|
85
|
+
metadata,
|
|
86
|
+
created_at: change.created_at,
|
|
87
|
+
})
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async fn load_optional_changelog_json_text<S>(
|
|
91
|
+
json_reader: &mut JsonStoreReader<S>,
|
|
92
|
+
json_ref: Option<&JsonRef>,
|
|
93
|
+
field: &str,
|
|
94
|
+
) -> Result<Option<String>, LixError>
|
|
95
|
+
where
|
|
96
|
+
S: StorageRead,
|
|
97
|
+
{
|
|
98
|
+
let Some(json_ref) = json_ref else {
|
|
99
|
+
return Ok(None);
|
|
100
|
+
};
|
|
101
|
+
let batch = json_reader
|
|
102
|
+
.load_bytes_many(JsonLoadRequestRef {
|
|
103
|
+
refs: std::slice::from_ref(json_ref),
|
|
104
|
+
scope: JsonReadScopeRef::OutOfBand,
|
|
105
|
+
})
|
|
106
|
+
.await?;
|
|
107
|
+
let Some(bytes) = batch.into_values().into_iter().next().flatten() else {
|
|
108
|
+
return Err(LixError::new(
|
|
109
|
+
LixError::CODE_INTERNAL_ERROR,
|
|
110
|
+
format!(
|
|
111
|
+
"changelog change {field} '{}' is missing",
|
|
112
|
+
json_ref.to_hex()
|
|
113
|
+
),
|
|
114
|
+
));
|
|
115
|
+
};
|
|
116
|
+
String::from_utf8(bytes).map(Some).map_err(|error| {
|
|
117
|
+
LixError::new(
|
|
118
|
+
LixError::CODE_INTERNAL_ERROR,
|
|
119
|
+
format!("changelog change {field} is not UTF-8 JSON: {error}"),
|
|
120
|
+
)
|
|
121
|
+
})
|
|
122
|
+
}
|
|
@@ -6,28 +6,31 @@ use serde_json::Value as JsonValue;
|
|
|
6
6
|
use tokio::sync::Mutex;
|
|
7
7
|
|
|
8
8
|
use crate::binary_cas::{BlobBytesBatch, BlobDataReader, BlobHash};
|
|
9
|
+
use crate::branch::{BranchHead, BranchRefReader};
|
|
9
10
|
use crate::commit_graph::CommitGraphReader;
|
|
10
|
-
use crate::commit_store::CommitStoreReader;
|
|
11
11
|
use crate::functions::FunctionProviderHandle;
|
|
12
12
|
use crate::json_store::JsonStoreReader;
|
|
13
13
|
use crate::live_state::{
|
|
14
14
|
LiveStateFilter, LiveStateReader, LiveStateRowRequest, LiveStateScanRequest,
|
|
15
15
|
MaterializedLiveStateRow,
|
|
16
16
|
};
|
|
17
|
-
use crate::storage::
|
|
17
|
+
use crate::storage::StorageRead;
|
|
18
18
|
use crate::transaction::types::{TransactionWrite, TransactionWriteOutcome};
|
|
19
|
-
use crate::version::{VersionHead, VersionRefReader};
|
|
20
19
|
use crate::LixError;
|
|
21
20
|
|
|
22
|
-
pub(crate) type
|
|
23
|
-
|
|
24
|
-
pub(crate) type
|
|
25
|
-
pub(crate) type SqlJsonReader = JsonStoreReader<ScopedStorageReader<SqlReadStore>>;
|
|
21
|
+
pub(crate) type SqlChangelogQuerySource<S> = ChangelogQuerySource<S>;
|
|
22
|
+
pub(crate) type SqlHistoryQuerySource<S> = HistoryQuerySource<S>;
|
|
23
|
+
pub(crate) type SqlJsonReader<S> = JsonStoreReader<S>;
|
|
26
24
|
|
|
27
25
|
#[derive(Clone)]
|
|
28
|
-
pub(crate) struct
|
|
29
|
-
pub(crate)
|
|
30
|
-
|
|
26
|
+
pub(crate) struct HistoryQuerySource<S> {
|
|
27
|
+
pub(crate) json_reader: JsonStoreReader<S>,
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
#[derive(Clone)]
|
|
31
|
+
pub(crate) struct ChangelogQuerySource<S> {
|
|
32
|
+
pub(crate) store: S,
|
|
33
|
+
pub(crate) json_reader: JsonStoreReader<S>,
|
|
31
34
|
}
|
|
32
35
|
|
|
33
36
|
/// Read-only execution boundary for `sql2::execute_sql(...)`.
|
|
@@ -41,12 +44,15 @@ pub(crate) struct CommitStoreQuerySource<S> {
|
|
|
41
44
|
/// sources.
|
|
42
45
|
#[allow(dead_code)]
|
|
43
46
|
pub(crate) trait SqlExecutionContext {
|
|
44
|
-
|
|
47
|
+
type ReadStore: StorageRead + Clone + Send + Sync + 'static;
|
|
48
|
+
|
|
49
|
+
fn active_branch_id(&self) -> &str;
|
|
45
50
|
fn live_state(&self) -> Arc<dyn LiveStateReader>;
|
|
46
51
|
fn functions(&self) -> FunctionProviderHandle;
|
|
47
|
-
fn
|
|
52
|
+
fn history_query_source(&self) -> SqlHistoryQuerySource<Self::ReadStore>;
|
|
53
|
+
fn changelog_query_source(&self) -> SqlChangelogQuerySource<Self::ReadStore>;
|
|
48
54
|
fn commit_graph(&self) -> Box<dyn CommitGraphReader>;
|
|
49
|
-
fn
|
|
55
|
+
fn branch_ref(&self) -> Arc<dyn BranchRefReader>;
|
|
50
56
|
fn blob_reader(&self) -> Arc<dyn BlobDataReader>;
|
|
51
57
|
fn list_visible_schemas(&self) -> Result<Vec<JsonValue>, LixError>;
|
|
52
58
|
}
|
|
@@ -60,7 +66,7 @@ pub(crate) trait SqlExecutionContext {
|
|
|
60
66
|
#[async_trait]
|
|
61
67
|
#[allow(dead_code)]
|
|
62
68
|
pub(crate) trait SqlWriteExecutionContext {
|
|
63
|
-
fn
|
|
69
|
+
fn active_branch_id(&self) -> &str;
|
|
64
70
|
fn functions(&self) -> FunctionProviderHandle;
|
|
65
71
|
fn list_visible_schemas(&self) -> Result<Vec<JsonValue>, LixError>;
|
|
66
72
|
|
|
@@ -71,7 +77,7 @@ pub(crate) trait SqlWriteExecutionContext {
|
|
|
71
77
|
request: &LiveStateScanRequest,
|
|
72
78
|
) -> Result<Vec<MaterializedLiveStateRow>, LixError>;
|
|
73
79
|
|
|
74
|
-
async fn
|
|
80
|
+
async fn load_branch_head(&mut self, branch_id: &str) -> Result<Option<String>, LixError>;
|
|
75
81
|
|
|
76
82
|
async fn stage_write(
|
|
77
83
|
&mut self,
|
|
@@ -120,8 +126,8 @@ impl SqlWriteContext {
|
|
|
120
126
|
unsafe { self.ptr.0.as_ref().list_visible_schemas() }
|
|
121
127
|
}
|
|
122
128
|
|
|
123
|
-
pub(crate) fn
|
|
124
|
-
unsafe { self.ptr.0.as_ref().
|
|
129
|
+
pub(crate) fn active_branch_id(&self) -> String {
|
|
130
|
+
unsafe { self.ptr.0.as_ref().active_branch_id().to_string() }
|
|
125
131
|
}
|
|
126
132
|
|
|
127
133
|
pub(crate) async fn scan_live_state(
|
|
@@ -156,9 +162,9 @@ impl SqlWriteContext {
|
|
|
156
162
|
}
|
|
157
163
|
}
|
|
158
164
|
|
|
159
|
-
pub(crate) async fn
|
|
165
|
+
pub(crate) async fn load_branch_head(
|
|
160
166
|
&self,
|
|
161
|
-
|
|
167
|
+
branch_id: &str,
|
|
162
168
|
) -> Result<Option<String>, LixError> {
|
|
163
169
|
let _guard = self.gate.lock().await;
|
|
164
170
|
unsafe {
|
|
@@ -167,7 +173,7 @@ impl SqlWriteContext {
|
|
|
167
173
|
.as_ptr()
|
|
168
174
|
.as_mut()
|
|
169
175
|
.unwrap()
|
|
170
|
-
.
|
|
176
|
+
.load_branch_head(branch_id)
|
|
171
177
|
.await
|
|
172
178
|
}
|
|
173
179
|
}
|
|
@@ -266,8 +272,8 @@ impl LiveStateReader for WriteContextLiveStateReader {
|
|
|
266
272
|
.scan_live_state(&LiveStateScanRequest {
|
|
267
273
|
filter: LiveStateFilter {
|
|
268
274
|
schema_keys: vec![request.schema_key.clone()],
|
|
269
|
-
|
|
270
|
-
|
|
275
|
+
entity_pks: vec![request.entity_pk.clone()],
|
|
276
|
+
branch_ids: vec![request.branch_id.clone()],
|
|
271
277
|
file_ids: vec![request.file_id.clone()],
|
|
272
278
|
..LiveStateFilter::default()
|
|
273
279
|
},
|
|
@@ -279,30 +285,30 @@ impl LiveStateReader for WriteContextLiveStateReader {
|
|
|
279
285
|
}
|
|
280
286
|
}
|
|
281
287
|
|
|
282
|
-
pub(crate) struct
|
|
288
|
+
pub(crate) struct WriteContextBranchRefReader {
|
|
283
289
|
ctx: SqlWriteContext,
|
|
284
290
|
}
|
|
285
291
|
|
|
286
|
-
impl
|
|
292
|
+
impl WriteContextBranchRefReader {
|
|
287
293
|
pub(crate) fn new(ctx: SqlWriteContext) -> Self {
|
|
288
294
|
Self { ctx }
|
|
289
295
|
}
|
|
290
296
|
}
|
|
291
297
|
|
|
292
298
|
#[async_trait]
|
|
293
|
-
impl
|
|
294
|
-
async fn load_head(&self,
|
|
299
|
+
impl BranchRefReader for WriteContextBranchRefReader {
|
|
300
|
+
async fn load_head(&self, branch_id: &str) -> Result<Option<BranchHead>, LixError> {
|
|
295
301
|
Ok(self
|
|
296
302
|
.ctx
|
|
297
|
-
.
|
|
303
|
+
.load_branch_head(branch_id)
|
|
298
304
|
.await?
|
|
299
|
-
.map(|commit_id|
|
|
300
|
-
|
|
305
|
+
.map(|commit_id| BranchHead {
|
|
306
|
+
branch_id: branch_id.to_string(),
|
|
301
307
|
commit_id,
|
|
302
308
|
}))
|
|
303
309
|
}
|
|
304
310
|
|
|
305
|
-
async fn scan_heads(&self) -> Result<Vec<
|
|
311
|
+
async fn scan_heads(&self) -> Result<Vec<BranchHead>, LixError> {
|
|
306
312
|
Err(LixError::new(
|
|
307
313
|
"LIX_ERROR_UNKNOWN",
|
|
308
314
|
"scan_heads is not available through sql2 write context",
|
|
@@ -59,7 +59,7 @@ fn classify_datafusion_error(error: &DataFusionError) -> LixError {
|
|
|
59
59
|
|
|
60
60
|
if looks_like_unsupported_dialect(&lower) {
|
|
61
61
|
return LixError::new(LixError::CODE_DIALECT_UNSUPPORTED, message)
|
|
62
|
-
.with_hint("Lix SQL uses DataFusion syntax. Use lix_json_get(...) or lix_json_get_text(...) for JSON access, and
|
|
62
|
+
.with_hint("Lix SQL uses DataFusion syntax. Use lix_json_get(...) or lix_json_get_text(...) for JSON access, and placeholders like ?, ? or $1, $2, ...");
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
if looks_like_unsupported_runtime_plan(&lower) {
|
|
@@ -76,9 +76,8 @@ fn classify_datafusion_error(error: &DataFusionError) -> LixError {
|
|
|
76
76
|
|| lower.contains("placeholder")
|
|
77
77
|
|| lower.contains("bind")
|
|
78
78
|
{
|
|
79
|
-
return LixError::new(LixError::CODE_PARSE_ERROR, message)
|
|
80
|
-
"Use numbered placeholders like $1, $2,
|
|
81
|
-
);
|
|
79
|
+
return LixError::new(LixError::CODE_PARSE_ERROR, message)
|
|
80
|
+
.with_hint("Use placeholders like ?, ? or numbered placeholders like $1, $2, ...");
|
|
82
81
|
}
|
|
83
82
|
|
|
84
83
|
if lower.contains("requires start_commit_id")
|
|
@@ -86,7 +85,7 @@ fn classify_datafusion_error(error: &DataFusionError) -> LixError {
|
|
|
86
85
|
|| lower.contains("history table")
|
|
87
86
|
{
|
|
88
87
|
return LixError::new(LixError::CODE_HISTORY_FILTER_REQUIRED, message)
|
|
89
|
-
.with_hint("Add a commit/
|
|
88
|
+
.with_hint("Add a commit/branch range predicate before querying history tables.");
|
|
90
89
|
}
|
|
91
90
|
|
|
92
91
|
if lower.contains("table not found")
|