From d06450715fb2ccb656118596d41d73662f765e29 Mon Sep 17 00:00:00 2001 From: Zhenchi Date: Fri, 4 Jul 2025 19:58:27 +0800 Subject: [PATCH] fix: add backward compatibility for `SkippingIndexOptions` deserialization (#6458) * fix: add backward compatibility for `SkippingIndexOptions` deserialization Signed-off-by: Zhenchi * address comments Signed-off-by: Zhenchi * address comments Signed-off-by: Zhenchi --------- Signed-off-by: Zhenchi Signed-off-by: evenyag --- src/datatypes/src/schema/column_schema.rs | 60 ++++++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/src/datatypes/src/schema/column_schema.rs b/src/datatypes/src/schema/column_schema.rs index cd6a05a83f..fb539cad58 100644 --- a/src/datatypes/src/schema/column_schema.rs +++ b/src/datatypes/src/schema/column_schema.rs @@ -527,7 +527,7 @@ pub struct FulltextOptions { #[serde(default = "fulltext_options_default_granularity")] pub granularity: u32, /// The false positive rate of the fulltext index (for bloom backend only) - #[serde(default = "fulltext_options_default_false_positive_rate_in_10000")] + #[serde(default = "index_options_default_false_positive_rate_in_10000")] pub false_positive_rate_in_10000: u32, } @@ -535,7 +535,7 @@ fn fulltext_options_default_granularity() -> u32 { DEFAULT_GRANULARITY } -fn fulltext_options_default_false_positive_rate_in_10000() -> u32 { +fn index_options_default_false_positive_rate_in_10000() -> u32 { (DEFAULT_FALSE_POSITIVE_RATE * 10000.0) as u32 } @@ -773,6 +773,7 @@ pub struct SkippingIndexOptions { /// The granularity of the skip index. pub granularity: u32, /// The false positive rate of the skip index (in ten-thousandths, e.g., 100 = 1%). + #[serde(default = "index_options_default_false_positive_rate_in_10000")] pub false_positive_rate_in_10000: u32, /// The type of the skip index. #[serde(default)] @@ -1179,4 +1180,59 @@ mod tests { assert!(column_schema.default_constraint.is_none()); assert!(column_schema.metadata.is_empty()); } + + #[test] + fn test_skipping_index_options_deserialization() { + let original_options = "{\"granularity\":1024,\"false-positive-rate-in-10000\":10,\"index-type\":\"BloomFilter\"}"; + let options = serde_json::from_str::(original_options).unwrap(); + assert_eq!(1024, options.granularity); + assert_eq!(SkippingIndexType::BloomFilter, options.index_type); + assert_eq!(0.001, options.false_positive_rate()); + + let options_str = serde_json::to_string(&options).unwrap(); + assert_eq!(options_str, original_options); + } + + #[test] + fn test_skipping_index_options_deserialization_v0_14_to_v0_15() { + let options = "{\"granularity\":10240,\"index-type\":\"BloomFilter\"}"; + let options = serde_json::from_str::(options).unwrap(); + assert_eq!(10240, options.granularity); + assert_eq!(SkippingIndexType::BloomFilter, options.index_type); + assert_eq!(DEFAULT_FALSE_POSITIVE_RATE, options.false_positive_rate()); + + let options_str = serde_json::to_string(&options).unwrap(); + assert_eq!(options_str, "{\"granularity\":10240,\"false-positive-rate-in-10000\":100,\"index-type\":\"BloomFilter\"}"); + } + + #[test] + fn test_fulltext_options_deserialization() { + let original_options = "{\"enable\":true,\"analyzer\":\"English\",\"case-sensitive\":false,\"backend\":\"bloom\",\"granularity\":1024,\"false-positive-rate-in-10000\":10}"; + let options = serde_json::from_str::(original_options).unwrap(); + assert!(!options.case_sensitive); + assert!(options.enable); + assert_eq!(FulltextBackend::Bloom, options.backend); + assert_eq!(FulltextAnalyzer::default(), options.analyzer); + assert_eq!(1024, options.granularity); + assert_eq!(0.001, options.false_positive_rate()); + + let options_str = serde_json::to_string(&options).unwrap(); + assert_eq!(options_str, original_options); + } + + #[test] + fn test_fulltext_options_deserialization_v0_14_to_v0_15() { + // 0.14 to 0.15 + let options = "{\"enable\":true,\"analyzer\":\"English\",\"case-sensitive\":false,\"backend\":\"bloom\"}"; + let options = serde_json::from_str::(options).unwrap(); + assert!(!options.case_sensitive); + assert!(options.enable); + assert_eq!(FulltextBackend::Bloom, options.backend); + assert_eq!(FulltextAnalyzer::default(), options.analyzer); + assert_eq!(DEFAULT_GRANULARITY, options.granularity); + assert_eq!(DEFAULT_FALSE_POSITIVE_RATE, options.false_positive_rate()); + + let options_str = serde_json::to_string(&options).unwrap(); + assert_eq!(options_str, "{\"enable\":true,\"analyzer\":\"English\",\"case-sensitive\":false,\"backend\":\"bloom\",\"granularity\":10240,\"false-positive-rate-in-10000\":100}"); + } }