fix distinct attribute behavior

This commit is contained in:
mpostma 2020-06-16 10:45:17 +02:00
parent 60a90e96f3
commit 8035ca7138
4 changed files with 22 additions and 19 deletions

View File

@ -286,15 +286,15 @@ impl Main {
Ok(self.main.delete::<_, Str>(writer, RANKING_RULES_KEY)?) Ok(self.main.delete::<_, Str>(writer, RANKING_RULES_KEY)?)
} }
pub fn distinct_attribute(&self, reader: &heed::RoTxn<MainT>) -> MResult<Option<String>> { pub fn distinct_attribute(&self, reader: &heed::RoTxn<MainT>) -> MResult<Option<FieldId>> {
if let Some(value) = self.main.get::<_, Str, Str>(reader, DISTINCT_ATTRIBUTE_KEY)? { if let Some(value) = self.main.get::<_, Str, OwnedType<u16>>(reader, DISTINCT_ATTRIBUTE_KEY)? {
return Ok(Some(value.to_owned())) return Ok(Some(FieldId(value.to_owned())))
} }
return Ok(None) return Ok(None)
} }
pub fn put_distinct_attribute(self, writer: &mut heed::RwTxn<MainT>, value: &str) -> MResult<()> { pub fn put_distinct_attribute(self, writer: &mut heed::RwTxn<MainT>, value: FieldId) -> MResult<()> {
Ok(self.main.put::<_, Str, Str>(writer, DISTINCT_ATTRIBUTE_KEY, value)?) Ok(self.main.put::<_, Str, OwnedType<u16>>(writer, DISTINCT_ATTRIBUTE_KEY, &value.0)?)
} }
pub fn delete_distinct_attribute(self, writer: &mut heed::RwTxn<MainT>) -> MResult<bool> { pub fn delete_distinct_attribute(self, writer: &mut heed::RwTxn<MainT>) -> MResult<bool> {

View File

@ -59,7 +59,8 @@ pub fn apply_settings_update(
match settings.distinct_attribute { match settings.distinct_attribute {
UpdateState::Update(v) => { UpdateState::Update(v) => {
index.main.put_distinct_attribute(writer, &v)?; let field_id = schema.insert(&v)?;
index.main.put_distinct_attribute(writer, field_id)?;
}, },
UpdateState::Clear => { UpdateState::Clear => {
index.main.delete_distinct_attribute(writer)?; index.main.delete_distinct_attribute(writer)?;

View File

@ -139,19 +139,17 @@ impl<'a> SearchBuilder<'a> {
} }
if let Some(field) = self.index.main.distinct_attribute(reader)? { if let Some(field) = self.index.main.distinct_attribute(reader)? {
if let Some(field_id) = schema.id(&field) { let index = &self.index;
let index = &self.index; query_builder.with_distinct(1, move |id| {
query_builder.with_distinct(1, move |id| { match index.document_attribute_bytes(reader, id, field) {
match index.document_attribute_bytes(reader, id, field_id) { Ok(Some(bytes)) => {
Ok(Some(bytes)) => { let mut s = SipHasher::new();
let mut s = SipHasher::new(); bytes.hash(&mut s);
bytes.hash(&mut s); Some(s.finish())
Some(s.finish())
}
_ => None,
} }
}); _ => None,
} }
});
} }
query_builder.set_facet_filter(self.facet_filters); query_builder.set_facet_filter(self.facet_filters);

View File

@ -89,10 +89,14 @@ async fn get_all(
.map(|r| r.to_string()) .map(|r| r.to_string())
.collect(); .collect();
let distinct_attribute = index.main.distinct_attribute(&reader)?;
let schema = index.main.schema(&reader)?; let schema = index.main.schema(&reader)?;
let distinct_attribute = match (index.main.distinct_attribute(&reader)?, &schema) {
(Some(id), Some(schema)) => schema.name(id).map(str::to_string),
_ => None,
};
let attributes_for_faceting = match (&schema, &index.main.attributes_for_faceting(&reader)?) { let attributes_for_faceting = match (&schema, &index.main.attributes_for_faceting(&reader)?) {
(Some(schema), Some(attrs)) => { (Some(schema), Some(attrs)) => {
attrs attrs