tag_index 0.2.0

tag_index provides a searchable index over key-value tags
Documentation
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::pin::Pin;

use tag_index::{InvertedTagIndex, Tag, TagIndex, Tags};

fn construct_index(tagfile: &str) -> Pin<Box<InvertedTagIndex>> {
    let reader = BufReader::new(File::open(tagfile).unwrap());
    let iti = InvertedTagIndex::default();
    for line in reader.lines() {
        let line = line.unwrap();
        let tags = Tags::new(line.trim()).unwrap();
        iti.insert(tags);
    }
    Box::pin(iti)
}

fn parse_queries(queries: &str) -> Vec<Tag> {
    let reader = BufReader::new(File::open(queries).unwrap());
    let mut queries = vec![];
    for line in reader.lines() {
        let line = line.unwrap();
        queries.extend(Tags::new(&line).unwrap().tags().map(Tag::to_owned));
    }
    queries
}

fn main() {
    let args: Vec<String> = std::env::args().collect();
    let args: Vec<&str> = args.iter().map(AsRef::as_ref).collect();
    if args.len() != 3 {
        eprintln!("USAGE: benchmark-inverted-tag-index tagfile queries");
        std::process::exit(129);
    }
    let iti = construct_index(args[1]);
    let queries = parse_queries(args[2]);
    let queries_len = queries.len();
    let mut count = 0;
    let start = std::time::Instant::now();
    for query in queries.into_iter() {
        let tagses = iti.search(&[query]).unwrap();
        count += tagses.len();
    }
    let elapsed = start.elapsed();
    println!(
        "performed {} queries in {:?} and fetched {} tags",
        queries_len, elapsed, count
    );
}