caio.co/de/cantine

Split FilterQuery and AggregationQuery proc macros

Id
e2b3da103b40b173894a0c213a06fae538eabeea
Author
Caio
Commit time
2020-02-04T17:27:52+01:00

Modified cantine_derive/src/lib.rs

@@ -6,7 +6,7
DocId, Result, Score, SegmentLocalId, SegmentReader,
};

-pub use cantine_derive_internal::FilterAndAggregation;
+pub use cantine_derive_internal::{AggregationQuery, FilterQuery};

#[derive(Serialize, Debug, Clone)]
pub struct RangeStats<T> {

Modified cantine_derive/internal/src/lib.rs

@@ -8,19 +8,25
PathArguments, Type, Visibility,
};

-#[proc_macro_derive(FilterAndAggregation)]
+#[proc_macro_derive(FilterQuery)]
pub fn derive_filter_and_agg(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
-
let filter_query = make_filter_query(&input);
+
+ TokenStream::from(quote! {
+ #filter_query
+ })
+}
+
+#[proc_macro_derive(AggregationQuery)]
+pub fn derive_agg(input: TokenStream) -> TokenStream {
+ let input = parse_macro_input!(input as DeriveInput);

let agg_query = make_agg_query(&input);
let agg_result = make_agg_result(&input);
let collector = impl_collector_traits(&input);

TokenStream::from(quote! {
- #filter_query
-
#agg_query
#agg_result
#collector

Renamed cantine_derive/tests/basic.rs to cantine_derive/tests/aggregation_query.rs

@@ -1,37 +1,18
use std::{
collections::HashMap,
- convert::TryFrom,
- ops::Range,
sync::{Arc, Mutex},
};

-use tantivy::{
- query::AllQuery,
- schema::{SchemaBuilder, Value},
- Document, Index, SegmentReader,
-};
+use tantivy::{query::AllQuery, schema::SchemaBuilder, Document, Index, SegmentReader};

-use cantine_derive::{FeatureCollector, FilterAndAggregation, RangeStats};
+use cantine_derive::{AggregationQuery, FeatureCollector, RangeStats};

-#[derive(FilterAndAggregation, Default)]
+#[derive(AggregationQuery, Default)]
pub struct Feat {
pub a: u64,
pub b: Option<i16>,
pub c: f32,
pub d: Option<f64>,
-}
-
-#[test]
-#[allow(unused_variables)]
-fn reads_inner_type_of_option() {
- let filter_query = FeatFilterQuery::default();
- let filter_a: Option<Range<u64>> = filter_query.a;
- let filter_b: Option<Range<i16>> = filter_query.b;
- let filter_c: Option<Range<f32>> = filter_query.c;
-
- let agg_query = FeatAggregationQuery::default();
- let agg_a: Vec<Range<u64>> = agg_query.a;
- let agg_b: Vec<Range<i16>> = agg_query.b;
}

#[test]
@@ -117,74 +98,6
}

#[test]
-fn filter_fields_can_read_and_write_from_schema() {
- let mut builder = SchemaBuilder::new();
- let original = FeatFilterFields::from(&mut builder);
- let loaded = FeatFilterFields::try_from(&builder.build()).unwrap();
- assert_eq!(original, loaded);
-}
-
-#[test]
-fn filter_query_interpretation() {
- let mut builder = SchemaBuilder::new();
- let fields = FeatFilterFields::from(&mut builder);
-
- assert_eq!(
- 0,
- fields
- .interpret(&FeatFilterQuery {
- ..FeatFilterQuery::default()
- })
- .len()
- );
-
- assert_eq!(
- 1,
- fields
- .interpret(&FeatFilterQuery {
- a: Some(0..10),
- ..FeatFilterQuery::default()
- })
- .len()
- );
-
- assert_eq!(
- 2,
- fields
- .interpret(&FeatFilterQuery {
- a: Some(0..10),
- c: Some(1.1..2.2),
- ..FeatFilterQuery::default()
- })
- .len()
- );
-}
-
-#[test]
-fn add_to_doc_sets_fields_properly() {
- let mut builder = SchemaBuilder::new();
- let fields = FeatFilterFields::from(&mut builder);
-
- let mut doc = Document::new();
-
- fields.add_to_doc(
- &mut doc,
- &Feat {
- a: 10,
- d: Some(0.42),
- ..Feat::default()
- },
- );
-
- // Set values are filled properly
- assert_eq!(Some(&Value::U64(10)), doc.get_first(fields.a));
- assert_eq!(Some(&Value::F64(0.0)), doc.get_first(fields.c));
- assert_eq!(Some(&Value::F64(0.42)), doc.get_first(fields.d));
- // Unsed optional values aren't added
- assert_eq!(None, doc.get_first(fields.b));
-}
-
-#[test]
fn agg_query_full_range_generation() {
assert_eq!(
FeatAggregationQuery {
@@ -202,7 +115,6
let mut builder = SchemaBuilder::new();

let id_field = builder.add_u64_field("id", tantivy::schema::FAST);
- let fields = FeatFilterFields::from(&mut builder);

let index = Index::create_in_ram(builder.build());

@@ -213,7 +125,6
let mut doc = Document::new();

doc.add_u64(id_field, id);
- fields.add_to_doc(&mut doc, &feat);
writer.add_document(doc);

db.insert(id, feat);

Created cantine_derive/tests/filter_query.rs

@@ -1,0 +1,84
+use std::convert::TryFrom;
+
+use tantivy::{
+ schema::{SchemaBuilder, Value},
+ Document,
+};
+
+use cantine_derive::FilterQuery;
+
+#[derive(FilterQuery, Default)]
+pub struct Feat {
+ pub a: u64,
+ pub b: Option<i16>,
+ pub c: f32,
+ pub d: Option<f64>,
+}
+
+#[test]
+fn filter_fields_can_read_and_write_from_schema() {
+ let mut builder = SchemaBuilder::new();
+ let original = FeatFilterFields::from(&mut builder);
+ let loaded = FeatFilterFields::try_from(&builder.build()).unwrap();
+ assert_eq!(original, loaded);
+}
+
+#[test]
+fn filter_query_interpretation() {
+ let mut builder = SchemaBuilder::new();
+ let fields = FeatFilterFields::from(&mut builder);
+
+ assert_eq!(
+ 0,
+ fields
+ .interpret(&FeatFilterQuery {
+ ..FeatFilterQuery::default()
+ })
+ .len()
+ );
+
+ assert_eq!(
+ 1,
+ fields
+ .interpret(&FeatFilterQuery {
+ a: Some(0..10),
+ ..FeatFilterQuery::default()
+ })
+ .len()
+ );
+
+ assert_eq!(
+ 2,
+ fields
+ .interpret(&FeatFilterQuery {
+ a: Some(0..10),
+ c: Some(1.1..2.2),
+ ..FeatFilterQuery::default()
+ })
+ .len()
+ );
+}
+
+#[test]
+fn add_to_doc_sets_fields_properly() {
+ let mut builder = SchemaBuilder::new();
+ let fields = FeatFilterFields::from(&mut builder);
+
+ let mut doc = Document::new();
+
+ fields.add_to_doc(
+ &mut doc,
+ &Feat {
+ a: 10,
+ d: Some(0.42),
+ ..Feat::default()
+ },
+ );
+
+ // Set values are filled properly
+ assert_eq!(Some(&Value::U64(10)), doc.get_first(fields.a));
+ assert_eq!(Some(&Value::F64(0.0)), doc.get_first(fields.c));
+ assert_eq!(Some(&Value::F64(0.42)), doc.get_first(fields.d));
+ // Unsed optional values aren't added
+ assert_eq!(None, doc.get_first(fields.b));
+}