@@ -1688,7 +1688,8 @@ mod tests {
1688
1688
1689
1689
let old_reader = index. reader ( ) ?;
1690
1690
1691
- let id_exists = |id| id % 3 != 0 ; // 0 does not exist
1691
+ // Every 3rd doc has only id field
1692
+ let id_is_full_doc = |id| id % 3 != 0 ;
1692
1693
1693
1694
let multi_text_field_text1 = "test1 test2 test3 test1 test2 test3" ;
1694
1695
// rotate left
@@ -1704,7 +1705,7 @@ mod tests {
1704
1705
let facet = Facet :: from ( & ( "/cola/" . to_string ( ) + & id. to_string ( ) ) ) ;
1705
1706
let ip = ip_from_id ( id) ;
1706
1707
1707
- if !id_exists ( id) {
1708
+ if !id_is_full_doc ( id) {
1708
1709
// every 3rd doc has no ip field
1709
1710
index_writer. add_document ( doc ! (
1710
1711
id_field=>id,
@@ -1824,7 +1825,7 @@ mod tests {
1824
1825
1825
1826
let num_docs_with_values = expected_ids_and_num_occurrences
1826
1827
. iter ( )
1827
- . filter ( |( id, _id_occurrences) | id_exists ( * * id) )
1828
+ . filter ( |( id, _id_occurrences) | id_is_full_doc ( * * id) )
1828
1829
. map ( |( _, id_occurrences) | * id_occurrences as usize )
1829
1830
. sum :: < usize > ( ) ;
1830
1831
@@ -1848,7 +1849,7 @@ mod tests {
1848
1849
if force_end_merge && num_segments_before_merge > 1 && num_segments_after_merge == 1 {
1849
1850
let mut expected_multi_ips: Vec < _ > = id_list
1850
1851
. iter ( )
1851
- . filter ( |id| id_exists ( * * id) )
1852
+ . filter ( |id| id_is_full_doc ( * * id) )
1852
1853
. flat_map ( |id| vec ! [ ip_from_id( * id) , ip_from_id( * id) ] )
1853
1854
. collect ( ) ;
1854
1855
assert_eq ! ( num_ips, expected_multi_ips. len( ) as u32 ) ;
@@ -1886,7 +1887,7 @@ mod tests {
1886
1887
let expected_ips = expected_ids_and_num_occurrences
1887
1888
. keys ( )
1888
1889
. flat_map ( |id| {
1889
- if !id_exists ( * id) {
1890
+ if !id_is_full_doc ( * id) {
1890
1891
None
1891
1892
} else {
1892
1893
Some ( Ipv6Addr :: from_u128 ( * id as u128 ) )
@@ -1898,7 +1899,7 @@ mod tests {
1898
1899
let expected_ips = expected_ids_and_num_occurrences
1899
1900
. keys ( )
1900
1901
. filter_map ( |id| {
1901
- if !id_exists ( * id) {
1902
+ if !id_is_full_doc ( * id) {
1902
1903
None
1903
1904
} else {
1904
1905
Some ( Ipv6Addr :: from_u128 ( * id as u128 ) )
@@ -1933,7 +1934,7 @@ mod tests {
1933
1934
let id = id_reader. first ( doc) . unwrap ( ) ;
1934
1935
1935
1936
let vals: Vec < u64 > = ff_reader. values_for_doc ( doc) . collect ( ) ;
1936
- if id_exists ( id) {
1937
+ if id_is_full_doc ( id) {
1937
1938
assert_eq ! ( vals. len( ) , 2 ) ;
1938
1939
assert_eq ! ( vals[ 0 ] , vals[ 1 ] ) ;
1939
1940
assert ! ( expected_ids_and_num_occurrences. contains_key( & vals[ 0 ] ) ) ;
@@ -1943,7 +1944,7 @@ mod tests {
1943
1944
}
1944
1945
1945
1946
let bool_vals: Vec < bool > = bool_ff_reader. values_for_doc ( doc) . collect ( ) ;
1946
- if id_exists ( id) {
1947
+ if id_is_full_doc ( id) {
1947
1948
assert_eq ! ( bool_vals. len( ) , 2 ) ;
1948
1949
assert_ne ! ( bool_vals[ 0 ] , bool_vals[ 1 ] ) ;
1949
1950
} else {
@@ -1972,7 +1973,7 @@ mod tests {
1972
1973
. as_u64 ( )
1973
1974
. unwrap ( ) ;
1974
1975
assert ! ( expected_ids_and_num_occurrences. contains_key( & id) ) ;
1975
- if id_exists ( id) {
1976
+ if id_is_full_doc ( id) {
1976
1977
let id2 = store_reader
1977
1978
. get ( doc_id)
1978
1979
. unwrap ( )
@@ -2019,7 +2020,7 @@ mod tests {
2019
2020
let ( existing_id, count) = ( * id, * count) ;
2020
2021
let get_num_hits = |field| do_search ( & existing_id. to_string ( ) , field) . len ( ) as u64 ;
2021
2022
assert_eq ! ( get_num_hits( id_field) , count) ;
2022
- if !id_exists ( existing_id) {
2023
+ if !id_is_full_doc ( existing_id) {
2023
2024
continue ;
2024
2025
}
2025
2026
assert_eq ! ( get_num_hits( text_field) , count) ;
@@ -2069,7 +2070,7 @@ mod tests {
2069
2070
//
2070
2071
for ( existing_id, count) in & expected_ids_and_num_occurrences {
2071
2072
let ( existing_id, count) = ( * existing_id, * count) ;
2072
- if !id_exists ( existing_id) {
2073
+ if !id_is_full_doc ( existing_id) {
2073
2074
continue ;
2074
2075
}
2075
2076
let do_search_ip_field = |term : & str | do_search ( term, ip_field) . len ( ) as u64 ;
@@ -2086,34 +2087,84 @@ mod tests {
2086
2087
}
2087
2088
}
2088
2089
2089
- // assert data is like expected
2090
+ // Range query
2090
2091
//
2091
- for ( existing_id, count) in expected_ids_and_num_occurrences. iter ( ) . take ( 10 ) {
2092
- let ( existing_id, count) = ( * existing_id, * count) ;
2093
- if !id_exists ( existing_id) {
2094
- continue ;
2095
- }
2096
- let gen_query_inclusive = |field : & str , from : Ipv6Addr , to : Ipv6Addr | {
2097
- format ! ( "{}:[{} TO {}]" , field, & from. to_string( ) , & to. to_string( ) )
2092
+ // Take half as sample
2093
+ let mut sample: Vec < _ > = expected_ids_and_num_occurrences. iter ( ) . collect ( ) ;
2094
+ sample. sort_by_key ( |( k, _num_occurences) | * k) ;
2095
+ // sample.truncate(sample.len() / 2);
2096
+ if !sample. is_empty ( ) {
2097
+ let ( left_sample, right_sample) = sample. split_at ( sample. len ( ) / 2 ) ;
2098
+
2099
+ let expected_count = |sample : & [ ( & u64 , & u64 ) ] | {
2100
+ sample
2101
+ . iter ( )
2102
+ . filter ( |( id, _) | id_is_full_doc ( * * id) )
2103
+ . map ( |( _id, num_occurences) | * * num_occurences)
2104
+ . sum :: < u64 > ( )
2098
2105
} ;
2099
- let ip = ip_from_id ( existing_id) ;
2100
-
2101
- let do_search_ip_field = |term : & str | do_search ( term, ip_field) . len ( ) as u64 ;
2102
- // Range query on single value field
2103
- let query = gen_query_inclusive ( "ip" , ip, ip) ;
2104
- assert_eq ! ( do_search_ip_field( & query) , count) ;
2105
-
2106
- // Range query on multi value field
2107
- let query = gen_query_inclusive ( "ips" , ip, ip) ;
2106
+ fn gen_query_inclusive < T1 : ToString , T2 : ToString > (
2107
+ field : & str ,
2108
+ from : T1 ,
2109
+ to : T2 ,
2110
+ ) -> String {
2111
+ format ! ( "{}:[{} TO {}]" , field, & from. to_string( ) , & to. to_string( ) )
2112
+ }
2108
2113
2109
- assert_eq ! ( do_search_ip_field( & query) , count) ;
2114
+ // Query first half
2115
+ if !left_sample. is_empty ( ) {
2116
+ let expected_count = expected_count ( left_sample) ;
2117
+
2118
+ let start_range = * left_sample[ 0 ] . 0 ;
2119
+ let end_range = * left_sample. last ( ) . unwrap ( ) . 0 ;
2120
+ let query = gen_query_inclusive ( "id_opt" , start_range, end_range) ;
2121
+ assert_eq ! ( do_search( & query, id_opt_field) . len( ) as u64 , expected_count) ;
2122
+
2123
+ // Range query on ip field
2124
+ let ip1 = ip_from_id ( start_range) ;
2125
+ let ip2 = ip_from_id ( end_range) ;
2126
+ let do_search_ip_field = |term : & str | do_search ( term, ip_field) . len ( ) as u64 ;
2127
+ let query = gen_query_inclusive ( "ip" , ip1, ip2) ;
2128
+ assert_eq ! ( do_search_ip_field( & query) , expected_count) ;
2129
+ let query = gen_query_inclusive ( "ip" , "*" , ip2) ;
2130
+ assert_eq ! ( do_search_ip_field( & query) , expected_count) ;
2131
+ // Range query on multi value field
2132
+ let query = gen_query_inclusive ( "ips" , ip1, ip2) ;
2133
+ assert_eq ! ( do_search_ip_field( & query) , expected_count) ;
2134
+ let query = gen_query_inclusive ( "ips" , "*" , ip2) ;
2135
+ assert_eq ! ( do_search_ip_field( & query) , expected_count) ;
2136
+ }
2137
+ // Query second half
2138
+ if !right_sample. is_empty ( ) {
2139
+ let expected_count = expected_count ( right_sample) ;
2140
+ let start_range = * right_sample[ 0 ] . 0 ;
2141
+ let end_range = * right_sample. last ( ) . unwrap ( ) . 0 ;
2142
+ // Range query on id opt field
2143
+ let query =
2144
+ gen_query_inclusive ( "id_opt" , start_range. to_string ( ) , end_range. to_string ( ) ) ;
2145
+ assert_eq ! ( do_search( & query, id_opt_field) . len( ) as u64 , expected_count) ;
2146
+
2147
+ // Range query on ip field
2148
+ let ip1 = ip_from_id ( start_range) ;
2149
+ let ip2 = ip_from_id ( end_range) ;
2150
+ let do_search_ip_field = |term : & str | do_search ( term, ip_field) . len ( ) as u64 ;
2151
+ let query = gen_query_inclusive ( "ip" , ip1, ip2) ;
2152
+ assert_eq ! ( do_search_ip_field( & query) , expected_count) ;
2153
+ let query = gen_query_inclusive ( "ip" , ip1, "*" ) ;
2154
+ assert_eq ! ( do_search_ip_field( & query) , expected_count) ;
2155
+ // Range query on multi value field
2156
+ let query = gen_query_inclusive ( "ips" , ip1, ip2) ;
2157
+ assert_eq ! ( do_search_ip_field( & query) , expected_count) ;
2158
+ let query = gen_query_inclusive ( "ips" , ip1, "*" ) ;
2159
+ assert_eq ! ( do_search_ip_field( & query) , expected_count) ;
2160
+ }
2110
2161
}
2111
2162
2112
2163
// ip range query on fast field
2113
2164
//
2114
2165
for ( existing_id, count) in expected_ids_and_num_occurrences. iter ( ) . take ( 10 ) {
2115
2166
let ( existing_id, count) = ( * existing_id, * count) ;
2116
- if !id_exists ( existing_id) {
2167
+ if !id_is_full_doc ( existing_id) {
2117
2168
continue ;
2118
2169
}
2119
2170
let gen_query_inclusive = |field : & str , from : Ipv6Addr , to : Ipv6Addr | {
@@ -2141,7 +2192,7 @@ mod tests {
2141
2192
. first_or_default_col ( 9999 ) ;
2142
2193
for doc_id in segment_reader. doc_ids_alive ( ) {
2143
2194
let id = ff_reader. get_val ( doc_id) ;
2144
- if !id_exists ( id) {
2195
+ if !id_is_full_doc ( id) {
2145
2196
continue ;
2146
2197
}
2147
2198
let facet_ords: Vec < u64 > = facet_reader. facet_ords ( doc_id) . collect ( ) ;
@@ -2179,6 +2230,12 @@ mod tests {
2179
2230
Ok ( index)
2180
2231
}
2181
2232
2233
+ #[ test]
2234
+ fn test_fast_field_range ( ) {
2235
+ let ops: Vec < _ > = ( 0 ..1000 ) . map ( |id| IndexingOp :: AddDoc { id } ) . collect ( ) ;
2236
+ assert ! ( test_operation_strategy( & ops, false , true ) . is_ok( ) ) ;
2237
+ }
2238
+
2182
2239
#[ test]
2183
2240
fn test_sort_index_on_opt_field_regression ( ) {
2184
2241
assert ! ( test_operation_strategy(
0 commit comments