diff --git a/Cargo.lock b/Cargo.lock index 34251e6..b8fc90c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,22 +1,27 @@ [root] name = "tantivy-cli" -version = "0.1.1" +version = "0.2.0" dependencies = [ "ansi_term 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bincode 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "chan 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "clap 2.19.2 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "iron 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "mount 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "persistent 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "staticfile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tantivy 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "persistent 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "staticfile 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tantivy 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", - "urlencoded 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "urlencoded 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "aho-corasick" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -27,6 +32,16 @@ name = "ansi_term" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "ansi_term" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "ascii" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "atomicwrites" version = "0.0.14" @@ -43,8 +58,8 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "num 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "num 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -59,10 +74,10 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iron 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "persistent 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "persistent 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 0.8.19 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -75,31 +90,43 @@ name = "byteorder" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "chan" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "clap" -version = "2.10.0" +version = "2.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ansi_term 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", - "strsim 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "term_size 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", + "strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "term_size 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "vec_map 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "combine" -version = "1.3.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ascii 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "conduit-mime-types" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -108,14 +135,28 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "dtoa" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "env_logger" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "error" version = "0.1.9" @@ -131,7 +172,7 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -142,13 +183,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "memmap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "gcc" -version = "0.3.32" +version = "0.3.39" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -166,27 +207,27 @@ dependencies = [ [[package]] name = "httparse" -version = "1.1.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hyper" -version = "0.9.10" +version = "0.9.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cookie 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "solicit 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", "traitobject 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -194,7 +235,7 @@ name = "idna" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-bidi 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-normalization 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -206,19 +247,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "conduit-mime-types 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "error 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.9.13 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "modifier 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "itertools" -version = "0.4.18" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -247,7 +288,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -257,17 +298,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "lz4" -version = "1.18.131" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "gcc 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", + "lz4-sys 1.0.1+1.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "skeptic 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lz4-sys" +version = "1.0.1+1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gcc 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "matches" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -275,7 +326,7 @@ name = "memchr" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -285,7 +336,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fs2 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -296,7 +347,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fs2 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -324,35 +375,35 @@ dependencies = [ [[package]] name = "num" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-bigint 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)", - "num-complex 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "num-complex 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", "num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", "num-iter 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "num-rational 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", + "num-rational 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-bigint" -version = "0.1.33" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-complex" -version = "0.1.33" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -360,7 +411,7 @@ name = "num-integer" version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -369,23 +420,23 @@ version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-rational" -version = "0.1.32" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-bigint 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", "num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -393,12 +444,20 @@ name = "num_cpus" version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num_cpus" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "persistent" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iron 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -423,32 +482,32 @@ dependencies = [ [[package]] name = "rand" -version = "0.3.14" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex" -version = "0.1.73" +version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.3.4" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rustc-serialize" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -474,23 +533,23 @@ name = "serde" version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", + "num 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde" -version = "0.8.1" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_json" -version = "0.8.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 0.8.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -513,41 +572,43 @@ dependencies = [ [[package]] name = "staticfile" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iron 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "mount 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "strsim" -version = "0.4.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "tantivy" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "atomicwrites 0.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "bincode 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "combine 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "chan 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "combine 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "fst 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", - "gcc 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.4.18 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", + "itertools 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "lz4 1.18.131 (registry+https://github.com/rust-lang/crates.io-index)", + "lz4 1.20.0 (registry+https://github.com/rust-lang/crates.io-index)", "memmap 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.1.73 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -559,7 +620,7 @@ name = "tempdir" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -568,18 +629,20 @@ version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "term_size" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -588,12 +651,12 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "thread_local" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -605,7 +668,7 @@ version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -645,7 +708,7 @@ name = "unicode-bidi" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -653,6 +716,11 @@ name = "unicode-normalization" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "unicode-segmentation" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "unicode-width" version = "0.1.3" @@ -668,32 +736,22 @@ dependencies = [ [[package]] name = "url" -version = "0.2.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "uuid 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "url" -version = "1.2.0" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "idna 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "urlencoded" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bodyparser 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "iron 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "url 0.2.38 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -706,8 +764,8 @@ name = "uuid" version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -726,75 +784,82 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] -"checksum aho-corasick 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2b3fb52b09c1710b961acb35390d514be82e4ac96a9969a8e38565a29b878dc9" +"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66" "checksum ansi_term 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c877397e09fec7a240af5fa74ad0124054b8066149d6544cd1ace93f8de3be68" +"checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" +"checksum ascii 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae7d751998c189c1d4468cf0a39bb2eae052a9c58d50ebb3b9591ee3813ad50" "checksum atomicwrites 0.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "cb0c17968587e21d3fec90bd67dc2b7c956189a9e81ce4f8910172a787b66556" "checksum bincode 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60f89d68caf4f2e8a94efd192a2b8393869e72336dea4e0fe077cc6eb5f2057e" "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" "checksum bodyparser 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "07b171b407e583dc8f01011a713f20575a81ac60acecf3b8153012709aeb1fd6" "checksum byteorder 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96c8b41881888cc08af32d47ac4edd52bc7fa27fef774be47a92443756451304" "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" -"checksum clap 2.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6adb6a046b8155874daf331e6cb6f4a3edf3ea3cbc625809eb4077a384124761" -"checksum combine 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b68ff98e25582baa07a31b50b9976b75705774b737df42cb30629e56f678f01" +"checksum chan 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "82b22acfef7960fd8f829bc50749273be637cbd76b9d4cc20497666cc3a33329" +"checksum clap 2.19.2 (registry+https://github.com/rust-lang/crates.io-index)" = "305ad043f009db535a110200541d4567b63e172b1fe030313fbb92565da7ed24" +"checksum combine 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ee3450f370d30aa4ebc6f83ef2089742634078f6accdd827449b8cc52b592aa" "checksum conduit-mime-types 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "95ca30253581af809925ef68c2641cc140d6183f43e12e0af4992d53768bd7b8" "checksum cookie 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0e3d6405328b6edb412158b3b7710e2634e23f3614b9bb1c412df7952489a626" +"checksum crossbeam 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0c5ea215664ca264da8a9d9c3be80d2eaf30923c259d03e870388eb927508f97" "checksum dtoa 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0dd841b58510c9618291ffa448da2e4e0f699d984d436122372f446dae62263d" +"checksum env_logger 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "15abd780e45b3ea4f76b4e9a26ff4843258dd8a3eed2775a0e7368c2e7936c2f" "checksum error 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "a6e606f14042bb87cc02ef6a14db6c90ab92ed6f62d87e69377bc759fd7987cc" "checksum fs2 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "bcd414e5a1a979b931bb92f41b7a54106d3f6d2e6c253e9ce943b7cd468251ef" "checksum fst 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f9daaf118aaffce0838b1c563d6439f2ba9f09ab83295f3d3818bde5e0b3b3" -"checksum gcc 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb000abd6df9df4c637f75190297ebe56c1d7e66b56bbf3b4aa7aece15f61a2" +"checksum gcc 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)" = "771e4a97ff6f237cf0f7d5f5102f6e28bb9743814b6198d684da5c58b76c11e0" "checksum getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9047cfbd08a437050b363d35ef160452c5fe8ea5187ae0a624708c91581d685" "checksum hpack 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d2da7d3a34cf6406d9d700111b8eafafe9a251de41ae71d8052748259343b58" -"checksum httparse 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "46534074dbb80b070d60a5cb8ecadd8963a00a438ae1a95268850a7ef73b67ae" -"checksum hyper 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)" = "eb27e8a3e8f17ac43ffa41bbda9cf5ad3f9f13ef66fa4873409d4902310275f7" +"checksum httparse 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a6e7a63e511f9edffbab707141fbb8707d1a3098615fb2adbd5769cdfcc9b17d" +"checksum hyper 0.9.13 (registry+https://github.com/rust-lang/crates.io-index)" = "86ea0c0ff7e6ef09eff72234800ddb48b6263277936e7ecd6ecd3250345d705f" "checksum idna 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1053236e00ce4f668aeca4a769a09b3bf5a682d802abd6f3cb39374f6b162c11" "checksum iron 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fb1b2d809f84bf347e472d5758762b5c804e0c622970235f156d82673e4d334" -"checksum itertools 0.4.18 (registry+https://github.com/rust-lang/crates.io-index)" = "6f15d694e7f7d46ef7a6951db981b33f132472f91d11b5a0f44d3980b87ccbc3" +"checksum itertools 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "c4a9b56eb56058f43dc66e58f40a214b2ccbc9f3df51861b63d51dec7b65bc3f" "checksum itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae3088ea4baeceb0284ee9eea42f591226e6beaecf65373e41b38d95a1b8e7a1" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "cf186d1a8aa5f5bee5fd662bc9c1b949e0259e1bcc379d1f006847b0080c7417" -"checksum libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "23e3757828fa702a20072c37ff47938e9dd331b92fac6e223d26d4b7a55f7ee2" +"checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70" "checksum log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ab83497bf8bf4ed2a74259c1c802351fcd67a65baa86394b6ba73c36f4838054" -"checksum lz4 1.18.131 (registry+https://github.com/rust-lang/crates.io-index)" = "7d21228e5faf967a3f95ccaf8ba37c8c00405ba4fc8ad6b2c8e14667c0fb12bd" -"checksum matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "15305656809ce5a4805b1ff2946892810992197ce1270ff79baded852187942e" +"checksum lz4 1.20.0 (registry+https://github.com/rust-lang/crates.io-index)" = "19d6fda265bc5cb247f58be63aa51a3866389b1d38c4908999a627f3542ea26d" +"checksum lz4-sys 1.0.1+1.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7f1660dbe767c5b4bbbda783fce9e6a5ca8ae8f7b55605e4a404debc01e3359a" +"checksum matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efd7622e3022e1a6eaa602c4cea8912254e5582c9c692e9167714182244801b1" "checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20" "checksum memmap 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f20f72ed93291a72e22e8b16bb18762183bb4943f0f483da5b8be1a9e8192752" "checksum memmap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "69253224aa10070855ea8fe9dbe94a03fc2b1d7930bb340c9e586a7513716fea" "checksum mime 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b5c93a4bd787ddc6e7833c519b73a50883deb5863d76d9b71eb8216fb7f94e66" "checksum modifier 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41f5c9112cb662acd3b204077e0de5bc66305fa8df65c8019d5adb10e9ab6e58" "checksum mount 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c518ef1edf5da3aa1cdd5160c08d1781995ccb74b5669c2315ce29fe6cf6c1f2" -"checksum num 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "d2ee34a0338c16ae67afb55824aaf8852700eb0f77ccd977807ccb7606b295f6" -"checksum num-bigint 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)" = "fbc450723a2fe91d332a29edd8660e099b937d29e1a3ebe914e0da3f77ac1ad3" -"checksum num-complex 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)" = "8aabbc079e1855ce8415141fee0ebebf171f56505373b3a966e2716ad7c0e555" +"checksum num 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "bde7c03b09e7c6a301ee81f6ddf66d7a28ec305699e3d3b056d2fc56470e3120" +"checksum num-bigint 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "88b14378471f7c2adc5262f05b4701ef53e8da376453a8d8fee48e51db745e49" +"checksum num-complex 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c78e054dd19c3fd03419ade63fa661e9c49bb890ce3beb4eee5b7baf93f92f" "checksum num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "fb24d9bfb3f222010df27995441ded1e954f8f69cd35021f6bef02ca9552fb92" "checksum num-iter 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "287a1c9969a847055e1122ec0ea7a5c5d6f72aad97934e131c83d5c08ab4e45c" -"checksum num-rational 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "48cdcc9ff4ae2a8296805ac15af88b3d88ce62128ded0cb74ffb63a587502a84" -"checksum num-traits 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "95e58eac34596aac30ab134c8a8da9aa2dc99caa4b4b4838e6fc6e298016278f" +"checksum num-rational 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "54ff603b8334a72fbb27fe66948aac0abaaa40231b3cecd189e76162f6f38aaf" +"checksum num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "a16a42856a256b39c6d3484f097f6713e14feacd9bfb02290917904fae46c81c" "checksum num_cpus 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "cee7e88156f3f9e19bdd598f8d6c9db7bf4078f99f8381f43a55b09648d1a6e3" -"checksum persistent 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebaf2f9f9881f73e82ba23164a40d3500112d8e7ad056cdde451874f1814a4d9" +"checksum num_cpus 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "55aabf4e2d6271a2e4e4c0f2ea1f5b07cc589cc1a9e9213013b54a76678ca4f3" +"checksum persistent 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0c0aea7e6e026f9090c56aa7cda9d4ad6f182c717f0640cb03beace1f75a43d2" "checksum plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1a6a0dc3910bc8db877ffed8e457763b317cf880df4ae19109b9f77d277cf6e0" "checksum pulldown-cmark 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8361e81576d2e02643b04950e487ec172b687180da65c731c03cf336784e6c07" -"checksum rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2791d88c6defac799c3f20d74f094ca33b9332612d9aef9078519c82e4fe04a5" -"checksum regex 0.1.73 (registry+https://github.com/rust-lang/crates.io-index)" = "56b7ee9f764ecf412c6e2fff779bca4b22980517ae335a21aeaf4e32625a5df2" -"checksum regex-syntax 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "31040aad7470ad9d8c46302dcffba337bb4289ca5da2e3cd6e37b64109a85199" -"checksum rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6159e4e6e559c81bd706afe9c8fd68f547d3e851ce12e76b1de7914bab61691b" +"checksum rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "022e0636ec2519ddae48154b028864bdce4eaf7d35226ab8e65c611be97b189d" +"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f" +"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957" +"checksum rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "237546c689f20bb44980270c73c3b9edd0891c1be49cc1274406134a66d3957b" "checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084" "checksum semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac" "checksum sequence_trie 0.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "d5b4eb0f7d1ff9b9666d8b8ff543f3705dd464025269a5b0e1988ffa60ca1be8" "checksum serde 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)" = "c97b18e9e53de541f11e497357d6c5eaeb39f0cb9c8734e274abe4935f6991fa" -"checksum serde 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7720ad510b91c19de6a1728077821d9407c625018250c8a24a66716022a8a172" -"checksum serde_json 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e10f8a9d94b06cf5d3bef66475f04c8ff90950f1be7004c357ff9472ccbaebc" +"checksum serde 0.8.19 (registry+https://github.com/rust-lang/crates.io-index)" = "58a19c0871c298847e6b68318484685cd51fa5478c0c905095647540031356e5" +"checksum serde_json 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3f7d3c184d35801fb8b32b46a7d58d57dbcc150b0eb2b46a1eb79645e8ecfd5b" "checksum skeptic 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34c7f11b6755efa4abfd2739426c17de0a36153510bacd6147113fd3a9f2634d" "checksum solicit 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "172382bac9424588d7840732b250faeeef88942e37b6e35317dce98cafdd75b2" -"checksum staticfile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7638ee7543e08b10d13f9e6c4488534d47c2269b258bf76a6fb998bfd7f54937" -"checksum strsim 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d5f575d5ced6634a5c4cb842163dab907dc7e9148b28dc482d81b8855cbe985" -"checksum tantivy 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "632071cb1ca7b580579026ba68e43bd122bce3bc793d46d4fba5350e3b788fb7" +"checksum staticfile 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b28e731e7fcc67ce6aa4b53359d6922e193979175fbe85d5558fc71e692e4523" +"checksum strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "67f84c44fbb2f91db7fef94554e6b2ac05909c9c0b0bc23bb98d3a1aebfe7f7c" +"checksum tantivy 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0cd765285b5d2067fe109c261cd1646a3da62b9de05827909820203f77f0ee1d" "checksum tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "87974a6f5c1dfb344d733055601650059a3363de2a6104819293baff662132d6" "checksum tempfile 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9270837a93bad1b1dac18fe67e786b3c960513af86231f6f4f57fddd594ff0c8" -"checksum term_size 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6a7c9a4de31e5622ec38533988a9e965aab09b26ee8bd7b8b0f56d488c3784d" +"checksum term_size 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f7f5f3f71b0040cecc71af239414c23fd3c73570f5ff54cf50e03cef637f2a0" "checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03" -"checksum thread_local 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "55dd963dbaeadc08aa7266bf7f91c3154a7805e32bb94b820b769d2ef3b4744d" +"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5" "checksum time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7ec6d62a20df54e07ab3b78b9a3932972f4b7981de295563686849eb3989af" "checksum traitobject 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "07eaeb7689bb7fca7ce15628319635758eda769fed481ecfe6686ddef2600616" "checksum traitobject 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9dc23794ff47c95882da6f9d15de9a6be14987760a28cc0aafb40b7675ef09d8" @@ -803,11 +868,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "13a5906ca2b98c799f4b1ab4557b76367ebd6ae5ef14930ec841c74aed5f3764" "checksum unicode-bidi 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c1f7ceb96afdfeedee42bade65a0d585a6a0106f681b6749c8ff4daa8df30b3f" "checksum unicode-normalization 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26643a2f83bac55f1976fb716c10234485f9202dcd65cfbdf9da49867b271172" +"checksum unicode-segmentation 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c3bc443ded17b11305ffffe6b37e2076f328a5a8cb6aa877b1b98f77699e98b5" "checksum unicode-width 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d6722facc10989f63ee0e20a83cd4e1714a9ae11529403ac7e0afd069abc39e" "checksum unsafe-any 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b351086021ebc264aea3ab4f94d61d889d98e5e9ec2d985d993f50133537fd3a" -"checksum url 0.2.38 (registry+https://github.com/rust-lang/crates.io-index)" = "cbaa8377a162d88e7d15db0cf110c8523453edcbc5bc66d2b6fffccffa34a068" -"checksum url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "afe9ec54bc4db14bc8744b7fed060d785ac756791450959b2248443319d5b119" -"checksum urlencoded 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "756d430cb797668c12380ed391e9847747e756a6be7fedd39e4c74d4cd6e9874" +"checksum url 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "48ccf7bd87a81b769cf84ad556e034541fb90e1cd6d4bc375c822ed9500cd9d7" +"checksum urlencoded 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5ddcf2d3a0beedb5cdf50cabc521ab76a994907877a1d91d996c251d42c70e2e" "checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f" "checksum uuid 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "78c590b5bd79ed10aad8fb75f078a59d8db445af6c743e55c4a53227fc01c13f" "checksum vec_map 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cac5efe5cb0fa14ec2f84f83c701c562ee63f6dcc680861b21d65c682adfb05f" diff --git a/Cargo.toml b/Cargo.toml index dbbf9f4..6bc9022 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,37 +1,43 @@ [package] name = "tantivy-cli" -version = "0.1.1" +version = "0.2.0" authors = ["Paul Masurel "] description = """Command line interface for Tantivy, a search engine library.""" -documentation = "https://github.com/fulmicoton/tantivy" -homepage = "https://github.com/fulmicoton/tantivy" -repository = "https://github.com/fulmicoton/tantivy" +documentation = "https://github.com/tantivy-search/tantivy-cli" +homepage = "https://github.com/tantivy-search/tantivy-cli" +repository = "https://github.com/tantivy-search/tantivy-cli" readme = "README.md" keywords = ["search", "information", "retrieval"] license = "MIT" [dependencies] -#tantivy = { path = "../tantivy" } -tantivy = "0.1.1" -time = "0.1.34" + +time = "0.1" iron = "0.4" -staticfile = "0.3.0" -rustc-serialize = "0.3.16" -persistent="0.2.0" +staticfile = "0.3" +rustc-serialize = "0.3" +persistent="0.2" clap = "2" -ansi_term = "0.8.0" +ansi_term = "0.8" urlencoded = "0.4" -mount = "0.2.1" +mount = "0.2" +chan = "0.1" +bincode = "0.4" +byteorder = "0.5" +log = "0.3" +env_logger = "0.3" +tantivy = "0.2.0" +[[bin]] +name = "tantivy" +path = "src/main.rs" -# [dependencies.clap] -#version = "2" -#default-features = false -#features = [ "suggestions", "color" ] +[profile.release] +opt-level = 3 +debug = false +debug-assertions = false +lto = true -[[bin]] -name = "tantivy" -path = "src/main.rs" \ No newline at end of file diff --git a/README.md b/README.md index cea4d38..2cc6957 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,6 @@ It contains two sections: - segments (currently empty, but we will change that soon) - schema - # Indexing the document: `index` @@ -163,34 +162,39 @@ Make sure to decompress the file bunzip2 wiki-articles.json.bz2 ``` -If you are in a rush you can [download 100 articles in the right format here](http://fulmicoton.com/tantivy-files/wiki-articles-1000.json). +If you are in a rush you can [download 100 articles in the right format here (11 MB)](http://fulmicoton.com/tantivy-files/wiki-articles-1000.json). The `index` command will index your document. -By default it will use as many threads as there are cores on your machine. -You can change the number of threads by passing it the `-t` parameter. +By default it will use as 3 thread, each with a buffer size of 1GB split a +accross these threads. -On my computer (8 core Xeon(R) CPU X3450 @ 2.67GHz), it will take around 6 minutes. ``` cat wiki-articles.json | tantivy index -i ./wikipedia-index ``` -While it is indexing, you can peek at the index directory -to check what is happening. +You can change the number of threads by passing it the `-t` parameter, and the total +buffer size used by the threads heap by using the `-m`. Note that tantivy's memory usage +is greater than just this buffer size parameter. + +On my computer (8 core Xeon(R) CPU X3450 @ 2.67GHz), on 8 threads, indexing wikipedia takes around 9 minutes. + + +While tantivy is indexing, you can peek at the index directory to check what is happening. ```bash ls ./wikipedia-index ``` -If you indexed the 5 million articles, you should see a lot of new files, all with the following format: - The main file is `meta.json`. +You should also see a lot of files with a UUID as filename, and different extensions. Our index is in fact divided in segments. Each segment acts as an individual smaller index. Its name is simply a uuid. - - +If you decided to index the complete wikipedia, you may also see some of these files disappear. +Having too many segments can hurt search performance, so tantivy actually automatically starts +merging segments. # Serve the search index: `serve` @@ -204,26 +208,30 @@ You can run it with the following command. By default, it will serve on port `3000`. You can search for the top 20 most relevant documents for the query `Barack Obama` by accessing -the following [url](http://localhost:3000/api/?q=barack+obama&explain=true&nhits=20) in your browser +the following [url](http://localhost:3000/api/?q=barack+obama&nhits=20) in your browser + + http://localhost:3000/api/?q=barack+obama&nhits=20 - http://localhost:3000/api/?q=barack+obama&explain=true&nhits=20 +By default this query is treated as `barack OR obama`. +You can also search for documents that contains both term, by adding a `+` sign before the terms in your query. + http://localhost:3000/api/?q=%2Bbarack%20%2Bobama%0A&nhits=20 + +Also, `-` makes it possible to remove documents the documents containing a specific term. -# Optimizing the index: `merge` + http://localhost:3000/api/?q=-barack%20%2Bobama%0A&nhits=20 + +Finally tantivy handle phrase queries. -Each of tantivy's indexer threads is building its own independant segment. -When its buffer is full, it closes its running segment, and starts working on a new one. -You should currently have more than 50 segments in your directory. + http://localhost:3000/api/?q=%22barack%20obama%22&nhits=20 + -Having that many segments can hurt your query performance. -Calling `tantivy merge` will merge your segments into one. +# Search the index via the command line + +You may also use the `search` command to stream all documents matching a specific query. +The documents are returned in an unspecified order. ``` - tantivy merge -i ./wikipedia-index + tantivy search -i wikipedia-index -q "barack obama" ``` -(The command takes less than 4 minutes on my computer) - -Note that your files are still there even after having run the command. -However, `meta.json` only lists one of the segments. -You will still need to remove the files manually. diff --git a/src/commands/bench.rs b/src/commands/bench.rs index 6fee3c6..921700b 100644 --- a/src/commands/bench.rs +++ b/src/commands/bench.rs @@ -1,7 +1,6 @@ use tantivy::Index; use tantivy::schema::{Field, Schema}; use tantivy::query::QueryParser; -use tantivy::query::Query; use std::path::Path; use tantivy::TimerTree; use std::io::BufReader; @@ -57,7 +56,7 @@ fn run_bench(index_path: &Path, println!("-------------------------------\n\n\n"); let index = try!(Index::open(index_path).map_err(|e| format!("Failed to open index.\n{:?}", e))); - let searcher = try!(index.searcher().map_err(|e| format!("Failed to acquire searcher.\n{:?}", e))); + let searcher = index.searcher(); let default_search_fields: Vec = extract_search_fields(&index.schema()); let queries = try!(read_query_file(query_filepath).map_err(|e| format!("Failed reading the query file: {}", e))); let query_parser = QueryParser::new(index.schema(), default_search_fields); @@ -67,15 +66,15 @@ fn run_bench(index_path: &Path, for _ in 0..num_repeat { for query_txt in &queries { let query = query_parser.parse_query(&query_txt).unwrap(); - let num_terms = query.num_terms(); + // let num_terms = query.num_terms(); let mut top_collector = TopCollector::with_limit(10); - let mut count_collector = CountCollector::new(); + let mut count_collector = CountCollector::default(); let timing; { - let mut collector = chain().add(&mut top_collector).add(&mut count_collector); + let mut collector = chain().push(&mut top_collector).push(&mut count_collector); timing = try!(query.search(&searcher, &mut collector).map_err(|e| format!("Failed while searching query {:?}.\n\n{:?}", query_txt, e))); } - println!("{}\t{}\t{}\t{}", query_txt, num_terms, count_collector.count(), timing.total_time()); + println!("{}\t{}\t{}", query_txt, count_collector.count(), timing.total_time()); } } @@ -87,7 +86,7 @@ fn run_bench(index_path: &Path, let query = query_parser.parse_query(&query_txt).unwrap(); let mut top_collector = TopCollector::with_limit(10); try!(query.search(&searcher, &mut top_collector).map_err(|e| format!("Failed while retrieving document for query {:?}.\n{:?}", query, e))); - let mut timer = TimerTree::new(); + let mut timer = TimerTree::default(); { let _scoped_timer_ = timer.open("total"); for doc_address in top_collector.docs() { diff --git a/src/commands/index.rs b/src/commands/index.rs index 35895a7..3dcca40 100644 --- a/src/commands/index.rs +++ b/src/commands/index.rs @@ -1,15 +1,19 @@ use std::convert::From; use std::fs::File; use std::io; +use std::cmp; use std::io::BufRead; use std::io::BufReader; use std::io::Read; use std::path::PathBuf; -use tantivy; +use tantivy; use tantivy::Index; +use tantivy::IndexWriter; +use tantivy::Document; use time::PreciseTime; use clap::ArgMatches; - +use chan; +use std::thread; pub fn run_index_cli(argmatch: &ArgMatches) -> Result<(), String> { let index_directory = PathBuf::from(argmatch.value_of("index").unwrap()); @@ -21,46 +25,85 @@ pub fn run_index_cli(argmatch: &ArgMatches) -> Result<(), String> { None => DocumentSource::FromPipe, } }; - let num_threads = try!(value_t!(argmatch, "num_threads", usize).map_err(|_|format!("Failed to read num_threads argument as an integer."))); - run_index(index_directory, document_source, num_threads).map_err(|e| format!("Indexing failed : {:?}", e)) -} - -enum DocumentSource { - FromPipe, - FromFile(PathBuf), + let mut num_threads = try!(value_t!(argmatch, "num_threads", usize).map_err(|_|format!("Failed to read num_threads argument as an integer."))); + if num_threads == 0 { + num_threads = 1; + } + let buffer_size = try!(value_t!(argmatch, "memory_size", usize).map_err(|_|format!("Failed to read the buffer size argument as an integer."))); + let buffer_size_per_thread = buffer_size / num_threads; + run_index(index_directory, document_source, buffer_size_per_thread, num_threads).map_err(|e| format!("Indexing failed : {:?}", e)) } -fn run_index(directory: PathBuf, document_source: DocumentSource, num_threads: usize) -> tantivy::Result<()> { +fn run_index(directory: PathBuf, document_source: DocumentSource, buffer_size_per_thread: usize, num_threads: usize) -> tantivy::Result<()> { let index = try!(Index::open(&directory)); - let schema = index.schema(); + let (line_sender, line_receiver) = chan::sync(10_000); + let (doc_sender, doc_receiver) = chan::sync(10_000); + + thread::spawn(move || { + let articles = document_source.read().unwrap(); + for article_line_res in articles.lines() { + let article_line = article_line_res.unwrap(); + line_sender.send(article_line); + } + }); - let mut index_writer = try!( + + let num_threads_to_parse_json = cmp::max(1, num_threads / 2); + info!("Using {} threads to parse json", num_threads_to_parse_json); + for _ in 0..num_threads_to_parse_json { + let schema_clone = schema.clone(); + let doc_sender_clone = doc_sender.clone(); + let line_receiver_clone = line_receiver.clone(); + thread::spawn(move || { + for article_line in line_receiver_clone { + match schema_clone.parse_document(&article_line) { + Ok(doc) => { + doc_sender_clone.send(doc); + } + Err(err) => { + println!("Failed to add document doc {:?}", err); + } + } + } + }); + } + drop(doc_sender); + + let mut index_writer = try!( if num_threads > 0 { - index.writer_with_num_threads(num_threads) + index.writer_with_num_threads(num_threads, buffer_size_per_thread) } else { - index.writer() + index.writer(buffer_size_per_thread) } ); + + + let index_result = index_documents(&mut index_writer, doc_receiver); + try!(match index_result { + Ok(docstamp) => { + println!("Commit succeed, docstamp at {}", docstamp); + Ok(()) + } + Err(e) => { + println!("Error during indexing, rollbacking."); + index_writer.rollback().unwrap(); + println!("Rollback succeeded"); + Err(e) + } + }); - let articles = try!(document_source.read()); - + index_writer.wait_merging_threads() +} + +fn index_documents(index_writer: &mut IndexWriter, doc_receiver: chan::Receiver) -> tantivy::Result { + let group_count = 100_000; let mut num_docs = 0; let mut cur = PreciseTime::now(); - let group_count = 100000; - - for article_line_res in articles.lines() { - let article_line = article_line_res.unwrap(); // TODO - match schema.parse_document(&article_line) { - Ok(doc) => { - index_writer.add_document(doc).unwrap(); - } - Err(err) => { - println!("Failed to add document doc {:?}", err); - } - } + for doc in doc_receiver { + try!(index_writer.add_document(doc)); if num_docs > 0 && (num_docs % group_count == 0) { println!("{} Docs", num_docs); let new = PreciseTime::now(); @@ -68,29 +111,23 @@ fn run_index(directory: PathBuf, document_source: DocumentSource, num_threads: u println!("{:?} docs / hour", group_count * 3600 * 1_000_000 as u64 / (elapsed.num_microseconds().unwrap() as u64)); cur = new; } - num_docs += 1; - } - index_writer.wait().unwrap(); // TODO - Ok(()) + index_writer.commit() } -#[derive(Clone,Debug,RustcDecodable,RustcEncodable)] -pub struct WikiArticle { - pub url: String, - pub title: String, - pub body: String, +enum DocumentSource { + FromPipe, + FromFile(PathBuf), } - impl DocumentSource { fn read(&self,) -> io::Result>> { Ok(match self { &DocumentSource::FromPipe => { BufReader::new(Box::new(io::stdin())) - } + } &DocumentSource::FromFile(ref filepath) => { let read_file = try!(File::open(&filepath)); BufReader::new(Box::new(read_file)) @@ -98,4 +135,3 @@ impl DocumentSource { }) } } - diff --git a/src/commands/merge.rs b/src/commands/merge.rs index db61e4a..364cdc7 100644 --- a/src/commands/merge.rs +++ b/src/commands/merge.rs @@ -4,6 +4,8 @@ use tantivy::Index; use std::path::PathBuf; use clap::ArgMatches; +const HEAP_SIZE: usize = 300_000_000; + pub fn run_merge_cli(argmatch: &ArgMatches) -> Result<(), String> { let index_directory = PathBuf::from(argmatch.value_of("index").unwrap()); run_merge(index_directory).map_err(|e| format!("Indexing failed : {:?}", e)) @@ -12,7 +14,7 @@ pub fn run_merge_cli(argmatch: &ArgMatches) -> Result<(), String> { fn run_merge(path: PathBuf) -> tantivy::Result<()> { let index = try!(Index::open(&path)); - let segments = index.segments(); - let mut index_writer = try!(index.writer()); + let segments = index.searchable_segments(); + let mut index_writer = try!(index.writer(HEAP_SIZE)); index_writer.merge(&segments) } diff --git a/src/commands/mod.rs b/src/commands/mod.rs index fc30053..e8040b9 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -3,9 +3,11 @@ mod serve; mod new; mod bench; mod merge; +mod search; pub use self::new::run_new_cli; pub use self::index::run_index_cli; pub use self::serve::run_serve_cli; pub use self::bench::run_bench_cli; pub use self::merge::run_merge_cli; +pub use self::search::run_search_cli; \ No newline at end of file diff --git a/src/commands/new.rs b/src/commands/new.rs index fc2c312..ec82646 100644 --- a/src/commands/new.rs +++ b/src/commands/new.rs @@ -12,9 +12,9 @@ use std::ascii::AsciiExt; use rustc_serialize::json; -pub fn run_new_cli(matches: &ArgMatches) -> tantivy::Result<()> { +pub fn run_new_cli(matches: &ArgMatches) -> Result<(), String> { let index_directory = PathBuf::from(matches.value_of("index").unwrap()); - run_new(index_directory) + run_new(index_directory).map_err(|e| format!("{:?}" , e)) } @@ -72,8 +72,8 @@ fn prompt_yn(msg: &str) -> bool { } -fn ask_add_field_text(field_name: &str, schema: &mut Schema) { - let mut text_options = TextOptions::new(); +fn ask_add_field_text(field_name: &str, schema_builder: &mut SchemaBuilder) { + let mut text_options = TextOptions::default(); if prompt_yn("Should the field be stored") { text_options = text_options.set_stored(); } @@ -100,12 +100,12 @@ fn ask_add_field_text(field_name: &str, schema: &mut Schema) { TextIndexingOptions::Unindexed }; text_options = text_options.set_indexing_options(indexing_options); - schema.add_text_field(field_name, text_options); + schema_builder.add_text_field(field_name, text_options); } -fn ask_add_field_u32(field_name: &str, schema: &mut Schema) { - let mut u32_options = U32Options::new(); +fn ask_add_field_u32(field_name: &str, schema_builder: &mut SchemaBuilder) { + let mut u32_options = U32Options::default(); if prompt_yn("Should the field be stored") { u32_options = u32_options.set_stored(); } @@ -115,34 +115,35 @@ fn ask_add_field_u32(field_name: &str, schema: &mut Schema) { if prompt_yn("Should the field be indexed") { u32_options = u32_options.set_indexed(); } - schema.add_u32_field(field_name, u32_options); + schema_builder.add_u32_field(field_name, u32_options); } -fn ask_add_field(schema: &mut Schema) { +fn ask_add_field(schema_builder: &mut SchemaBuilder) { println!("\n\n"); let field_name = prompt_input("New field name ", field_name_validate); let text_or_integer = prompt_options("Text or unsigned 32-bit integer", vec!('T', 'I')); if text_or_integer =='T' { - ask_add_field_text(&field_name, schema); + ask_add_field_text(&field_name, schema_builder); } else { - ask_add_field_u32(&field_name, schema); + ask_add_field_u32(&field_name, schema_builder); } } fn run_new(directory: PathBuf) -> tantivy::Result<()> { println!("\n{} ", Style::new().bold().fg(Green).paint("Creating new index")); - println!("{} ", Style::new().bold().fg(Green).paint("Let's define its schema!")); - let mut schema = Schema::new(); + println!("{} ", Style::new().bold().fg(Green).paint("Let's define it's schema!")); + let mut schema_builder = SchemaBuilder::default(); loop { - ask_add_field(&mut schema); + ask_add_field(&mut schema_builder); if !prompt_yn("Add another field") { break; } } + let schema = schema_builder.build(); let schema_json = format!("{}", json::as_pretty_json(&schema)); println!("\n{}\n", Style::new().fg(Green).paint(schema_json)); - let mut index = try!(Index::create(&directory, schema)); - index.save_metas() + Index::create(&directory, schema)?; + Ok(()) } diff --git a/src/commands/search.rs b/src/commands/search.rs new file mode 100644 index 0000000..4085fcb --- /dev/null +++ b/src/commands/search.rs @@ -0,0 +1,52 @@ +use clap::ArgMatches; +use rustc_serialize::json::as_json; +use std::convert::From; +use std::path::Path; +use std::path::PathBuf; +use tantivy; +use tantivy::Index; +use tantivy::query::QueryParser; +use tantivy::schema::Field; +use tantivy::schema::FieldType; + +pub fn run_search_cli(matches: &ArgMatches) -> Result<(), String> { + let index_directory = PathBuf::from(matches.value_of("index").unwrap()); + let query = matches.value_of("query").unwrap(); + run_search(&index_directory, &query).map_err(|e| format!("{:?}", e)) +} + +fn run_search(directory: &Path, query: &str) -> tantivy::Result<()> { + let index = Index::open(directory)?; + let schema = index.schema(); + let default_fields: Vec = schema + .fields() + .iter() + .enumerate() + .filter( + |&(_, ref field_entry)| { + match *field_entry.field_type() { + FieldType::Str(ref text_field_options) => { + text_field_options.get_indexing_options().is_indexed() + }, + FieldType::U32(_) => false + } + } + ) + .map(|(i, _)| Field(i as u8)) + .collect(); + let query_parser = QueryParser::new(schema.clone(), default_fields); + let query = query_parser.parse_query(query)?; + let searcher = index.searcher(); + let weight = query.weight(&searcher)?; + let schema = index.schema(); + for segment_reader in searcher.segment_readers() { + let mut scorer = try!(weight.scorer(segment_reader)); + while scorer.advance() { + let doc_id = scorer.doc(); + let doc = segment_reader.doc(doc_id)?; + let named_doc = schema.to_named_doc(&doc); + println!("{}", as_json(&named_doc)); + } + } + Ok(()) +} diff --git a/src/commands/serve.rs b/src/commands/serve.rs index 921a3e0..a781684 100644 --- a/src/commands/serve.rs +++ b/src/commands/serve.rs @@ -4,14 +4,13 @@ /// and it takes the following query string argument /// /// - `q=` : your query -// - `nhits`: the number of hits that should be returned. (default to 10) -/// - `explain=` : if true returns some information about the score. +/// - `nhits`: the number of hits that should be returned. (default to 10) /// /// /// For instance, the following call should return the 20 most relevant /// hits for fulmicoton. /// -/// http://localhost:3000/api/?q=fulmicoton&explain=false&nhits=20 +/// http://localhost:3000/api/?q=fulmicoton&&nhits=20 /// @@ -35,10 +34,7 @@ use tantivy::collector::CountCollector; use tantivy::collector::TopCollector; use tantivy::Document; use tantivy::Index; -use tantivy::query::Explanation; -use tantivy::query::Query; use tantivy::query::QueryParser; -use tantivy::Result; use tantivy::schema::Field; use tantivy::schema::FieldType; use tantivy::schema::NamedFieldDocument; @@ -46,12 +42,12 @@ use tantivy::schema::Schema; use tantivy::TimerTree; use urlencoded::UrlEncodedQuery; -pub fn run_serve_cli(matches: &ArgMatches) -> tantivy::Result<()> { +pub fn run_serve_cli(matches: &ArgMatches) -> Result<(), String> { let index_directory = PathBuf::from(matches.value_of("index").unwrap()); let port = value_t!(matches, "port", u16).unwrap_or(3000u16); let host_str = matches.value_of("host").unwrap_or("localhost"); let host = format!("{}:{}", host_str, port); - run_serve(index_directory, &host) + run_serve(index_directory, &host).map_err(|e| format!("{:?}", e)) } @@ -66,7 +62,6 @@ struct Serp { #[derive(RustcEncodable)] struct Hit { doc: NamedFieldDocument, - explain: Option, } struct IndexServer { @@ -87,7 +82,9 @@ impl IndexServer { .filter( |&(_, ref field_entry)| { match *field_entry.field_type() { - FieldType::Str(_) => true, + FieldType::Str(ref text_field_options) => { + text_field_options.get_indexing_options().is_indexed() + }, FieldType::U32(_) => false } } @@ -102,24 +99,23 @@ impl IndexServer { } } - fn create_hit(&self, doc: &Document, explain: Option) -> Hit { + fn create_hit(&self, doc: &Document) -> Hit { Hit { - doc: self.schema.to_named_doc(&doc), - explain: explain, + doc: self.schema.to_named_doc(&doc) } } - fn search(&self, q: String, num_hits: usize, explain: bool) -> Result { - let query = self.query_parser.parse_query(&q).unwrap(); - let searcher = self.index.searcher().unwrap(); - let mut count_collector = CountCollector::new(); + fn search(&self, q: String, num_hits: usize) -> tantivy::Result { + let query = self.query_parser.parse_query(&q).expect("Parsing the query failed"); + let searcher = self.index.searcher(); + let mut count_collector = CountCollector::default(); let mut top_collector = TopCollector::with_limit(num_hits); - let mut timer_tree = TimerTree::new(); + let mut timer_tree = TimerTree::default(); { let _search_timer = timer_tree.open("search"); let mut chained_collector = collector::chain() - .add(&mut top_collector) - .add(&mut count_collector); + .push(&mut top_collector) + .push(&mut count_collector); try!(query.search(&searcher, &mut chained_collector)); } let hits: Vec = { @@ -128,14 +124,7 @@ impl IndexServer { .iter() .map(|doc_address| { let doc: Document = searcher.doc(doc_address).unwrap(); - let explanation; - if explain { - explanation = Some(query.explain(&searcher, doc_address).unwrap()); - } - else { - explanation = None; - } - self.create_hit(&doc, explanation) + self.create_hit(&doc) }) .collect() }; @@ -174,14 +163,10 @@ fn search(req: &mut Request) -> IronResult { .get("nhits") .and_then(|nhits_str| usize::from_str(&nhits_str[0]).ok()) .unwrap_or(10); - let explain: bool = qs_map - .get("explain") - .map(|s| &s[0] == &"true") - .unwrap_or(false); let query = try!(qs_map .get("q") .ok_or_else(|| IronError::new(StringError(String::from("Parameter q is missing from the query")), status::BadRequest)))[0].clone(); - let serp = index_server.search(query, num_hits, explain).unwrap(); + let serp = index_server.search(query, num_hits).unwrap(); let resp_json = as_pretty_json(&serp).indent(4); let content_type = "application/json".parse::().unwrap(); Ok(Response::with((content_type, status::Ok, format!("{}", resp_json)))) diff --git a/src/main.rs b/src/main.rs index 33cfd66..627629b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,14 +2,20 @@ extern crate clap; #[macro_use] extern crate rustc_serialize; +#[macro_use] +extern crate log; +extern crate env_logger; extern crate tantivy; extern crate time; extern crate persistent; extern crate urlencoded; extern crate iron; +extern crate chan; extern crate staticfile; extern crate ansi_term; extern crate mount; +extern crate bincode; +extern crate byteorder; use clap::{AppSettings, Arg, App, SubCommand}; mod commands; @@ -17,13 +23,16 @@ use self::commands::*; fn main() { + + env_logger::init().unwrap(); + let index_arg = Arg::with_name("index") .short("i") .long("index") .value_name("directory") .help("Tantivy index directory filepath") .required(true); - + let cli_options = App::new("Tantivy") .setting(AppSettings::SubcommandRequiredElseHelp) .version("0.1") @@ -33,7 +42,7 @@ fn main() { SubCommand::with_name("new") .about("Create a new index. The schema will be populated with a simple example schema") .arg(index_arg.clone()) - ) + ) .subcommand( SubCommand::with_name("serve") .about("Start a server") @@ -50,7 +59,7 @@ fn main() { .help("Port") .default_value("localhost") ) - ) + ) .subcommand( SubCommand::with_name("index") .about("Index files") @@ -65,7 +74,24 @@ fn main() { .long("num_threads") .value_name("num_threads") .help("Number of indexing threads. By default num cores - 1 will be used") - .default_value("0")) + .default_value("3")) + .arg(Arg::with_name("memory_size") + .short("m") + .long("memory_size") + .value_name("memory_size") + .help("Total memory_size in bytes. It will be split for the different threads.") + .default_value("1000000000")) + ) + .subcommand( + SubCommand::with_name("search") + .about("Search an index.") + .arg(index_arg.clone()) + .arg(Arg::with_name("query") + .short("q") + .long("query") + .value_name("query") + .help("Query") + .required(true)) ) .subcommand( SubCommand::with_name("bench") @@ -90,23 +116,17 @@ fn main() { .arg(index_arg.clone()) ) .get_matches(); - + let (subcommand, some_options) = cli_options.subcommand(); - let options = some_options.unwrap(); - - match subcommand { - "new" => run_new_cli(options).unwrap(), - "index" => run_index_cli(options).unwrap(), - "serve" => run_serve_cli(options).unwrap(), - "merge" => run_merge_cli(options).unwrap(), - "bench" => { - let res = run_bench_cli(options); - match res { - Err(e) => { println!("{}", e);} - _ => {} - } - }, - _ => {} - } + let run_cli = match subcommand { + "new" => run_new_cli, + "index" => run_index_cli, + "serve" => run_serve_cli, + "search" => run_search_cli, + "merge" => run_merge_cli, + "bench" => run_bench_cli, + _ => panic!("Subcommand {} is unknown", subcommand) + }; + run_cli(options).unwrap(); }