Skip to content

Commit

Permalink
Rename strategy to indicate it is for array, handle infinity properly
Browse files Browse the repository at this point in the history
Signed-off-by: dbcfd <bdbrowning2@gmail.com>
  • Loading branch information
dbcfd committed Aug 18, 2021
1 parent c3e6312 commit 6a57a5c
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 28 deletions.
10 changes: 6 additions & 4 deletions lib/vector-core/src/event/value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,15 @@ impl Hash for Value {
Value::Float(v) => {
// This hashes floats with the following rules:
// * NaNs hash as equal (covered by above discriminant hash)
// * Positive and negative infinity has to different values
// * -0 and +0 hash to different values
// * otherwise transmute to u64 and hash
if v.is_finite() {
v.is_sign_negative().hash(state);
let trunc: u64 = unsafe { std::mem::transmute(v.trunc()) };
if trunc == 0 {
v.is_sign_negative().hash(state);
}
trunc.hash(state);
} else if !v.is_nan() {
v.is_sign_negative().hash(state);
} //else covered by discriminant hash
}
Value::Integer(v) => {
Expand Down Expand Up @@ -1339,8 +1340,9 @@ mod test {
assert_ne!(hash(Value::Integer(0)), hash(Value::Integer(1)));
assert_ne!(hash(Value::Boolean(true)), hash(Value::Integer(2)));
assert_eq!(hash(Value::Float(1.2)), hash(Value::Float(1.4)));
assert_ne!(hash(Value::Float(1.2)), hash(Value::Float(-1.2)));
assert_ne!(hash(Value::Float(-0.0)), hash(Value::Float(0.0)));
assert_eq!(hash(Value::Float(f64::NEG_INFINITY)), hash(Value::Float(f64::INFINITY)));
assert_ne!(hash(Value::Float(f64::NEG_INFINITY)), hash(Value::Float(f64::INFINITY)));
assert_eq!(hash(Value::Array(vec![Value::Integer(0), Value::Boolean(true)])), hash(Value::Array(vec![Value::Integer(0), Value::Boolean(true)])));
assert_ne!(hash(Value::Array(vec![Value::Integer(0), Value::Boolean(true)])), hash(Value::Array(vec![Value::Integer(1), Value::Boolean(true)])));
}
Expand Down
44 changes: 22 additions & 22 deletions src/transforms/reduce/merge_strategy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ pub enum MergeStrategy {
Array,
Concat,
ConcatNewline,
Shortest,
Longest,
ShortestArray,
LongestArray,
FlatUnique,
}

Expand Down Expand Up @@ -562,14 +562,14 @@ pub fn get_value_merger(v: Value, m: &MergeStrategy) -> Result<Box<dyn ReduceVal
)),
},
MergeStrategy::Array => Ok(Box::new(ArrayMerger::new(v))),
MergeStrategy::Shortest => match v {
MergeStrategy::ShortestArray => match v {
Value::Array(a) => Ok(Box::new(ShortestArrayMerger::new(a))),
_ => Err(format!(
"expected array value, found: '{}'",
v.to_string_lossy()
)),
},
MergeStrategy::Longest => match v {
MergeStrategy::LongestArray => match v {
Value::Array(a) => Ok(Box::new(LongestArrayMerger::new(a))),
_ => Err(format!(
"expected array value, found: '{}'",
Expand All @@ -596,8 +596,8 @@ mod test {
assert!(get_value_merger("foo".into(), &MergeStrategy::Max).is_err());
assert!(get_value_merger("foo".into(), &MergeStrategy::Min).is_err());
assert!(get_value_merger("foo".into(), &MergeStrategy::Array).is_ok());
assert!(get_value_merger("foo".into(), &MergeStrategy::Longest).is_err());
assert!(get_value_merger("foo".into(), &MergeStrategy::Shortest).is_err());
assert!(get_value_merger("foo".into(), &MergeStrategy::LongestArray).is_err());
assert!(get_value_merger("foo".into(), &MergeStrategy::ShortestArray).is_err());
assert!(get_value_merger("foo".into(), &MergeStrategy::Concat).is_ok());
assert!(get_value_merger("foo".into(), &MergeStrategy::FlatUnique).is_ok());

Expand All @@ -607,8 +607,8 @@ mod test {
assert!(get_value_merger(42.into(), &MergeStrategy::Min).is_ok());
assert!(get_value_merger(42.into(), &MergeStrategy::Max).is_ok());
assert!(get_value_merger(42.into(), &MergeStrategy::Array).is_ok());
assert!(get_value_merger(42.into(), &MergeStrategy::Longest).is_err());
assert!(get_value_merger(42.into(), &MergeStrategy::Shortest).is_err());
assert!(get_value_merger(42.into(), &MergeStrategy::LongestArray).is_err());
assert!(get_value_merger(42.into(), &MergeStrategy::ShortestArray).is_err());
assert!(get_value_merger(42.into(), &MergeStrategy::Concat).is_err());
assert!(get_value_merger(42.into(), &MergeStrategy::ConcatNewline).is_err());
assert!(get_value_merger(42.into(), &MergeStrategy::FlatUnique).is_ok());
Expand All @@ -619,8 +619,8 @@ mod test {
assert!(get_value_merger(4.2.into(), &MergeStrategy::Min).is_ok());
assert!(get_value_merger(4.2.into(), &MergeStrategy::Max).is_ok());
assert!(get_value_merger(4.2.into(), &MergeStrategy::Array).is_ok());
assert!(get_value_merger(4.2.into(), &MergeStrategy::Longest).is_err());
assert!(get_value_merger(4.2.into(), &MergeStrategy::Shortest).is_err());
assert!(get_value_merger(4.2.into(), &MergeStrategy::LongestArray).is_err());
assert!(get_value_merger(4.2.into(), &MergeStrategy::ShortestArray).is_err());
assert!(get_value_merger(4.2.into(), &MergeStrategy::Concat).is_err());
assert!(get_value_merger(4.2.into(), &MergeStrategy::ConcatNewline).is_err());
assert!(get_value_merger(4.2.into(), &MergeStrategy::FlatUnique).is_ok());
Expand All @@ -631,8 +631,8 @@ mod test {
assert!(get_value_merger(true.into(), &MergeStrategy::Max).is_err());
assert!(get_value_merger(true.into(), &MergeStrategy::Min).is_err());
assert!(get_value_merger(true.into(), &MergeStrategy::Array).is_ok());
assert!(get_value_merger(true.into(), &MergeStrategy::Longest).is_err());
assert!(get_value_merger(true.into(), &MergeStrategy::Shortest).is_err());
assert!(get_value_merger(true.into(), &MergeStrategy::LongestArray).is_err());
assert!(get_value_merger(true.into(), &MergeStrategy::ShortestArray).is_err());
assert!(get_value_merger(true.into(), &MergeStrategy::Concat).is_err());
assert!(get_value_merger(true.into(), &MergeStrategy::ConcatNewline).is_err());
assert!(get_value_merger(true.into(), &MergeStrategy::FlatUnique).is_ok());
Expand All @@ -643,8 +643,8 @@ mod test {
assert!(get_value_merger(Utc::now().into(), &MergeStrategy::Max).is_err());
assert!(get_value_merger(Utc::now().into(), &MergeStrategy::Min).is_err());
assert!(get_value_merger(Utc::now().into(), &MergeStrategy::Array).is_ok());
assert!(get_value_merger(Utc::now().into(), &MergeStrategy::Longest).is_err());
assert!(get_value_merger(Utc::now().into(), &MergeStrategy::Shortest).is_err());
assert!(get_value_merger(Utc::now().into(), &MergeStrategy::LongestArray).is_err());
assert!(get_value_merger(Utc::now().into(), &MergeStrategy::ShortestArray).is_err());
assert!(get_value_merger(Utc::now().into(), &MergeStrategy::Concat).is_err());
assert!(get_value_merger(Utc::now().into(), &MergeStrategy::ConcatNewline).is_err());
assert!(get_value_merger(Utc::now().into(), &MergeStrategy::Discard).is_ok());
Expand All @@ -656,8 +656,8 @@ mod test {
assert!(get_value_merger(json!([]).into(), &MergeStrategy::Max).is_err());
assert!(get_value_merger(json!([]).into(), &MergeStrategy::Min).is_err());
assert!(get_value_merger(json!([]).into(), &MergeStrategy::Array).is_ok());
assert!(get_value_merger(json!([]).into(), &MergeStrategy::Longest).is_ok());
assert!(get_value_merger(json!([]).into(), &MergeStrategy::Shortest).is_ok());
assert!(get_value_merger(json!([]).into(), &MergeStrategy::LongestArray).is_ok());
assert!(get_value_merger(json!([]).into(), &MergeStrategy::ShortestArray).is_ok());
assert!(get_value_merger(json!([]).into(), &MergeStrategy::Concat).is_ok());
assert!(get_value_merger(json!([]).into(), &MergeStrategy::ConcatNewline).is_err());
assert!(get_value_merger(json!([]).into(), &MergeStrategy::FlatUnique).is_ok());
Expand All @@ -668,8 +668,8 @@ mod test {
assert!(get_value_merger(json!({}).into(), &MergeStrategy::Max).is_err());
assert!(get_value_merger(json!({}).into(), &MergeStrategy::Min).is_err());
assert!(get_value_merger(json!({}).into(), &MergeStrategy::Array).is_ok());
assert!(get_value_merger(json!({}).into(), &MergeStrategy::Longest).is_err());
assert!(get_value_merger(json!({}).into(), &MergeStrategy::Shortest).is_err());
assert!(get_value_merger(json!({}).into(), &MergeStrategy::LongestArray).is_err());
assert!(get_value_merger(json!({}).into(), &MergeStrategy::ShortestArray).is_err());
assert!(get_value_merger(json!({}).into(), &MergeStrategy::Concat).is_err());
assert!(get_value_merger(json!({}).into(), &MergeStrategy::ConcatNewline).is_err());
assert!(get_value_merger(json!({}).into(), &MergeStrategy::FlatUnique).is_ok());
Expand All @@ -680,8 +680,8 @@ mod test {
assert!(get_value_merger(json!(null).into(), &MergeStrategy::Max).is_err());
assert!(get_value_merger(json!(null).into(), &MergeStrategy::Min).is_err());
assert!(get_value_merger(json!(null).into(), &MergeStrategy::Array).is_ok());
assert!(get_value_merger(json!(null).into(), &MergeStrategy::Longest).is_err());
assert!(get_value_merger(json!(null).into(), &MergeStrategy::Shortest).is_err());
assert!(get_value_merger(json!(null).into(), &MergeStrategy::LongestArray).is_err());
assert!(get_value_merger(json!(null).into(), &MergeStrategy::ShortestArray).is_err());
assert!(get_value_merger(json!(null).into(), &MergeStrategy::Concat).is_err());
assert!(get_value_merger(json!(null).into(), &MergeStrategy::ConcatNewline).is_err());
assert!(get_value_merger(json!(null).into(), &MergeStrategy::FlatUnique).is_ok());
Expand Down Expand Up @@ -773,15 +773,15 @@ mod test {
merge(
json!([34]).into(),
json!([42, 43]).into(),
&MergeStrategy::Shortest
&MergeStrategy::ShortestArray
),
Ok(json!([34]).into())
);
assert_eq!(
merge(
json!([34]).into(),
json!([42, 43]).into(),
&MergeStrategy::Longest
&MergeStrategy::LongestArray
),
Ok(json!([42, 43]).into())
);
Expand Down
4 changes: 2 additions & 2 deletions website/cue/reference/components/transforms/reduce.cue
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,8 @@ components: transforms: reduce: {
type: string: {
enum: {
array: "Each value is appended to an array."
longest: "Retains the longest array seen"
shortest: "Retains the shortest array seen"
longest_array: "Retains the longest array seen"
shortest_array: "Retains the shortest array seen"
concat: "Concatenate each string value (delimited with a space)."
concat_newline: "Concatenate each string value (delimited with a newline)."
discard: "Discard all but the first value found."
Expand Down

0 comments on commit 6a57a5c

Please sign in to comment.