surrealdb/sql/value/
inc.rs

1use crate::sql::number::Number;
2use crate::sql::part::Part;
3use crate::sql::value::Value;
4
5impl Value {
6	/// Synchronous method for incrementing a field in a `Value`
7	pub(crate) fn inc(&mut self, path: &[Part], val: Value) {
8		match self.pick(path) {
9			Value::Number(v) => {
10				if let Value::Number(x) = val {
11					self.put(path, Value::from(v + x))
12				}
13			}
14			Value::Array(v) => match val {
15				Value::Array(x) => self.put(path, Value::from(v + x)),
16				x => self.put(path, Value::from(v + x)),
17			},
18			Value::None => match val {
19				Value::Number(x) => self.put(path, Value::from(Number::from(0) + x)),
20				Value::Array(x) => self.put(path, Value::from(x)),
21				x => self.put(path, Value::from(vec![x])),
22			},
23			_ => (),
24		}
25	}
26}
27
28#[cfg(test)]
29mod tests {
30
31	use super::*;
32	use crate::sql::idiom::Idiom;
33	use crate::syn::test::Parse;
34
35	#[tokio::test]
36	async fn increment_none() {
37		let idi = Idiom::parse("other");
38		let mut val = Value::parse("{ test: 100 }");
39		let res = Value::parse("{ test: 100, other: +10 }");
40		val.inc(&idi, Value::from(10));
41		assert_eq!(res, val);
42	}
43
44	#[tokio::test]
45	async fn increment_number() {
46		let idi = Idiom::parse("test");
47		let mut val = Value::parse("{ test: 100 }");
48		let res = Value::parse("{ test: 110 }");
49		val.inc(&idi, Value::from(10));
50		assert_eq!(res, val);
51	}
52
53	#[tokio::test]
54	async fn increment_array_number() {
55		let idi = Idiom::parse("test[1]");
56		let mut val = Value::parse("{ test: [100, 200, 300] }");
57		let res = Value::parse("{ test: [100, 210, 300] }");
58		val.inc(&idi, Value::from(10));
59		assert_eq!(res, val);
60	}
61
62	#[tokio::test]
63	async fn increment_array_value() {
64		let idi = Idiom::parse("test");
65		let mut val = Value::parse("{ test: [100, 200, 300] }");
66		let res = Value::parse("{ test: [100, 200, 300, 200] }");
67		val.inc(&idi, Value::from(200));
68		assert_eq!(res, val);
69	}
70
71	#[tokio::test]
72	async fn increment_array_array() {
73		let idi = Idiom::parse("test");
74		let mut val = Value::parse("{ test: [100, 200, 300] }");
75		let res = Value::parse("{ test: [100, 200, 300, 100, 300, 400, 500] }");
76		val.inc(&idi, Value::parse("[100, 300, 400, 500]"));
77		assert_eq!(res, val);
78	}
79}