caio.co/de/cantine

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

@@ -7,14 +7,16
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,
@@ -126,18 +128,15
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)?)
}
@@ -187,7 +186,7
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

@@ -9,7 +9,7
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 {
@@ -107,7 +107,7
}
}

-#[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,
@@ -127,6 +127,12
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")]