main
Ziyang Hu 2 years ago
parent 2f3b31341c
commit fad9cf9e09

@ -2,7 +2,6 @@
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="$PROJECT_DIR$/cozorocks/jemalloc" vcs="Git" />
<mapping directory="$PROJECT_DIR$/cozorocks/rocksdb" vcs="Git" />
</component>
</project>

@ -14,7 +14,7 @@ class CozoDb:
def tx(self, payload):
return json.loads(self.inner.transact_triples(json.dumps({'tx': payload}, ensure_ascii=False)))
def run(self, q, out=None, limit=None, offset=None):
def run(self, q, out=None, limit=None, offset=None, sort=None):
payload = {'q': q}
if out is not None:
payload['out'] = out
@ -22,9 +22,20 @@ class CozoDb:
payload['limit'] = limit
if offset is not None:
payload['offset'] = offset
if sort is not None:
payload['sort'] = [convert_sort_arg(arg) for arg in sort]
return json.loads(self.inner.run_query(json.dumps(payload, ensure_ascii=False)))
def convert_sort_arg(arg):
if arg.startswith('+'):
return {arg[1:]: 'asc'}
elif arg.startswith('-'):
return {arg[1:]: 'desc'}
else:
return {arg: 'asc'}
class Typing(str, Enum):
ref = 'ref'
component = 'component'

@ -22,11 +22,32 @@ use crate::utils::swap_result_option;
pub(crate) type OutSpec = (Vec<(usize, Option<PullSpecs>)>, Option<Vec<String>>);
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub(crate) enum SortDir {
Asc,
Dsc,
}
impl TryFrom<&'_ JsonValue> for SortDir {
type Error = anyhow::Error;
fn try_from(value: &'_ JsonValue) -> std::result::Result<Self, Self::Error> {
match value {
JsonValue::String(s) => {
todo!()
}
_ => bail!("unexpected value {} for sort direction specification", value)
}
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub(crate) struct QueryOutOptions {
pub(crate) out_spec: Option<OutSpec>,
pub(crate) vld: Validity,
pub(crate) limit: Option<usize>,
pub(crate) offset: Option<usize>,
pub(crate) sorters: Vec<(Symbol, SortDir)>,
}
impl QueryOutOptions {
@ -82,6 +103,19 @@ impl SessionTx {
.map(|v| v as usize)
.ok_or_else(|| anyhow!("'offset' must be a positive number"))
}))?;
let sorters = payload.get("sort")
.unwrap_or_else(|| &json!([]))
.as_array()
.ok_or_else(|| anyhow!("'sort' is expected to be an array"))?
.iter()
.map(|sorter| -> Result<(Symbol, SortDir)> {
let sorter = sorter.as_object()
.ok_or_else(|| anyhow!("'sort' must be an array of objects"))?;
ensure!(sorter.len() == 1, "'sort' spec must be an object of a single pair");
let (k, v) = sorter.iter().next().unwrap();
todo!()
}).try_collect()?;
Ok((
input_prog,
QueryOutOptions {
@ -89,6 +123,7 @@ impl SessionTx {
vld,
limit,
offset,
sorters
},
))
}

Loading…
Cancel
Save