#256 closed defect (fixed)
Bug when i switch from a sorting mode to an other in python
Reported by: | Versmisse David | Owned by: | Olly Betts |
---|---|---|---|
Priority: | normal | Milestone: | 1.0.7 |
Component: | Library API | Version: | 1.0.6 |
Severity: | normal | Keywords: | Enquire python |
Cc: | Blocked By: | ||
Blocking: | Operating System: | All |
Description
Hello,
I'm a French developer and i really want to use xapian for a project. We already have a "catalog" object but it is not efficient enough.
I have already written a good part of the code (in python), but i have a problem with Enquire. When i use two different sorters and the first one no longer exists (simulated by a "del" in the snippet), i have an error.
I simulate my problem with the following snippet that crashes with a beautiful segmentation fault
#!/usr/bin/python # -*- coding: UTF-8 -*- from xapian import (WritableDatabase, DB_CREATE_OR_OPEN, Document, Query, Enquire, MultiValueSorter, sortable_serialise) db = WritableDatabase('my_db', DB_CREATE_OR_OPEN) doc1 = Document() doc1.add_posting('foo', 0) doc1.add_value(0, sortable_serialise(1)) doc1.add_value(1, 'doc1') doc2 = Document() doc2.add_posting('foo', 0) doc2.add_value(0, sortable_serialise(2)) doc2.add_value(1, 'doc2') db.add_document(doc1) db.add_document(doc2) enquire = Enquire(db) enquire.set_query(Query('')) sorter = MultiValueSorter() sorter.add(0) enquire.set_sort_by_key_then_relevance(sorter) for doc in enquire.get_mset(0,10): print doc.get_document().get_value(1) del sorter enquire.set_sort_by_value_then_relevance(0) for doc in enquire.get_mset(0,10): print doc.get_document().get_value(1)
When i delete the "del sorter" line, there is not problem. Is it a bug or is it only my fault? Do we must do a new Enquire instance for each sort?
Thanks you in advance for your answer. And thanks you very much for your project.
Best regards, David Versmisse.
Change History (6)
comment:1 by , 17 years ago
comment:2 by , 17 years ago
Milestone: | → 1.0.7 |
---|---|
Status: | new → assigned |
Actually, I believe you've nailed this one. Thanks!
I don't think there are any other variables to set. In a less strongly typed language, sort_key and sorter would be a single member variable, but in C++ that isn't possible so sort_key is ignored unless sorter is NULL.
I'll commit fixes for 1.1.0 and 1.0.7 when I get a chance, but meanwhile, adding internal->sorter = NULL to set_sort_by*value*() by hand should resolve this for you.
comment:3 by , 17 years ago
Thank you very much for your reply. I will follow your advice.
Best regards, David Versmisse.
comment:4 by , 17 years ago
Component: | Xapian-bindings → Library API |
---|
comment:5 by , 17 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
Fixed in changeset [10456]
Replying to versmisse:
I looked at the code (omenquire.cc in particular), i think that the functions set_sort_by_* can operate only once with a single instance of Enquire. For example: internal->sorter = NULL; added to Enquire::set_sort_by_value_then_relevance resolves my problem, but it is not very clean, there are surely some other variables to set.
Thanks you in advance for your answer,
Best regards, David Versmisse.