Skip to main content

reifydb_store_multi/persistent/sqlite/
query.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use std::ops::Bound;
5
6use reifydb_core::common::CommitVersion;
7
8#[inline]
9pub(super) fn version_to_bytes(version: CommitVersion) -> [u8; 8] {
10	version.0.to_be_bytes()
11}
12
13#[inline]
14pub(super) fn version_from_bytes(bytes: &[u8]) -> CommitVersion {
15	CommitVersion(u64::from_be_bytes(bytes.try_into().expect("version must be 8 bytes")))
16}
17
18pub(super) fn build_create_warm_current_sql(table_name: &str) -> String {
19	format!(
20		"CREATE TABLE IF NOT EXISTS \"{}\" (\
21			key BLOB PRIMARY KEY,\
22			version BLOB NOT NULL,\
23			value BLOB\
24		) WITHOUT ROWID",
25		table_name
26	)
27}
28
29pub(super) fn build_get_warm_current_sql(table_name: &str) -> String {
30	format!("SELECT version, value FROM \"{}\" WHERE key = ?1", table_name)
31}
32
33pub(super) fn build_upsert_warm_current_sql(table_name: &str) -> String {
34	format!(
35		"INSERT INTO \"{0}\" (key, version, value) VALUES (?1, ?2, ?3) \
36		 ON CONFLICT(key) DO UPDATE SET \
37		     version = excluded.version, \
38		     value = excluded.value \
39		 WHERE excluded.version >= \"{0}\".version",
40		table_name
41	)
42}
43
44pub(super) fn build_range_warm_current_sql(
45	table_name: &str,
46	start: Bound<()>,
47	end: Bound<()>,
48	has_last_key: bool,
49	descending: bool,
50) -> String {
51	let mut sql = format!("SELECT key, version, value FROM \"{}\" WHERE 1=1", table_name);
52	match start {
53		Bound::Included(()) => sql.push_str(" AND key >= ?"),
54		Bound::Excluded(()) => sql.push_str(" AND key > ?"),
55		Bound::Unbounded => {}
56	}
57	match end {
58		Bound::Included(()) => sql.push_str(" AND key <= ?"),
59		Bound::Excluded(()) => sql.push_str(" AND key < ?"),
60		Bound::Unbounded => {}
61	}
62	if has_last_key {
63		sql.push_str(if descending {
64			" AND key < ?"
65		} else {
66			" AND key > ?"
67		});
68	}
69	sql.push_str(" AND version <= ?");
70	if descending {
71		sql.push_str(" ORDER BY key DESC LIMIT ?");
72	} else {
73		sql.push_str(" ORDER BY key ASC LIMIT ?");
74	}
75	sql
76}