Added existing to the calculations.
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1s
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1s
This commit is contained in:
parent
09b4aad7bd
commit
6709a96285
132
src/message.rs
132
src/message.rs
@ -1964,7 +1964,7 @@ impl FieldSetting {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn set_default(&mut self, value: Calculation) -> Result<(), MTTError> {
|
fn set_default(&mut self, value: Calculation) -> Result<(), MTTError> {
|
||||||
let data = value.calculate();
|
let data = value.calculate(Field::None);
|
||||||
match self.validate(Some(data)) {
|
match self.validate(Some(data)) {
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
Err(err) => return Err(err),
|
Err(err) => return Err(err),
|
||||||
@ -1986,7 +1986,7 @@ impl FieldSetting {
|
|||||||
Ok(data.clone())
|
Ok(data.clone())
|
||||||
}
|
}
|
||||||
None => match &self.default_value {
|
None => match &self.default_value {
|
||||||
Some(calc) => Ok(calc.calculate()),
|
Some(calc) => Ok(calc.calculate(Field::None)),
|
||||||
None => Err(MTTError::InvalidNone),
|
None => Err(MTTError::InvalidNone),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -2449,16 +2449,18 @@ mod operands {
|
|||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
enum CalcValue {
|
enum CalcValue {
|
||||||
Calculate(Calculation),
|
Calculate(Calculation),
|
||||||
|
Existing(FieldType),
|
||||||
FType(FieldType),
|
FType(FieldType),
|
||||||
Value(Field),
|
Value(Field),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CalcValue {
|
impl CalcValue {
|
||||||
fn get(&self) -> Field {
|
fn get(&self, existing: Field) -> Field {
|
||||||
match self {
|
match self {
|
||||||
|
Self::Calculate(calc) => calc.calculate(existing),
|
||||||
|
Self::Existing(_) => existing,
|
||||||
Self::FType(ftype) => ftype.get_default(),
|
Self::FType(ftype) => ftype.get_default(),
|
||||||
Self::Value(field) => field.clone(),
|
Self::Value(field) => field.clone(),
|
||||||
Self::Calculate(calc) => calc.calculate(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2543,7 +2545,7 @@ mod calcvalues {
|
|||||||
CalcValue::Value(data) => assert_eq!(data, expected),
|
CalcValue::Value(data) => assert_eq!(data, expected),
|
||||||
_ => unreachable!("got {:?}, should have gotten a field", result),
|
_ => unreachable!("got {:?}, should have gotten a field", result),
|
||||||
}
|
}
|
||||||
assert_eq!(result.get(), expected);
|
assert_eq!(result.get(Field::None), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -2555,7 +2557,7 @@ mod calcvalues {
|
|||||||
CalcValue::Value(data) => assert_eq!(data, expected),
|
CalcValue::Value(data) => assert_eq!(data, expected),
|
||||||
_ => unreachable!("got {:?}, should have gotten a field", result),
|
_ => unreachable!("got {:?}, should have gotten a field", result),
|
||||||
}
|
}
|
||||||
assert_eq!(result.get(), expected);
|
assert_eq!(result.get(Field::None), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -2567,7 +2569,7 @@ mod calcvalues {
|
|||||||
CalcValue::Value(data) => assert_eq!(data, expected),
|
CalcValue::Value(data) => assert_eq!(data, expected),
|
||||||
_ => unreachable!("got {:?}, should have gotten a field", result),
|
_ => unreachable!("got {:?}, should have gotten a field", result),
|
||||||
}
|
}
|
||||||
assert_eq!(result.get(), expected);
|
assert_eq!(result.get(Field::None), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -2579,7 +2581,7 @@ mod calcvalues {
|
|||||||
CalcValue::Value(data) => assert_eq!(data, expected),
|
CalcValue::Value(data) => assert_eq!(data, expected),
|
||||||
_ => unreachable!("got {:?}, should have gotten a field", result),
|
_ => unreachable!("got {:?}, should have gotten a field", result),
|
||||||
}
|
}
|
||||||
assert_eq!(result.get(), expected);
|
assert_eq!(result.get(Field::None), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -2591,7 +2593,7 @@ mod calcvalues {
|
|||||||
CalcValue::Value(data) => assert_eq!(data, expected),
|
CalcValue::Value(data) => assert_eq!(data, expected),
|
||||||
_ => unreachable!("got {:?}, should have gotten a field", result),
|
_ => unreachable!("got {:?}, should have gotten a field", result),
|
||||||
}
|
}
|
||||||
assert_eq!(result.get(), expected);
|
assert_eq!(result.get(Field::None), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -2603,7 +2605,7 @@ mod calcvalues {
|
|||||||
CalcValue::Value(data) => assert_eq!(data, expected),
|
CalcValue::Value(data) => assert_eq!(data, expected),
|
||||||
_ => unreachable!("got {:?}, should have gotten a field", result),
|
_ => unreachable!("got {:?}, should have gotten a field", result),
|
||||||
}
|
}
|
||||||
assert_eq!(result.get(), expected);
|
assert_eq!(result.get(Field::None), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -2615,7 +2617,7 @@ mod calcvalues {
|
|||||||
CalcValue::Value(data) => assert_eq!(data, expected),
|
CalcValue::Value(data) => assert_eq!(data, expected),
|
||||||
_ => unreachable!("got {:?}, should have gotten a field", result),
|
_ => unreachable!("got {:?}, should have gotten a field", result),
|
||||||
}
|
}
|
||||||
assert_eq!(result.get(), expected);
|
assert_eq!(result.get(Field::None), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -2626,7 +2628,7 @@ mod calcvalues {
|
|||||||
calc.add_value(FieldType::DateTime);
|
calc.add_value(FieldType::DateTime);
|
||||||
calc.add_value(duration.clone());
|
calc.add_value(duration.clone());
|
||||||
let result: CalcValue = calc.into();
|
let result: CalcValue = calc.into();
|
||||||
let data = match result.get() {
|
let data = match result.get(Field::None) {
|
||||||
Field::DateTime(data) => data,
|
Field::DateTime(data) => data,
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
@ -2656,10 +2658,10 @@ impl Calculation {
|
|||||||
&self.operation
|
&self.operation
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_fields(&self) -> Vec<Field> {
|
fn get_fields(&self, existing: Field) -> Vec<Field> {
|
||||||
let mut output = Vec::new();
|
let mut output = Vec::new();
|
||||||
for item in self.values.iter() {
|
for item in self.values.iter() {
|
||||||
output.push(item.get());
|
output.push(item.get(existing.clone()));
|
||||||
}
|
}
|
||||||
output
|
output
|
||||||
}
|
}
|
||||||
@ -2678,39 +2680,45 @@ impl Calculation {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_type(calc_value: CalcValue) -> FieldType {
|
||||||
|
match calc_value {
|
||||||
|
CalcValue::Existing(field_type) => field_type,
|
||||||
|
_ => calc_value.get(Field::None).get_type(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn add_value<CV>(&mut self, data: CV) -> Result<(), MTTError>
|
fn add_value<CV>(&mut self, data: CV) -> Result<(), MTTError>
|
||||||
where
|
where
|
||||||
CV: Into<CalcValue>,
|
CV: Into<CalcValue>,
|
||||||
{
|
{
|
||||||
let holder: CalcValue = data.into();
|
let holder: CalcValue = data.into();
|
||||||
if self.values.len() == 0 {
|
if self.values.is_empty() {
|
||||||
self.values.push(holder);
|
self.values.push(holder);
|
||||||
Ok(())
|
return Ok(());
|
||||||
} else {
|
}
|
||||||
let mut base = self.values[0].get().get_type();
|
let ftype = Self::get_type(holder.clone());
|
||||||
let ftype = holder.get().get_type();
|
let mut base = Self::get_type(self.values[0].clone());
|
||||||
match self.operation {
|
match self.operation {
|
||||||
Operand::Add => {
|
Operand::Add => {
|
||||||
if base == FieldType::DateTime {
|
if base == FieldType::DateTime {
|
||||||
base = FieldType::Duration;
|
base = FieldType::Duration;
|
||||||
}
|
|
||||||
match self.push_value(base, ftype, holder) {
|
|
||||||
Ok(_) => Ok(()),
|
|
||||||
Err(err) => Err(err),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
_ => match self.push_value(base, ftype, holder) {
|
match self.push_value(base, ftype, holder) {
|
||||||
Ok(_) => Ok(()),
|
Ok(_) => Ok(()),
|
||||||
Err(err) => Err(err),
|
Err(err) => Err(err),
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
|
_ => match self.push_value(base, ftype, holder) {
|
||||||
|
Ok(_) => Ok(()),
|
||||||
|
Err(err) => Err(err),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn calculate(&self) -> Field {
|
fn calculate(&self, existing: Field) -> Field {
|
||||||
match self.operation {
|
match self.operation {
|
||||||
Operand::Add => {
|
Operand::Add => {
|
||||||
let values = self.get_fields();
|
let values = self.get_fields(existing);
|
||||||
match values[0].get_type() {
|
match values[0].get_type() {
|
||||||
FieldType::DateTime => {
|
FieldType::DateTime => {
|
||||||
let mut output = Utc::now();
|
let mut output = Utc::now();
|
||||||
@ -2736,8 +2744,10 @@ impl Calculation {
|
|||||||
_ => unreachable!("{:?} does not handle addition", values[0].get_type()),
|
_ => unreachable!("{:?} does not handle addition", values[0].get_type()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Operand::Assign => self.values[0].get(),
|
Operand::Assign => self.values[0].get(Field::None),
|
||||||
Operand::Equal => { self.values[0].get() == self.values[1].get() }.into(),
|
Operand::Equal => {
|
||||||
|
{ self.values[0].get(Field::None) == self.values[1].get(Field::None) }.into()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2782,7 +2792,7 @@ mod calculations {
|
|||||||
let mut calc = Calculation::new(Operand::Assign);
|
let mut calc = Calculation::new(Operand::Assign);
|
||||||
let data: Field = Uuid::new_v4().into();
|
let data: Field = Uuid::new_v4().into();
|
||||||
calc.add_value(data.clone());
|
calc.add_value(data.clone());
|
||||||
let result = calc.calculate();
|
let result = calc.calculate(Field::None);
|
||||||
assert_eq!(result, data);
|
assert_eq!(result, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2790,8 +2800,8 @@ mod calculations {
|
|||||||
fn can_assign_default_function() {
|
fn can_assign_default_function() {
|
||||||
let mut calc = Calculation::new(Operand::Assign);
|
let mut calc = Calculation::new(Operand::Assign);
|
||||||
calc.add_value(FieldType::Uuid);
|
calc.add_value(FieldType::Uuid);
|
||||||
let result1 = calc.calculate();
|
let result1 = calc.calculate(Field::None);
|
||||||
let result2 = calc.calculate();
|
let result2 = calc.calculate(Field::None);
|
||||||
assert_ne!(result1, result2);
|
assert_ne!(result1, result2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2802,7 +2812,7 @@ mod calculations {
|
|||||||
calc.add_value(data.clone());
|
calc.add_value(data.clone());
|
||||||
calc.add_value(data.clone());
|
calc.add_value(data.clone());
|
||||||
let expected: Field = true.into();
|
let expected: Field = true.into();
|
||||||
let result = calc.calculate();
|
let result = calc.calculate(Field::None);
|
||||||
assert_eq!(result, expected);
|
assert_eq!(result, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2814,7 +2824,7 @@ mod calculations {
|
|||||||
calc.add_value(value1);
|
calc.add_value(value1);
|
||||||
calc.add_value(value2);
|
calc.add_value(value2);
|
||||||
let expected: Field = false.into();
|
let expected: Field = false.into();
|
||||||
let result = calc.calculate();
|
let result = calc.calculate(Field::None);
|
||||||
assert_eq!(result, expected);
|
assert_eq!(result, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2826,10 +2836,32 @@ mod calculations {
|
|||||||
let expected: Field = { value1 + value2 }.into();
|
let expected: Field = { value1 + value2 }.into();
|
||||||
let value1: Field = value1.into();
|
let value1: Field = value1.into();
|
||||||
let value2: Field = value2.into();
|
let value2: Field = value2.into();
|
||||||
calc.add_value(value1);
|
calc.add_value(value1.clone());
|
||||||
calc.add_value(value2);
|
calc.add_value(value2.clone());
|
||||||
let result = calc.calculate();
|
let result = calc.calculate(Field::None);
|
||||||
assert_eq!(result, expected);
|
assert_eq!(
|
||||||
|
result, expected,
|
||||||
|
"{:?} plus {:?} should equal {:?}",
|
||||||
|
value1, value2, expected
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn can_use_existing_values() {
|
||||||
|
let mut calc = Calculation::new(Operand::Add);
|
||||||
|
let value1: i128 = random::<u8>().into();
|
||||||
|
let value2: i128 = random::<u8>().into();
|
||||||
|
let expected: Field = { value1 + value2 }.into();
|
||||||
|
let value1: Field = value1.into();
|
||||||
|
let value2: Field = value2.into();
|
||||||
|
calc.add_value(value1.clone());
|
||||||
|
calc.add_value(CalcValue::Existing(FieldType::Integer));
|
||||||
|
let result = calc.calculate(value2.clone());
|
||||||
|
assert_eq!(
|
||||||
|
result, expected,
|
||||||
|
"{:?} plus {:?} should equal {:?}",
|
||||||
|
value1, value2, expected
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -2858,7 +2890,7 @@ mod calculations {
|
|||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
Err(err) => unreachable!("got {:?}, should have returned normally", err),
|
Err(err) => unreachable!("got {:?}, should have returned normally", err),
|
||||||
}
|
}
|
||||||
let result = calc.calculate();
|
let result = calc.calculate(Field::None);
|
||||||
let stop = Utc::now() + duration;
|
let stop = Utc::now() + duration;
|
||||||
match result {
|
match result {
|
||||||
Field::DateTime(data) => {
|
Field::DateTime(data) => {
|
||||||
@ -2964,7 +2996,7 @@ mod queries {
|
|||||||
let expected: Field = true.into();
|
let expected: Field = true.into();
|
||||||
let mut holder = op.clone();
|
let mut holder = op.clone();
|
||||||
holder.add_value(data);
|
holder.add_value(data);
|
||||||
assert_eq!(holder.calculate(), expected);
|
assert_eq!(holder.calculate(Field::None), expected);
|
||||||
}
|
}
|
||||||
None => unreachable!("should have returned a calculation"),
|
None => unreachable!("should have returned a calculation"),
|
||||||
}
|
}
|
||||||
@ -2973,7 +3005,7 @@ mod queries {
|
|||||||
let expected: Field = false.into();
|
let expected: Field = false.into();
|
||||||
let mut holder = op.clone();
|
let mut holder = op.clone();
|
||||||
holder.add_value(bad_data);
|
holder.add_value(bad_data);
|
||||||
assert_eq!(holder.calculate(), expected);
|
assert_eq!(holder.calculate(Field::None), expected);
|
||||||
}
|
}
|
||||||
None => unreachable!("should have returned a calculation"),
|
None => unreachable!("should have returned a calculation"),
|
||||||
}
|
}
|
||||||
@ -3392,7 +3424,7 @@ impl Document {
|
|||||||
NT: Into<NameType>,
|
NT: Into<NameType>,
|
||||||
{
|
{
|
||||||
match self.data.get(&name.into()) {
|
match self.data.get(&name.into()) {
|
||||||
Some(data) => Some(data.get()),
|
Some(data) => Some(data.get(Field::None)),
|
||||||
None => None,
|
None => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3400,7 +3432,7 @@ impl Document {
|
|||||||
fn get_all(&self) -> Vec<(NameType, Field)> {
|
fn get_all(&self) -> Vec<(NameType, Field)> {
|
||||||
let mut output = Vec::new();
|
let mut output = Vec::new();
|
||||||
for (key, value) in self.data.iter() {
|
for (key, value) in self.data.iter() {
|
||||||
output.push((key.clone(), value.get()));
|
output.push((key.clone(), value.get(Field::None)));
|
||||||
}
|
}
|
||||||
output
|
output
|
||||||
}
|
}
|
||||||
@ -3612,7 +3644,7 @@ impl Index {
|
|||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
Err(err) => return Err(err),
|
Err(err) => return Err(err),
|
||||||
}
|
}
|
||||||
if op.calculate() == true.into() {
|
if op.calculate(Field::None) == true.into() {
|
||||||
output = output.union(&value).cloned().collect();
|
output = output.union(&value).cloned().collect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4070,7 +4102,7 @@ impl DocumentFile {
|
|||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
Err(err) => return Err(err),
|
Err(err) => return Err(err),
|
||||||
}
|
}
|
||||||
if calc.calculate() == false.into() {
|
if calc.calculate(Field::None) == false.into() {
|
||||||
oids.remove(oid);
|
oids.remove(oid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user