Integrate with the new `cantine_derive` traits
- Id
- 08471c01f2d08747a832f87327c907302dd26a1f
- Author
- Caio
- Commit time
- 2020-02-08T11:41:34+01:00
Modified cantine/src/index.rs
collector::Collector,
fastfield::FastFieldReader,
query::Query,
- schema::{Field, Schema, SchemaBuilder, Value, FAST, STORED, TEXT},
+ schema::{Field, Schema, SchemaBuilder, Value, FAST, INDEXED, STORED, TEXT},
DocId, Document, Result, Score, Searcher, SegmentLocalId, SegmentReader, TantivyError,
};
use crate::model::{
- FeaturesAggregationQuery, FeaturesAggregationResult, FeaturesCollector, FeaturesFilterFields,
- Recipe, RecipeId, Sort,
+ Features, FeaturesAggregationQuery, FeaturesAggregationResult, FeaturesFilterFields, Recipe,
+ RecipeId, Sort,
};
+
+use cantine_derive::{AggregableCollector, Filterable};
use tique::conditional_collector::{
Ascending, CheckCondition, CollectionResult, ConditionForSegment, Descending, TopCollector,
agg_query: FeaturesAggregationQuery,
) -> Result<FeaturesAggregationResult> {
let features_field = self.features_bincode;
- let collector = FeaturesCollector::new(agg_query, move |reader: &SegmentReader| {
- let features_reader = reader
- .fast_fields()
- .bytes(features_field)
- .expect("bytes field is indexed");
+ let collector =
+ AggregableCollector::<Features, _>::new(agg_query, move |reader: &SegmentReader| {
+ let features_reader = reader
+ .fast_fields()
+ .bytes(features_field)
+ .expect("bytes field is indexed");
- move |doc, query, agg| {
- let buf = features_reader.get_bytes(doc);
- let features = bincode::deserialize(buf).unwrap();
- agg.collect(query, &features);
- }
- });
+ move |doc| bincode::deserialize(features_reader.get_bytes(doc)).ok()
+ });
Ok(searcher.search(query, &collector)?)
}
id: builder.add_u64_field(FIELD_ID, STORED | FAST),
fulltext: builder.add_text_field(FIELD_FULLTEXT, TEXT),
features_bincode: builder.add_bytes_field(FIELD_FEATURES_BINCODE),
- features: FeaturesFilterFields::from(builder),
+ features: Features::create_schema(builder, INDEXED | FAST),
}
}
}
Modified cantine/src/model.rs
use uuid::{self, Uuid};
use crate::database::DatabaseRecord;
-use cantine_derive::FilterAndAggregation;
+use cantine_derive::{Aggregable, Filterable};
#[derive(Deserialize, Serialize, Debug, PartialEq, Clone)]
pub struct Recipe {
}
}
-#[derive(FilterAndAggregation, Serialize, Deserialize, Debug, Default, PartialEq, Clone)]
+#[derive(Filterable, Aggregable, Serialize, Deserialize, Debug, Default, PartialEq, Clone)]
pub struct Features {
pub num_ingredients: u8,
pub instructions_length: u32,
pub diet_keto: Option<f32>,
pub diet_paleo: Option<f32>,
}
+
+pub type FeaturesFilterQuery = <Features as Filterable>::Query;
+pub type FeaturesFilterFields = <Features as Filterable>::Schema;
+
+pub type FeaturesAggregationQuery = <Features as Aggregable>::Query;
+pub type FeaturesAggregationResult = <Features as Aggregable>::Agg;
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]