fix tikv compilation

main
Ziyang Hu 2 years ago
parent dcee278e28
commit a01640df84

@ -22,6 +22,7 @@ use thiserror::Error;
use crate::algo::{AlgoImpl, CannotDetermineArity}; use crate::algo::{AlgoImpl, CannotDetermineArity};
use crate::data::expr::Expr; use crate::data::expr::Expr;
use crate::data::json::JsonValue;
use crate::data::program::{MagicAlgoApply, MagicSymbol}; use crate::data::program::{MagicAlgoApply, MagicSymbol};
use crate::data::symb::Symbol; use crate::data::symb::Symbol;
use crate::data::tuple::Tuple; use crate::data::tuple::Tuple;
@ -65,7 +66,7 @@ impl AlgoImpl for JsonReader {
_ => bail!(BadFields(fields_span)), _ => bail!(BadFields(fields_span)),
}; };
let mut counter = -1i64; let mut counter = -1i64;
let mut process_row = |row: &BTreeMap<String, DataValue>| -> Result<()> { let mut process_row = |row: &BTreeMap<String, JsonValue>| -> Result<()> {
let mut ret = if prepend_index { let mut ret = if prepend_index {
counter += 1; counter += 1;
vec![DataValue::from(counter)] vec![DataValue::from(counter)]
@ -81,7 +82,7 @@ impl AlgoImpl for JsonReader {
bail!("field {} is absent from JSON line", field); bail!("field {} is absent from JSON line", field);
} }
} }
Some(v) => v.clone(), Some(v) => DataValue::from(v),
}; };
ret.push(val); ret.push(val);
} }
@ -96,13 +97,13 @@ impl AlgoImpl for JsonReader {
let line = line.into_diagnostic()?; let line = line.into_diagnostic()?;
let line = line.trim(); let line = line.trim();
if !line.is_empty() { if !line.is_empty() {
let row = serde_json::from_str(line).into_diagnostic()?; let row: BTreeMap<String, JsonValue> = serde_json::from_str(line).into_diagnostic()?;
process_row(&row)?; process_row(&row)?;
} }
} }
} else { } else {
let content = fs::read_to_string(file_path).into_diagnostic()?; let content = fs::read_to_string(file_path).into_diagnostic()?;
let rows: Vec<BTreeMap<String, DataValue>> = serde_json::from_str(&content).into_diagnostic()?; let rows: Vec<BTreeMap<String, JsonValue>> = serde_json::from_str(&content).into_diagnostic()?;
for row in &rows { for row in &rows {
process_row(row)?; process_row(row)?;
} }
@ -122,7 +123,7 @@ impl AlgoImpl for JsonReader {
} }
} }
} else { } else {
let rows: Vec<BTreeMap<String, DataValue>> = serde_json::from_str(content).into_diagnostic()?; let rows: Vec<BTreeMap<String, JsonValue>> = serde_json::from_str(content).into_diagnostic()?;
for row in &rows { for row in &rows {
process_row(row)?; process_row(row)?;
} }

@ -87,7 +87,7 @@ impl PartialOrd for RegexWrapper {
#[derive( #[derive(
Clone, PartialEq, Eq, PartialOrd, Ord, serde_derive::Deserialize, serde_derive::Serialize, Hash, Clone, PartialEq, Eq, PartialOrd, Ord, serde_derive::Deserialize, serde_derive::Serialize, Hash,
)] )]
pub enum DataValue { pub(crate) enum DataValue {
Null, Null,
Bool(bool), Bool(bool),
Num(Num), Num(Num),

@ -34,6 +34,7 @@
#![allow(clippy::too_many_arguments)] #![allow(clippy::too_many_arguments)]
use std::collections::BTreeMap; use std::collections::BTreeMap;
use lazy_static::lazy_static; use lazy_static::lazy_static;
pub use miette::Error; pub use miette::Error;
#[allow(unused_imports)] #[allow(unused_imports)]
@ -57,7 +58,6 @@ pub use storage::tikv::{new_cozo_tikv, TiKvStorage};
pub use storage::{Storage, StoreTx}; pub use storage::{Storage, StoreTx};
use crate::data::json::JsonValue; use crate::data::json::JsonValue;
use crate::data::value::DataValue;
// pub use storage::re::{new_cozo_redb, ReStorage}; // pub use storage::re::{new_cozo_redb, ReStorage};
@ -113,6 +113,7 @@ impl DbInstance {
/// `options` is ignored for every kind except `tikv`. /// `options` is ignored for every kind except `tikv`.
#[allow(unused_variables)] #[allow(unused_variables)]
pub fn new(kind: &str, path: &str, options: &str) -> Result<Self> { pub fn new(kind: &str, path: &str, options: &str) -> Result<Self> {
let options = if options.is_empty() { "{}" } else { options };
Ok(match kind { Ok(match kind {
"mem" => Self::Mem(new_cozo_mem()?), "mem" => Self::Mem(new_cozo_mem()?),
#[cfg(feature = "storage-sqlite")] #[cfg(feature = "storage-sqlite")]
@ -126,10 +127,10 @@ impl DbInstance {
#[derive(serde_derive::Deserialize)] #[derive(serde_derive::Deserialize)]
struct TiKvOpts { struct TiKvOpts {
end_points: Vec<String>, end_points: Vec<String>,
#[serde(default = "Default::default()")] #[serde(default = "Default::default")]
optimistic: bool, optimistic: bool,
} }
let opts: TiKvOpts = serde_json::from_str(options)?; let opts: TiKvOpts = serde_json::from_str(options).into_diagnostic()?;
Self::TiKv(new_cozo_tikv(opts.end_points.clone(), opts.optimistic)?) Self::TiKv(new_cozo_tikv(opts.end_points.clone(), opts.optimistic)?)
} }
kind => bail!( kind => bail!(
@ -147,7 +148,11 @@ impl DbInstance {
Self::new(kind, path, options).map_err(|err| err.to_string()) Self::new(kind, path, options).map_err(|err| err.to_string())
} }
/// Dispatcher method. See [crate::Db::run_script]. /// Dispatcher method. See [crate::Db::run_script].
pub fn run_script(&self, payload: &str, params: &BTreeMap<String, DataValue>) -> Result<JsonValue> { pub fn run_script(
&self,
payload: &str,
params: BTreeMap<String, JsonValue>,
) -> Result<JsonValue> {
match self { match self {
DbInstance::Mem(db) => db.run_script(payload, params), DbInstance::Mem(db) => db.run_script(payload, params),
#[cfg(feature = "storage-sqlite")] #[cfg(feature = "storage-sqlite")]
@ -162,7 +167,11 @@ impl DbInstance {
} }
/// Run the CozoScript passed in. The `params` argument is a map of parameters. /// Run the CozoScript passed in. The `params` argument is a map of parameters.
/// Fold any error into the return JSON itself. /// Fold any error into the return JSON itself.
pub fn run_script_fold_err(&self, payload: &str, params: &BTreeMap<String, DataValue>) -> JsonValue { pub fn run_script_fold_err(
&self,
payload: &str,
params: BTreeMap<String, JsonValue>,
) -> JsonValue {
match self.run_script(payload, params) { match self.run_script(payload, params) {
Ok(json) => json, Ok(json) => json,
Err(mut err) => { Err(mut err) => {
@ -191,7 +200,7 @@ impl DbInstance {
let params_json = if params.is_empty() { let params_json = if params.is_empty() {
BTreeMap::default() BTreeMap::default()
} else { } else {
match serde_json::from_str::<BTreeMap<String, DataValue>>(params) { match serde_json::from_str::<BTreeMap<String, JsonValue>>(params) {
Ok(map) => map, Ok(map) => map,
Err(_) => { Err(_) => {
return json!({"ok": false, "message": "params argument is not a JSON map"}) return json!({"ok": false, "message": "params argument is not a JSON map"})
@ -199,7 +208,7 @@ impl DbInstance {
} }
} }
}; };
self.run_script_fold_err(payload, &params_json).to_string() self.run_script_fold_err(payload, params_json).to_string()
} }
/// Dispatcher method. See [crate::Db::export_relations]. /// Dispatcher method. See [crate::Db::export_relations].
pub fn export_relations<'a>( pub fn export_relations<'a>(

@ -105,11 +105,13 @@ impl<'s, S: Storage<'s>> Db<S> {
pub fn run_script( pub fn run_script(
&'s self, &'s self,
payload: &str, payload: &str,
params: &BTreeMap<String, DataValue>, params: BTreeMap<String, JsonValue>,
) -> Result<JsonValue> { ) -> Result<JsonValue> {
#[cfg(not(feature = "wasm"))] #[cfg(not(feature = "wasm"))]
let start = Instant::now(); let start = Instant::now();
match self.do_run_script(payload, params) {
let params = params.into_iter().map(|(k, v)| (k, DataValue::from(v))).collect();
match self.do_run_script(payload, &params) {
Ok(mut json) => { Ok(mut json) => {
{ {
#[cfg(not(feature = "wasm"))] #[cfg(not(feature = "wasm"))]

@ -55,7 +55,7 @@ lazy_static! {
lat: Float, lat: Float,
lon: Float lon: Float
} }
"##, &Default::default()).unwrap(); "##, Default::default()).unwrap();
db.run_script( db.run_script(
r##" r##"
@ -73,7 +73,7 @@ lazy_static! {
desc: String desc: String
} }
"##, "##,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
@ -93,7 +93,7 @@ lazy_static! {
desc: String desc: String
} }
"##, "##,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
@ -108,7 +108,7 @@ lazy_static! {
:replace idx2code { idx: Int => code: String } :replace idx2code { idx: Int => code: String }
"##, "##,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
@ -126,7 +126,7 @@ lazy_static! {
:replace route { fr: String, to: String => dist: Float } :replace route { fr: String, to: String => dist: Float }
"##, "##,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
@ -145,11 +145,11 @@ lazy_static! {
:replace contain { entity: String, contained: String } :replace contain { entity: String, contained: String }
"##, "##,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
db.run_script("::remove idx2code", &Default::default()) db.run_script("::remove idx2code", Default::default())
.unwrap(); .unwrap();
dbg!(init.elapsed()); dbg!(init.elapsed());
@ -159,7 +159,7 @@ lazy_static! {
fn check_db() { fn check_db() {
let _ = TEST_DB let _ = TEST_DB
.run_script("?[a] <- [[1]]", &Default::default()) .run_script("?[a] <- [[1]]", Default::default())
.unwrap(); .unwrap();
} }
@ -173,7 +173,7 @@ fn dfs() {
starting[] <- [['PEK']] starting[] <- [['PEK']]
?[] <~ DFS(*route[], *airport[code], starting[], condition: (code == 'LHR')) ?[] <~ DFS(*route[], *airport[code], starting[], condition: (code == 'LHR'))
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap().as_array().unwrap(); let rows = res.get("rows").unwrap().as_array().unwrap();
@ -194,7 +194,7 @@ fn empty() {
r#" r#"
?[id, name] <- [[]] ?[id, name] <- [[]]
"#, "#,
&Default::default(), Default::default(),
); );
assert!(res.is_err()); assert!(res.is_err());
} }
@ -209,7 +209,7 @@ fn bfs() {
starting[] <- [['PEK']] starting[] <- [['PEK']]
?[] <~ BFS(*route[], *airport[code], starting[], condition: (code == 'LHR')) ?[] <~ BFS(*route[], *airport[code], starting[], condition: (code == 'LHR'))
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap().as_array().unwrap(); let rows = res.get("rows").unwrap().as_array().unwrap();
@ -233,7 +233,7 @@ fn scc() {
res[] <~ StronglyConnectedComponents(*route[], *airport[code]); res[] <~ StronglyConnectedComponents(*route[], *airport[code]);
?[grp, code] := res[code, grp], grp != 0; ?[grp, code] := res[code, grp], grp != 0;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
dbg!(scc.elapsed()); dbg!(scc.elapsed());
@ -249,7 +249,7 @@ fn cc() {
res[] <~ ConnectedComponents(*route[], *airport[code]); res[] <~ ConnectedComponents(*route[], *airport[code]);
?[grp, code] := res[code, grp], grp != 0; ?[grp, code] := res[code, grp], grp != 0;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
dbg!(cc.elapsed()); dbg!(cc.elapsed());
@ -264,7 +264,7 @@ fn astar() {
starting[code, lat, lon] := code = 'HFE', *airport{code, lat, lon}; starting[code, lat, lon] := code = 'HFE', *airport{code, lat, lon};
goal[code, lat, lon] := code = 'LHR', *airport{code, lat, lon}; goal[code, lat, lon] := code = 'LHR', *airport{code, lat, lon};
?[] <~ ShortestPathAStar(*route[], code_lat_lon[node, lat1, lon1], starting[], goal[goal, lat2, lon2], heuristic: haversine_deg_input(lat1, lon1, lat2, lon2) * 3963); ?[] <~ ShortestPathAStar(*route[], code_lat_lon[node, lat1, lon1], starting[], goal[goal, lat2, lon2], heuristic: haversine_deg_input(lat1, lon1, lat2, lon2) * 3963);
"#, &Default::default()).unwrap(); "#, Default::default()).unwrap();
dbg!(astar.elapsed()); dbg!(astar.elapsed());
} }
@ -280,7 +280,7 @@ fn deg_centrality() {
:order -total; :order -total;
:limit 10; :limit 10;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
dbg!(deg_centrality.elapsed()); dbg!(deg_centrality.elapsed());
@ -299,7 +299,7 @@ fn dijkstra() {
res[] <~ ShortestPathDijkstra(*route[], starting[], ending[]); res[] <~ ShortestPathDijkstra(*route[], starting[], ending[]);
?[path] := res[src, dst, cost, path]; ?[path] := res[src, dst, cost, path];
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
@ -318,7 +318,7 @@ fn yen() {
ending[] <- [['SIN']]; ending[] <- [['SIN']];
?[] <~ KShortestPathYen(*route[], starting[], ending[], k: 5); ?[] <~ KShortestPathYen(*route[], starting[], ending[], k: 5);
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
@ -334,7 +334,7 @@ fn starts_with() {
r#" r#"
?[code] := *airport{code}, starts_with(code, 'US'); ?[code] := *airport{code}, starts_with(code, 'US');
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -367,7 +367,7 @@ fn range_check() {
r[code, dist] := *airport{code}, *route{fr: code, dist}; r[code, dist] := *airport{code}, *route{fr: code, dist};
?[dist] := r['PEK', dist], dist > 7000, dist <= 7722; ?[dist] := r['PEK', dist], dist > 7000, dist <= 7722;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -385,7 +385,7 @@ fn no_airports() {
r#" r#"
?[desc] := *country{code, desc}, not *airport{country: code}; ?[desc] := *country{code, desc}, not *airport{country: code};
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -412,7 +412,7 @@ fn no_routes_airport() {
r#" r#"
?[code] := *airport{code}, not *route{fr: code}, not *route{to: code} ?[code] := *airport{code}, not *route{fr: code}, not *route{to: code}
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -440,7 +440,7 @@ fn runway_distribution() {
r#" r#"
?[runways, count(code)] := *airport{code, runways} ?[runways, count(code)] := *airport{code, runways}
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -471,7 +471,7 @@ fn most_out_routes() {
?[code, n] := route_count[code, n], n > 180; ?[code, n] := route_count[code, n], n > 180;
:sort -n; :sort -n;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -503,7 +503,7 @@ fn most_out_routes_again() {
?[code, n] := route_count[n, code], n > 180; ?[code, n] := route_count[n, code], n > 180;
:sort -n; :sort -n;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -536,7 +536,7 @@ fn most_routes() {
?[code, n] := route_count[code, n], n > 400 ?[code, n] := route_count[code, n], n > 400
:sort -n; :sort -n;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -565,7 +565,7 @@ fn airport_with_one_route() {
route_count[fr, count(fr)] := *route{fr} route_count[fr, count(fr)] := *route{fr}
?[count(a)] := route_count[a, n], n == 1; ?[count(a)] := route_count[a, n], n == 1;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -589,7 +589,7 @@ fn single_runway_with_most_routes() {
:order -out_n; :order -out_n;
:limit 10; :limit 10;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -620,7 +620,7 @@ fn most_routes_in_canada() {
:order -n_routes; :order -n_routes;
:limit 10; :limit 10;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -652,7 +652,7 @@ fn uk_count() {
r#" r#"
?[region, count(region)] := *airport{country: 'UK', region} ?[region, count(region)] := *airport{country: 'UK', region}
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -677,7 +677,7 @@ fn airports_by_country() {
:order count :order count
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -728,7 +728,7 @@ fn n_airports_by_continent() {
?[cont, max(count)] := *continent{code: cont}, airports_by_continent[cont, count] ?[cont, max(count)] := *continent{code: cont}, airports_by_continent[cont, count]
?[cont, max(count)] := *continent{code: cont}, count = 0 ?[cont, max(count)] := *continent{code: cont}, count = 0
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -753,7 +753,7 @@ fn routes_per_airport() {
given[] <- [['A' ++ 'U' ++ 'S'],['AMS'],['JFK'],['DUB'],['MEX']] given[] <- [['A' ++ 'U' ++ 'S'],['AMS'],['JFK'],['DUB'],['MEX']]
?[code, count(code)] := given[code], *route{fr: code} ?[code, count(code)] := given[code], *route{fr: code}
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -778,7 +778,7 @@ fn airports_by_route_number() {
route_count[fr, count(fr)] := *route{fr} route_count[fr, count(fr)] := *route{fr}
?[n, collect(code)] := route_count[code, n], n = 106; ?[n, collect(code)] := route_count[code, n], n = 106;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -798,7 +798,7 @@ fn out_from_aus() {
two_hops[count(a)] := *route{fr: 'AUS', to: a}, *route{fr: a} two_hops[count(a)] := *route{fr: 'AUS', to: a}, *route{fr: a}
?[max(total), collect(coll)] := two_hops[total], out_by_runways[n, ct], coll = [n, ct]; ?[max(total), collect(coll)] := two_hops[total], out_by_runways[n, ct], coll = [n, ct];
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -820,7 +820,7 @@ fn const_return() {
r#" r#"
?[name, count(code)] := *airport{code, region: 'US-OK'}, name = 'OK'; ?[name, count(code)] := *airport{code, region: 'US-OK'}, name = 'OK';
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -845,7 +845,7 @@ fn multi_res() {
?[total, high, low, four, france] := total[total], high[high], low[low], ?[total, high, low, four, france] := total[total], high[high], low[low],
four[four], france[france]; four[four], france[france];
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -867,7 +867,7 @@ fn multi_unification() {
target_airports[collect(code, 5)] := *airport{code} target_airports[collect(code, 5)] := *airport{code}
?[a, count(a)] := target_airports[targets], a in targets, *route{fr: a} ?[a, count(a)] := target_airports[targets], a in targets, *route{fr: a}
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -893,7 +893,7 @@ fn num_routes_from_eu_to_us() {
r = [fr, to] r = [fr, to]
?[n] := routes[rs], n = length(rs); ?[n] := routes[rs], n = length(rs);
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -913,7 +913,7 @@ fn num_airports_in_us_with_routes_from_eu() {
*route{fr, to}, *route{fr, to},
*airport{code: to, country: 'US'} *airport{code: to, country: 'US'}
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -932,7 +932,7 @@ fn num_routes_in_us_airports_from_eu() {
?[to, count(to)] := *contain['EU', fr], *route{fr, to}, *airport{code: to, country: 'US'} ?[to, count(to)] := *contain['EU', fr], *route{fr, to}, *airport{code: to, country: 'US'}
:order count(to); :order count(to);
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -965,7 +965,7 @@ fn routes_from_eu_to_us_starting_with_l() {
*route{fr: eu_code, to: us_code}, *route{fr: eu_code, to: us_code},
*airport{code: us_code, country: 'US'} *airport{code: us_code, country: 'US'}
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1001,7 +1001,7 @@ fn len_of_names_count() {
*airport{code: to, city}, *airport{code: to, city},
n = length(city) n = length(city)
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1024,7 +1024,7 @@ fn group_count_by_out() {
:order n; :order n;
:limit 10; :limit 10;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1050,7 +1050,7 @@ fn mean_group_count() {
rc[max(n), a] := route_count[n, a] or (*airport{code: a}, n = 0); rc[max(n), a] := route_count[n, a] or (*airport{code: a}, n = 0);
?[mean(n)] := rc[n, _]; ?[mean(n)] := rc[n, _];
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1070,7 +1070,7 @@ fn n_routes_from_london_uk() {
r#" r#"
?[code, count(code)] := *airport{code, city: 'London', region: 'GB-ENG'}, *route{fr: code} ?[code, count(code)] := *airport{code, city: 'London', region: 'GB-ENG'}, *route{fr: code}
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1096,7 +1096,7 @@ fn reachable_from_london_uk_in_two_hops() {
one_hop[to] := lon_uk_airports[fr], *route{fr, to}, not lon_uk_airports[to]; one_hop[to] := lon_uk_airports[fr], *route{fr, to}, not lon_uk_airports[to];
?[count_unique(a3)] := one_hop[a2], *route{fr: a2, to: a3}, not lon_uk_airports[a3]; ?[count_unique(a3)] := one_hop[a2], *route{fr: a2, to: a3}, not lon_uk_airports[a3];
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1115,7 +1115,7 @@ fn routes_within_england() {
eng_aps[code] := *airport{code, region: 'GB-ENG'} eng_aps[code] := *airport{code, region: 'GB-ENG'}
?[fr, to] := eng_aps[fr], *route{fr, to}, eng_aps[to], ?[fr, to] := eng_aps[fr], *route{fr, to}, eng_aps[to],
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1149,7 +1149,7 @@ fn routes_within_england_time_no_dup() {
eng_aps[code] := *airport{code, region: 'GB-ENG'} eng_aps[code] := *airport{code, region: 'GB-ENG'}
?[pair] := eng_aps[fr], *route{fr, to}, eng_aps[to], pair = sorted([fr, to]); ?[pair] := eng_aps[fr], *route{fr, to}, eng_aps[to], pair = sorted([fr, to]);
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1184,7 +1184,7 @@ fn hard_route_finding() {
:limit 1; :limit 1;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1211,7 +1211,7 @@ fn na_from_india() {
*airport{code: na_a, country}, *airport{code: na_a, country},
country in ['US', 'CA'] country in ['US', 'CA']
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1238,7 +1238,7 @@ fn eu_cities_reachable_from_fll() {
r#" r#"
?[city] := *route{fr: 'FLL', to}, *contain['EU', to], *airport{code: to, city} ?[city] := *route{fr: 'FLL', to}, *contain['EU', to], *airport{code: to, city}
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1264,7 +1264,7 @@ fn clt_to_eu_or_sa() {
r#" r#"
?[to] := *route{fr: 'CLT', to}, c_name in ['EU', 'SA'], *contain[c_name, to] ?[to] := *route{fr: 'CLT', to}, c_name in ['EU', 'SA'], *contain[c_name, to]
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1291,7 +1291,7 @@ fn london_to_us() {
?[fr, to] := fr in ['LHR', 'LCY', 'LGW', 'LTN', 'STN'], ?[fr, to] := fr in ['LHR', 'LCY', 'LGW', 'LTN', 'STN'],
*route{fr, to}, *airport{code: to, country: 'US'} *route{fr, to}, *airport{code: to, country: 'US'}
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1325,7 +1325,7 @@ fn tx_to_ny() {
?[fr, to] := *airport{code: fr, region: 'US-TX'}, ?[fr, to] := *airport{code: fr, region: 'US-TX'},
*route{fr, to}, *airport{code: to, region: 'US-NY'} *route{fr, to}, *airport{code: to, region: 'US-NY'}
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1353,7 +1353,7 @@ fn denver_to_mexico() {
r#" r#"
?[city] := *route{fr: 'DEN', to}, *airport{code: to, country: 'MX', city} ?[city] := *route{fr: 'DEN', to}, *airport{code: to, country: 'MX', city}
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1381,7 +1381,7 @@ fn three_cities() {
three[code] := city in ['London', 'Munich', 'Paris'], *airport{code, city} three[code] := city in ['London', 'Munich', 'Paris'], *airport{code, city}
?[s, d] := three[s], *route{fr: s, to: d}, three[d] ?[s, d] := three[s], *route{fr: s, to: d}, three[d]
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1412,7 +1412,7 @@ fn long_distance_from_lgw() {
?[city, dist] := *route{fr: 'LGW', to, dist}, ?[city, dist] := *route{fr: 'LGW', to, dist},
dist > 4000, *airport{code: to, city} dist > 4000, *airport{code: to, city}
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1446,7 +1446,7 @@ fn long_routes_one_dir() {
r#" r#"
?[fr, dist, to] := *route{fr, to, dist}, dist > 8000, fr < to; ?[fr, dist, to] := *route{fr, to, dist}, dist > 8000, fr < to;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1480,7 +1480,7 @@ fn longest_routes() {
:sort -dist; :sort -dist;
:limit 20; :limit 20;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1510,7 +1510,7 @@ fn longest_routes_from_each_airports() {
?[fr, max(dist), choice(to)] := *route{fr, dist, to} ?[fr, max(dist), choice(to)] := *route{fr, dist, to}
:limit 10; :limit 10;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1538,7 +1538,7 @@ fn total_distance_from_three_cities() {
three[code] := city in ['London', 'Munich', 'Paris'], *airport{code, city} three[code] := city in ['London', 'Munich', 'Paris'], *airport{code, city}
?[sum(dist)] := three[a], *route{fr: a, dist} ?[sum(dist)] := three[a], *route{fr: a, dist}
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1560,7 +1560,7 @@ fn total_distance_within_three_cities() {
three[code] := city in ['London', 'Munich', 'Paris'], *airport{code, city} three[code] := city in ['London', 'Munich', 'Paris'], *airport{code, city}
?[sum(dist)] := three[a], *route{fr: a, dist, to}, three[to] ?[sum(dist)] := three[a], *route{fr: a, dist, to}, three[to]
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1581,7 +1581,7 @@ fn specific_distance() {
r#" r#"
?[dist] := *route{fr: 'AUS', to: 'MEX', dist} ?[dist] := *route{fr: 'AUS', to: 'MEX', dist}
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1601,7 +1601,7 @@ fn n_routes_between() {
?[count(fr)] := *route{fr, to, dist}, dist >= 100, dist <= 200, ?[count(fr)] := *route{fr, to, dist}, dist >= 100, dist <= 200,
us_a[fr], us_a[to] us_a[fr], us_a[to]
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1623,7 +1623,7 @@ fn one_stop_distance() {
:order dist; :order dist;
:limit 10; :limit 10;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1651,7 +1651,7 @@ fn airport_most_routes() {
:order -count(fr); :order -count(fr);
:limit 10; :limit 10;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1677,7 +1677,7 @@ fn north_of_77() {
r#" r#"
?[city, latitude] := *airport{lat, city}, lat > 77, latitude = round(lat) ?[city, latitude] := *airport{lat, city}, lat > 77, latitude = round(lat)
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1698,7 +1698,7 @@ fn greenwich_meridian() {
r#" r#"
?[code] := *airport{lon, code}, lon > -0.1, lon < 0.1 ?[code] := *airport{lon, code}, lon > -0.1, lon < 0.1
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1721,7 +1721,7 @@ fn box_around_heathrow() {
?[code] := h_box[lhr_lon, lhr_lat], *airport{code, lon, lat}, ?[code] := h_box[lhr_lon, lhr_lat], *airport{code, lon, lat},
abs(lhr_lon - lon) < 1, abs(lhr_lat - lat) < 1 abs(lhr_lon - lon) < 1, abs(lhr_lat - lat) < 1
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1745,7 +1745,7 @@ fn dfw_by_region() {
*airport{code: to, country: 'US', region}, *airport{code: to, country: 'US', region},
region in ['US-CA', 'US-TX', 'US-FL', 'US-CO', 'US-IL'] region in ['US-CA', 'US-TX', 'US-FL', 'US-CO', 'US-IL']
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1776,7 +1776,7 @@ fn great_circle_distance() {
*airport{code: 'NRT', lat: b_lat, lon: b_lon}, *airport{code: 'NRT', lat: b_lat, lon: b_lon},
deg_diff = round(haversine_deg_input(a_lat, a_lon, b_lat, b_lon)); deg_diff = round(haversine_deg_input(a_lat, a_lon, b_lat, b_lon));
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1801,7 +1801,7 @@ fn aus_to_edi() {
path = append(prev, to); path = append(prev, to);
?[path] := routes['EDI', path]; ?[path] := routes['EDI', path];
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1829,7 +1829,7 @@ fn reachable_from_lhr() {
:order -len; :order -len;
:limit 10; :limit 10;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1873,7 +1873,7 @@ fn furthest_from_lhr() {
:order -cost; :order -cost;
:limit 10; :limit 10;
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1901,7 +1901,7 @@ fn skip_limit() {
r#" r#"
?[a] := a in [9, 9, 8, 9, 8, 7, 7, 6, 5, 9, 4, 4, 3] ?[a] := a in [9, 9, 8, 9, 8, 7, 7, 6, 5, 9, 4, 4, 3]
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1912,7 +1912,7 @@ fn skip_limit() {
r#" r#"
?[a] := a in [9, 9, 8, 9, 8, 7, 7, 6, 5, 9, 4, 4, 3] ?[a] := a in [9, 9, 8, 9, 8, 7, 7, 6, 5, 9, 4, 4, 3]
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1924,7 +1924,7 @@ fn skip_limit() {
?[a] := a in [9, 9, 8, 9, 8, 7, 7, 6, 5, 9, 4, 4, 3] ?[a] := a in [9, 9, 8, 9, 8, 7, 7, 6, 5, 9, 4, 4, 3]
:limit 2 :limit 2
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1937,7 +1937,7 @@ fn skip_limit() {
:limit 2 :limit 2
:offset 1 :offset 1
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();
@ -1950,7 +1950,7 @@ fn skip_limit() {
:limit 100 :limit 100
:offset 1 :offset 1
"#, "#,
&Default::default(), Default::default(),
) )
.unwrap(); .unwrap();
let rows = res.get("rows").unwrap(); let rows = res.get("rows").unwrap();

@ -38,6 +38,10 @@ io-uring = ["cozo/io-uring"]
rayon = ["cozo/rayon"] rayon = ["cozo/rayon"]
## Disallows the use of threads ## Disallows the use of threads
nothread = ["cozo/nothread"] nothread = ["cozo/nothread"]
## Enables the [Sled](https://github.com/spacejam/sled) backend
storage-sled = ["cozo/storage-sled"]
## Enables the [TiKV](https://tikv.org/) client backend
storage-tikv = ["cozo/storage-tikv"]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

@ -6,6 +6,7 @@
* You can obtain one at https://mozilla.org/MPL/2.0/. * You can obtain one at https://mozilla.org/MPL/2.0/.
*/ */
use std::collections::BTreeMap;
use std::fmt::Debug; use std::fmt::Debug;
use std::fs; use std::fs;
use std::net::Ipv6Addr; use std::net::Ipv6Addr;
@ -36,8 +37,8 @@ struct Args {
restore: Option<String>, restore: Option<String>,
/// Extra config in JSON format /// Extra config in JSON format
#[clap(short, long, default_value_t = json!({}))] #[clap(short, long, default_value_t = String::from("{}"))]
config: serde_json::Value, config: String,
/// Address to bind the service to /// Address to bind the service to
#[clap(short, long, default_value_t = String::from("127.0.0.1"))] #[clap(short, long, default_value_t = String::from("127.0.0.1"))]
@ -68,10 +69,10 @@ fn main() {
eprintln!("{}", SECURITY_WARNING); eprintln!("{}", SECURITY_WARNING);
} }
let db = DbInstance::new(args.kind.as_str(), args.path.as_str(), args.config.clone()).unwrap(); let db = DbInstance::new(args.kind.as_str(), args.path.as_str(), &args.config.clone()).unwrap();
if let Some(restore_path) = &args.restore { if let Some(restore_path) = &args.restore {
db.restore_backup(restore_path.to_string()).unwrap(); db.restore_backup(restore_path).unwrap();
} }
let conf_path = format!("{}.{}.cozo_auth", args.path, args.kind); let conf_path = format!("{}.{}.cozo_auth", args.path, args.kind);
@ -122,11 +123,11 @@ fn main() {
#[derive(serde_derive::Serialize, serde_derive::Deserialize)] #[derive(serde_derive::Serialize, serde_derive::Deserialize)]
struct QueryPayload { struct QueryPayload {
script: String, script: String,
params: serde_json::Map<String, serde_json::Value>, params: BTreeMap<String, serde_json::Value>,
} }
let payload: QueryPayload = try_or_400!(rouille::input::json_input(request)); let payload: QueryPayload = try_or_400!(rouille::input::json_input(request));
let result = db.run_script_fold_err(&payload.script, &payload.params); let result = db.run_script_fold_err(&payload.script, payload.params);
let response = Response::json(&result); let response = Response::json(&result);
if let Some(serde_json::Value::Bool(true)) = result.get("ok") { if let Some(serde_json::Value::Bool(true)) = result.get("ok") {
response response

Loading…
Cancel
Save