From b257b960b3f3497e829aaa2c573afc9c4ed22b35 Mon Sep 17 00:00:00 2001 From: PSeitz Date: Tue, 16 Apr 2024 04:42:24 +0200 Subject: [PATCH] validate sort by field type (#2336) * validate sort by field type * Update src/index/index.rs Co-authored-by: Adam Reichold --------- Co-authored-by: Adam Reichold --- src/index/index.rs | 11 ++++++++++- src/indexer/doc_id_mapping.rs | 26 +++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/index/index.rs b/src/index/index.rs index 8d1281c178..e02212cd5b 100644 --- a/src/index/index.rs +++ b/src/index/index.rs @@ -20,7 +20,7 @@ use crate::indexer::segment_updater::save_metas; use crate::indexer::{IndexWriter, SingleSegmentIndexWriter}; use crate::reader::{IndexReader, IndexReaderBuilder}; use crate::schema::document::Document; -use crate::schema::{Field, FieldType, Schema}; +use crate::schema::{Field, FieldType, Schema, Type}; use crate::tokenizer::{TextAnalyzer, TokenizerManager}; use crate::SegmentReader; @@ -248,6 +248,15 @@ impl IndexBuilder { sort_by_field.field ))); } + let supported_field_types = [Type::I64, Type::U64, Type::F64, Type::Date]; + let field_type = entry.field_type().value_type(); + if !supported_field_types.contains(&field_type) { + return Err(TantivyError::InvalidArgument(format!( + "Unsupported field type in sort_by_field: {:?}. Supported field types: \ + {:?} ", + field_type, supported_field_types, + ))); + } } Ok(()) } else { diff --git a/src/indexer/doc_id_mapping.rs b/src/indexer/doc_id_mapping.rs index b25e81f24b..63460eda30 100644 --- a/src/indexer/doc_id_mapping.rs +++ b/src/indexer/doc_id_mapping.rs @@ -159,7 +159,7 @@ mod tests_indexsorting { use crate::indexer::NoMergePolicy; use crate::query::QueryParser; use crate::schema::*; - use crate::{DocAddress, Index, IndexSettings, IndexSortByField, Order}; + use crate::{DocAddress, Index, IndexBuilder, IndexSettings, IndexSortByField, Order}; fn create_test_index( index_settings: Option, @@ -557,4 +557,28 @@ mod tests_indexsorting { &[2000, 8000, 3000] ); } + + #[test] + fn test_text_sort() -> crate::Result<()> { + let mut schema_builder = SchemaBuilder::new(); + schema_builder.add_text_field("id", STRING | FAST | STORED); + schema_builder.add_text_field("name", TEXT | STORED); + + let resp = IndexBuilder::new() + .schema(schema_builder.build()) + .settings(IndexSettings { + sort_by_field: Some(IndexSortByField { + field: "id".to_string(), + order: Order::Asc, + }), + ..Default::default() + }) + .create_in_ram(); + assert!(resp + .unwrap_err() + .to_string() + .contains("Unsupported field type")); + + Ok(()) + } }