X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=plocate-build.cpp;h=023aedb53339da12b0e5487f662d5193fca6943f;hb=8c40d71acb262d9efe84af89e28a448bddadbabe;hp=18d3bd90fde057792b5f6e14d914882ba26d007c;hpb=faf31198659504235e2b65b5c3bb2ccb2ef296aa;p=plocate diff --git a/plocate-build.cpp b/plocate-build.cpp index 18d3bd9..023aedb 100644 --- a/plocate-build.cpp +++ b/plocate-build.cpp @@ -1,21 +1,20 @@ #include "db.h" -#include "vp4.h" +#include "turbopfor-encode.h" #include -#include #include #include -#include -#include +#include #include #include +#include #include +#include #include #include +#include #include -#include -#include -#include +#include #include #include @@ -82,7 +81,7 @@ private: void write_header(uint32_t docid); void append_block(); - vector pending_docids; + vector pending_deltas; uint32_t last_block_end, last_docid = -1; }; @@ -102,11 +101,11 @@ void PostingListBuilder::add_docid(uint32_t docid) return; } + pending_deltas.push_back(docid - last_docid - 1); last_docid = docid; - pending_docids.push_back(docid); - if (pending_docids.size() == 128) { + if (pending_deltas.size() == 128) { append_block(); - pending_docids.clear(); + pending_deltas.clear(); last_block_end = docid; } ++num_docids; @@ -114,7 +113,7 @@ void PostingListBuilder::add_docid(uint32_t docid) void PostingListBuilder::finish() { - if (pending_docids.empty()) { + if (pending_deltas.empty()) { return; } @@ -122,29 +121,39 @@ void PostingListBuilder::finish() // No interleaving for partial blocks. unsigned char buf[P4NENC_BOUND(128)]; - unsigned char *end = p4d1enc32(pending_docids.data(), pending_docids.size(), buf, last_block_end); + unsigned char *end = encode_pfor_single_block<128>(pending_deltas.data(), pending_deltas.size(), /*interleaved=*/false, buf); encoded.append(reinterpret_cast(buf), reinterpret_cast(end)); } void PostingListBuilder::append_block() { unsigned char buf[P4NENC_BOUND(128)]; - assert(pending_docids.size() == 128); - unsigned char *end = p4d1enc128v32(pending_docids.data(), 128, buf, last_block_end); + assert(pending_deltas.size() == 128); + unsigned char *end = encode_pfor_single_block<128>(pending_deltas.data(), 128, /*interleaved=*/true, buf); encoded.append(reinterpret_cast(buf), reinterpret_cast(end)); } void PostingListBuilder::write_header(uint32_t docid) { unsigned char buf[P4NENC_BOUND(1)]; - size_t bytes = p4nd1enc128v32(&docid, 1, buf); - encoded.append(reinterpret_cast(buf), bytes); + unsigned char *end = write_baseval(docid, buf); + encoded.append(reinterpret_cast(buf), end - buf); } class Corpus { public: Corpus(FILE *outfp, size_t block_size) - : invindex(new PostingListBuilder *[NUM_TRIGRAMS]), outfp(outfp), block_size(block_size) {} + : invindex(new PostingListBuilder *[NUM_TRIGRAMS]), outfp(outfp), block_size(block_size) + { + fill(invindex.get(), invindex.get() + NUM_TRIGRAMS, nullptr); + } + ~Corpus() + { + for (unsigned i = 0; i < NUM_TRIGRAMS; ++i) { + delete invindex[i]; + } + } + void add_file(string filename); void flush_block(); @@ -364,6 +373,7 @@ void do_build(const char *infile, const char *outfile, int block_size) hdr.version = -1; // Mark as broken. hdr.hashtable_size = 0; // Not known yet. hdr.extra_ht_slots = num_overflow_slots; + hdr.num_docids = 0; hdr.hash_table_offset_bytes = -1; // We don't know these offsets yet. hdr.filename_index_offset_bytes = -1; fwrite(&hdr, sizeof(hdr), 1, outfp);