Make sdk create consistent (#4667)
This commit is contained in:
parent
b0cde2a40a
commit
ff3c3bcc2b
5 changed files with 25 additions and 18 deletions
|
@ -337,7 +337,7 @@ pub trait RpcContext {
|
||||||
return Err(RpcError::InvalidParams);
|
return Err(RpcError::InvalidParams);
|
||||||
};
|
};
|
||||||
|
|
||||||
let one = data.is_single();
|
let one = what.is_thing_single();
|
||||||
|
|
||||||
let mut res = match what {
|
let mut res = match what {
|
||||||
Value::None | Value::Null => {
|
Value::None | Value::Null => {
|
||||||
|
@ -375,8 +375,9 @@ pub trait RpcContext {
|
||||||
let Ok((what, data)) = params.needs_one_or_two() else {
|
let Ok((what, data)) = params.needs_one_or_two() else {
|
||||||
return Err(RpcError::InvalidParams);
|
return Err(RpcError::InvalidParams);
|
||||||
};
|
};
|
||||||
|
let what = what.could_be_table();
|
||||||
// Return a single result?
|
// Return a single result?
|
||||||
let one = what.is_thing_single();
|
let one = what.is_thing_single() || what.is_table();
|
||||||
// Specify the SQL query string
|
// Specify the SQL query string
|
||||||
let sql = if data.is_none_or_null() {
|
let sql = if data.is_none_or_null() {
|
||||||
"CREATE $what RETURN AFTER"
|
"CREATE $what RETURN AFTER"
|
||||||
|
@ -385,7 +386,7 @@ pub trait RpcContext {
|
||||||
};
|
};
|
||||||
// Specify the query parameters
|
// Specify the query parameters
|
||||||
let var = Some(map! {
|
let var = Some(map! {
|
||||||
String::from("what") => what.could_be_table(),
|
String::from("what") => what,
|
||||||
String::from("data") => data,
|
String::from("data") => data,
|
||||||
=> &self.vars()
|
=> &self.vars()
|
||||||
});
|
});
|
||||||
|
@ -540,7 +541,7 @@ pub trait RpcContext {
|
||||||
return Err(RpcError::InvalidParams);
|
return Err(RpcError::InvalidParams);
|
||||||
};
|
};
|
||||||
// Return a single result?
|
// Return a single result?
|
||||||
let one = kind.is_thing_single();
|
let one = from.is_single() && to.is_single();
|
||||||
// Specify the SQL query string
|
// Specify the SQL query string
|
||||||
let sql = if data.is_none_or_null() {
|
let sql = if data.is_none_or_null() {
|
||||||
"RELATE $from->$kind->$to"
|
"RELATE $from->$kind->$to"
|
||||||
|
|
|
@ -1168,7 +1168,7 @@ impl Value {
|
||||||
pub fn is_single(&self) -> bool {
|
pub fn is_single(&self) -> bool {
|
||||||
match self {
|
match self {
|
||||||
Value::Object(_) => true,
|
Value::Object(_) => true,
|
||||||
Value::Array(a) if a.len() == 1 => true,
|
t @ Value::Thing(_) => t.is_thing_single(),
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ use crate::{
|
||||||
Connect, Response as QueryResponse, Result, Surreal,
|
Connect, Response as QueryResponse, Result, Surreal,
|
||||||
},
|
},
|
||||||
method::Stats,
|
method::Stats,
|
||||||
opt::{IntoEndpoint, Resource as ApiResource, Table},
|
opt::{IntoEndpoint, Table},
|
||||||
value::Notification,
|
value::Notification,
|
||||||
};
|
};
|
||||||
use channel::Sender;
|
use channel::Sender;
|
||||||
|
@ -559,7 +559,7 @@ async fn router(
|
||||||
data,
|
data,
|
||||||
} => {
|
} => {
|
||||||
let mut query = Query::default();
|
let mut query = Query::default();
|
||||||
let one = matches!(what, ApiResource::RecordId(_));
|
let one = what.is_single_recordid();
|
||||||
let statement = {
|
let statement = {
|
||||||
let mut stmt = UpsertStatement::default();
|
let mut stmt = UpsertStatement::default();
|
||||||
stmt.what = resource_to_values(what);
|
stmt.what = resource_to_values(what);
|
||||||
|
@ -578,7 +578,7 @@ async fn router(
|
||||||
data,
|
data,
|
||||||
} => {
|
} => {
|
||||||
let mut query = Query::default();
|
let mut query = Query::default();
|
||||||
let one = matches!(what, ApiResource::RecordId(_));
|
let one = what.is_single_recordid();
|
||||||
let statement = {
|
let statement = {
|
||||||
let mut stmt = UpdateStatement::default();
|
let mut stmt = UpdateStatement::default();
|
||||||
stmt.what = resource_to_values(what);
|
stmt.what = resource_to_values(what);
|
||||||
|
@ -635,7 +635,7 @@ async fn router(
|
||||||
data,
|
data,
|
||||||
} => {
|
} => {
|
||||||
let mut query = Query::default();
|
let mut query = Query::default();
|
||||||
let one = matches!(what, ApiResource::RecordId(_));
|
let one = what.is_single_recordid();
|
||||||
let statement = {
|
let statement = {
|
||||||
let mut stmt = UpdateStatement::default();
|
let mut stmt = UpdateStatement::default();
|
||||||
stmt.what = resource_to_values(what);
|
stmt.what = resource_to_values(what);
|
||||||
|
@ -654,7 +654,7 @@ async fn router(
|
||||||
data,
|
data,
|
||||||
} => {
|
} => {
|
||||||
let mut query = Query::default();
|
let mut query = Query::default();
|
||||||
let one = matches!(what, ApiResource::RecordId(_));
|
let one = what.is_single_recordid();
|
||||||
let statement = {
|
let statement = {
|
||||||
let mut stmt = UpdateStatement::default();
|
let mut stmt = UpdateStatement::default();
|
||||||
stmt.what = resource_to_values(what);
|
stmt.what = resource_to_values(what);
|
||||||
|
@ -672,7 +672,7 @@ async fn router(
|
||||||
what,
|
what,
|
||||||
} => {
|
} => {
|
||||||
let mut query = Query::default();
|
let mut query = Query::default();
|
||||||
let one = matches!(what, ApiResource::RecordId(_));
|
let one = what.is_single_recordid();
|
||||||
let statement = {
|
let statement = {
|
||||||
let mut stmt = SelectStatement::default();
|
let mut stmt = SelectStatement::default();
|
||||||
stmt.what = resource_to_values(what);
|
stmt.what = resource_to_values(what);
|
||||||
|
@ -689,7 +689,7 @@ async fn router(
|
||||||
what,
|
what,
|
||||||
} => {
|
} => {
|
||||||
let mut query = Query::default();
|
let mut query = Query::default();
|
||||||
let one = matches!(what, ApiResource::RecordId(_));
|
let one = what.is_single_recordid();
|
||||||
let statement = {
|
let statement = {
|
||||||
let mut stmt = DeleteStatement::default();
|
let mut stmt = DeleteStatement::default();
|
||||||
stmt.what = resource_to_values(what);
|
stmt.what = resource_to_values(what);
|
||||||
|
|
|
@ -4,7 +4,8 @@ use crate::{
|
||||||
};
|
};
|
||||||
use std::ops::{self, Bound};
|
use std::ops::{self, Bound};
|
||||||
use surrealdb_core::sql::{
|
use surrealdb_core::sql::{
|
||||||
Edges as CoreEdges, IdRange as CoreIdRange, Table as CoreTable, Thing as CoreThing,
|
Edges as CoreEdges, Id as CoreId, IdRange as CoreIdRange, Table as CoreTable,
|
||||||
|
Thing as CoreThing,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(any(feature = "protocol-ws", feature = "protocol-http"))]
|
#[cfg(any(feature = "protocol-ws", feature = "protocol-http"))]
|
||||||
|
@ -104,6 +105,12 @@ impl Resource {
|
||||||
Resource::Unspecified => CoreValue::None,
|
Resource::Unspecified => CoreValue::None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pub fn is_single_recordid(&self) -> bool {
|
||||||
|
match self {
|
||||||
|
Resource::RecordId(rid) => !matches!(rid.into_inner_ref().id, CoreId::Range(_)),
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<RecordId> for Resource {
|
impl From<RecordId> for Resource {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use super::common::{self, Format, Socket, DB, NS, PASS, USER};
|
use super::common::{self, Format, Socket, DB, NS, PASS, USER};
|
||||||
use http::header::{HeaderMap, HeaderValue};
|
|
||||||
use assert_fs::TempDir;
|
use assert_fs::TempDir;
|
||||||
|
use http::header::{HeaderMap, HeaderValue};
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
|
@ -380,10 +380,9 @@ async fn create() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
assert!(res.is_object(), "result: {res:?}");
|
assert!(res.is_object(), "result: {res:?}");
|
||||||
assert!(res["result"].is_array(), "result: {res:?}");
|
assert!(res["result"].is_object(), "result: {res:?}");
|
||||||
let res = res["result"].as_array().unwrap();
|
let res = res["result"].as_object().unwrap();
|
||||||
assert_eq!(res.len(), 1, "result: {res:?}");
|
assert_eq!(res["value"], "bar", "result: {res:?}");
|
||||||
assert_eq!(res[0]["value"], "bar", "result: {res:?}");
|
|
||||||
// Verify the data was created
|
// Verify the data was created
|
||||||
let res = socket.send_message_query("SELECT * FROM tester").await?;
|
let res = socket.send_message_query("SELECT * FROM tester").await?;
|
||||||
assert!(res[0]["result"].is_array(), "result: {res:?}");
|
assert!(res[0]["result"].is_array(), "result: {res:?}");
|
||||||
|
|
Loading…
Reference in a new issue