Refactor & Connect to mercator_db
* Refactor the code, Update to the Service API REST JSON objects on disk. * Connect to the DB data model and engine to execute queries. * Remove the syntactic sugar around implicit `inside` operation on shapes, as it introduces issues.
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -5,4 +5,7 @@
|
|||||||
.*
|
.*
|
||||||
*~
|
*~
|
||||||
|
|
||||||
|
1*k.*.json
|
||||||
|
test.*
|
||||||
|
|
||||||
!.gitignore
|
!.gitignore
|
||||||
|
|||||||
816
Cargo.lock
generated
816
Cargo.lock
generated
@@ -1,816 +0,0 @@
|
|||||||
[[package]]
|
|
||||||
name = "aho-corasick"
|
|
||||||
version = "0.6.10"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "aho-corasick"
|
|
||||||
version = "0.7.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "argon2rs"
|
|
||||||
version = "0.2.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "arrayvec"
|
|
||||||
version = "0.4.10"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ascii-canvas"
|
|
||||||
version = "2.0.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"term 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "atty"
|
|
||||||
version = "0.2.11"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "autocfg"
|
|
||||||
version = "0.1.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "backtrace"
|
|
||||||
version = "0.3.17"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "backtrace-sys"
|
|
||||||
version = "0.1.28"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bit-set"
|
|
||||||
version = "0.5.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bit-vec"
|
|
||||||
version = "0.5.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bitflags"
|
|
||||||
version = "1.0.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "blake2-rfc"
|
|
||||||
version = "0.2.18"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "block-buffer"
|
|
||||||
version = "0.7.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "block-padding"
|
|
||||||
version = "0.1.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "byte-tools"
|
|
||||||
version = "0.3.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "byteorder"
|
|
||||||
version = "1.3.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cc"
|
|
||||||
version = "1.0.37"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cfg-if"
|
|
||||||
version = "0.1.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cloudabi"
|
|
||||||
version = "0.0.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "constant_time_eq"
|
|
||||||
version = "0.1.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "diff"
|
|
||||||
version = "0.1.11"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "digest"
|
|
||||||
version = "0.8.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "dirs"
|
|
||||||
version = "1.0.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"redox_users 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "docopt"
|
|
||||||
version = "1.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"strsim 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "either"
|
|
||||||
version = "1.5.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ena"
|
|
||||||
version = "0.13.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "failure"
|
|
||||||
version = "0.1.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"backtrace 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "failure_derive"
|
|
||||||
version = "0.1.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "fake-simd"
|
|
||||||
version = "0.1.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "fixedbitset"
|
|
||||||
version = "0.1.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "fuchsia-cprng"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "generic-array"
|
|
||||||
version = "0.12.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "itertools"
|
|
||||||
version = "0.8.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "lalrpop"
|
|
||||||
version = "0.17.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"ascii-canvas 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"bit-set 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"diff 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"docopt 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"ena 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"lalrpop-util 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"term 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "lalrpop-util"
|
|
||||||
version = "0.17.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "lazy_static"
|
|
||||||
version = "1.3.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "libc"
|
|
||||||
version = "0.2.55"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "log"
|
|
||||||
version = "0.4.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "memchr"
|
|
||||||
version = "2.2.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "new_debug_unreachable"
|
|
||||||
version = "1.0.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "nodrop"
|
|
||||||
version = "0.1.13"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "numtoa"
|
|
||||||
version = "0.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "opaque-debug"
|
|
||||||
version = "0.2.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ordermap"
|
|
||||||
version = "0.3.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "parser"
|
|
||||||
version = "0.1.0"
|
|
||||||
dependencies = [
|
|
||||||
"lalrpop 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"lalrpop-util 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "petgraph"
|
|
||||||
version = "0.4.13"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"ordermap 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "phf_generator"
|
|
||||||
version = "0.7.24"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "phf_shared"
|
|
||||||
version = "0.7.24"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "precomputed-hash"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "proc-macro2"
|
|
||||||
version = "0.4.30"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "quote"
|
|
||||||
version = "0.6.12"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand"
|
|
||||||
version = "0.6.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_chacha"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_core"
|
|
||||||
version = "0.3.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_core"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_hc"
|
|
||||||
version = "0.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_isaac"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_jitter"
|
|
||||||
version = "0.1.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_os"
|
|
||||||
version = "0.1.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_pcg"
|
|
||||||
version = "0.1.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_xorshift"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rdrand"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "redox_syscall"
|
|
||||||
version = "0.1.54"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "redox_termios"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "redox_users"
|
|
||||||
version = "0.3.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "regex"
|
|
||||||
version = "0.2.11"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "regex"
|
|
||||||
version = "1.1.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "regex-syntax"
|
|
||||||
version = "0.5.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "regex-syntax"
|
|
||||||
version = "0.6.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rustc-demangle"
|
|
||||||
version = "0.1.14"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "scoped_threadpool"
|
|
||||||
version = "0.1.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "serde"
|
|
||||||
version = "1.0.91"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "serde_derive"
|
|
||||||
version = "1.0.91"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "sha2"
|
|
||||||
version = "0.8.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "siphasher"
|
|
||||||
version = "0.2.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "string_cache"
|
|
||||||
version = "0.7.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"new_debug_unreachable 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"string_cache_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "string_cache_codegen"
|
|
||||||
version = "0.4.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "string_cache_shared"
|
|
||||||
version = "0.3.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "strsim"
|
|
||||||
version = "0.9.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "syn"
|
|
||||||
version = "0.15.34"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "synstructure"
|
|
||||||
version = "0.10.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "term"
|
|
||||||
version = "0.5.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "termion"
|
|
||||||
version = "1.5.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "thread_local"
|
|
||||||
version = "0.3.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "typenum"
|
|
||||||
version = "1.10.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ucd-util"
|
|
||||||
version = "0.1.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicode-xid"
|
|
||||||
version = "0.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "utf8-ranges"
|
|
||||||
version = "1.0.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi"
|
|
||||||
version = "0.3.7"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi-i686-pc-windows-gnu"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi-x86_64-pc-windows-gnu"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[metadata]
|
|
||||||
"checksum aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5"
|
|
||||||
"checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c"
|
|
||||||
"checksum argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f67b0b6a86dae6e67ff4ca2b6201396074996379fba2b92ff649126f37cb392"
|
|
||||||
"checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71"
|
|
||||||
"checksum ascii-canvas 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8eb72df928aafb99fe5d37b383f2fe25bd2a765e3e5f7c365916b6f2463a29"
|
|
||||||
"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
|
|
||||||
"checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799"
|
|
||||||
"checksum backtrace 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "70af6de4789ac39587f100176ac7f704531e9e534b0f8676f658b3d909ce9a94"
|
|
||||||
"checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6"
|
|
||||||
"checksum bit-set 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e84c238982c4b1e1ee668d136c510c67a13465279c0cb367ea6baf6310620a80"
|
|
||||||
"checksum bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f59bbe95d4e52a6398ec21238d31577f2b28a9d86807f06ca59d191d8440d0bb"
|
|
||||||
"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
|
|
||||||
"checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400"
|
|
||||||
"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
|
|
||||||
"checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09"
|
|
||||||
"checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
|
|
||||||
"checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb"
|
|
||||||
"checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d"
|
|
||||||
"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33"
|
|
||||||
"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
|
|
||||||
"checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e"
|
|
||||||
"checksum diff 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "3c2b69f912779fbb121ceb775d74d51e915af17aaebc38d28a592843a2dd0a3a"
|
|
||||||
"checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c"
|
|
||||||
"checksum dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901"
|
|
||||||
"checksum docopt 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f525a586d310c87df72ebcd98009e57f1cc030c8c268305287a476beb653969"
|
|
||||||
"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b"
|
|
||||||
"checksum ena 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dc01d68e08ca384955a3aeba9217102ca1aa85b6e168639bf27739f1d749d87"
|
|
||||||
"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2"
|
|
||||||
"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1"
|
|
||||||
"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
|
|
||||||
"checksum fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33"
|
|
||||||
"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
|
|
||||||
"checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592"
|
|
||||||
"checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358"
|
|
||||||
"checksum lalrpop 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b7f2d14eb07d819e961e5169f61d67de76a7cdbc6778b62192bcfe27c5af019"
|
|
||||||
"checksum lalrpop-util 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9768f55211206d3c17181108d8facb80bdffc1f1e674a67b1dddb2743529ca19"
|
|
||||||
"checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14"
|
|
||||||
"checksum libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880"
|
|
||||||
"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6"
|
|
||||||
"checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39"
|
|
||||||
"checksum new_debug_unreachable 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f40f005c60db6e03bae699e414c58bf9aa7ea02a2d0b9bfbcf19286cc4c82b30"
|
|
||||||
"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945"
|
|
||||||
"checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef"
|
|
||||||
"checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409"
|
|
||||||
"checksum ordermap 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063"
|
|
||||||
"checksum petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f"
|
|
||||||
"checksum phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662"
|
|
||||||
"checksum phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0"
|
|
||||||
"checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
|
|
||||||
"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
|
|
||||||
"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db"
|
|
||||||
"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca"
|
|
||||||
"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef"
|
|
||||||
"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
|
|
||||||
"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0"
|
|
||||||
"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4"
|
|
||||||
"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08"
|
|
||||||
"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b"
|
|
||||||
"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
|
|
||||||
"checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44"
|
|
||||||
"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c"
|
|
||||||
"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
|
|
||||||
"checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252"
|
|
||||||
"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
|
|
||||||
"checksum redox_users 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe5204c3a17e97dde73f285d49be585df59ed84b50a872baf416e73b62c3828"
|
|
||||||
"checksum regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384"
|
|
||||||
"checksum regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58"
|
|
||||||
"checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7"
|
|
||||||
"checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96"
|
|
||||||
"checksum rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ccc78bfd5acd7bf3e89cffcf899e5cb1a52d6fafa8dec2739ad70c9577a57288"
|
|
||||||
"checksum scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8"
|
|
||||||
"checksum serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "a72e9b96fa45ce22a4bc23da3858dfccfd60acd28a25bcd328a98fdd6bea43fd"
|
|
||||||
"checksum serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "101b495b109a3e3ca8c4cbe44cf62391527cdfb6ba15821c5ce80bcd5ea23f9f"
|
|
||||||
"checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d"
|
|
||||||
"checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac"
|
|
||||||
"checksum string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25d70109977172b127fe834e5449e5ab1740b9ba49fa18a2020f509174f25423"
|
|
||||||
"checksum string_cache_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1eea1eee654ef80933142157fdad9dd8bc43cf7c74e999e369263496f04ff4da"
|
|
||||||
"checksum string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc"
|
|
||||||
"checksum strsim 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "032c03039aae92b350aad2e3779c352e104d919cb192ba2fabbd7b831ce4f0f6"
|
|
||||||
"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe"
|
|
||||||
"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f"
|
|
||||||
"checksum term 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "edd106a334b7657c10b7c540a0106114feadeb4dc314513e97df481d5d966f42"
|
|
||||||
"checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea"
|
|
||||||
"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
|
|
||||||
"checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169"
|
|
||||||
"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86"
|
|
||||||
"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
|
|
||||||
"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737"
|
|
||||||
"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770"
|
|
||||||
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
|
||||||
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
|
||||||
36
Cargo.toml
36
Cargo.toml
@@ -1,8 +1,23 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "parser"
|
name = "mercator_parser"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Lionel Sambuc <lionel.sambuc@gmail.com>"]
|
authors = ["EPFL-DIAS", "Lionel Sambuc <lionel.sambuc@epfl.ch>"]
|
||||||
|
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
|
description = "Query Parser for Mercator's own DSL."
|
||||||
|
#homepage = "https://crates.io/crates/mercator_parser"
|
||||||
|
repository = "https://github.com/epfl-dias/mercator_parser"
|
||||||
|
readme = "README.md"
|
||||||
|
|
||||||
|
keywords = []
|
||||||
|
categories = ["database-implementations", "parser-implementations"]
|
||||||
|
|
||||||
|
license = "MIT"
|
||||||
|
#license-file = "LICENSE"
|
||||||
|
|
||||||
|
include = ["Cargo.toml", "README.md", "LICENSE", "ACKNOWLEDGEMENTS", "src/**/*.rs"]
|
||||||
|
|
||||||
build = "build.rs" # LALRPOP preprocessing
|
build = "build.rs" # LALRPOP preprocessing
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
@@ -14,15 +29,18 @@ name = "parser-driver"
|
|||||||
path = "src/main.rs"
|
path = "src/main.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
lalrpop-util = "0.17.0"
|
mercator_db = "^0.1"
|
||||||
regex = "0.2.1"
|
|
||||||
measure_time = "0.6" # To mesure parsing time, only required by binary
|
lalrpop-util = "^0.17"
|
||||||
lazy_static = "1.3.0" # for space.rs, might be removed once the full data model is provided by the use of the crate
|
regex = "^1.2"
|
||||||
|
|
||||||
|
measure_time = "^0.6" # To mesure parsing time, only required by binary
|
||||||
|
|
||||||
# Logging macros API
|
# Logging macros API
|
||||||
log = { version = "0.4", features = ["max_level_trace", "release_max_level_debug"] }
|
log = { version = "^0.4", features = ["max_level_trace", "release_max_level_info"] }
|
||||||
pretty_env_logger = "0.3" # Logger implementation
|
#log = { version = "^0.4", features = ["max_level_trace", "release_max_level_trace"] }
|
||||||
|
pretty_env_logger = "^0.3" # Logger implementation
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
lalrpop = "0.17.0"
|
lalrpop = "^0.17.1"
|
||||||
|
|
||||||
|
|||||||
@@ -19,9 +19,6 @@ bag_expression
|
|||||||
// Spatial Operators
|
// Spatial Operators
|
||||||
| inside
|
| inside
|
||||||
| outside
|
| outside
|
||||||
// When used directly here, the inside() operation on the shape is
|
|
||||||
// implied.
|
|
||||||
| shapes
|
|
||||||
;
|
;
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
@@ -58,7 +55,6 @@ predicate
|
|||||||
| greater
|
| greater
|
||||||
| equal
|
| equal
|
||||||
| str_cmp
|
| str_cmp
|
||||||
| str_cmp_icase
|
|
||||||
| not
|
| not
|
||||||
| and
|
| and
|
||||||
| or
|
| or
|
||||||
|
|||||||
74
README.md
Normal file
74
README.md
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
# Mercator Parser
|
||||||
|
|
||||||
|
Query parser for Mercator.
|
||||||
|
|
||||||
|
## Mercator: Spatial Index
|
||||||
|
|
||||||
|
**Mercator** is a spatial *volumetric* index for the [Human Brain Project](http://www.humanbrainproject.eu). It is a component of the [Knowledge Graph](http://www.humanbrainproject.eu/en/explore-the-brain/search/) service, which provides the spatial anchoring for the metadata registered as well as processes the volumetric queries.
|
||||||
|
|
||||||
|
It is build on top of the Iron Sea database toolkit.
|
||||||
|
|
||||||
|
## Iron Sea: Database Toolkit
|
||||||
|
|
||||||
|
**Iron Sea** provides a set of database engine bricks, which can be combined and applied on arbitrary data structures.
|
||||||
|
|
||||||
|
Unlike a traditional database, it does not assume a specific physical structure for the tables nor the records, but relies on the developper to provide a set of extractor functions which are used by the specific indices provided.
|
||||||
|
|
||||||
|
This enables the index implementations to be agnostic from the underlying data structure, and re-used.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
### Software
|
||||||
|
|
||||||
|
* Rust: https://www.rust-lang.org
|
||||||
|
|
||||||
|
## Quick start
|
||||||
|
|
||||||
|
## Building from sources
|
||||||
|
|
||||||
|
To build this project, you will need to run the following:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo build --release
|
||||||
|
```
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
To install the software on the system you can use:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo install --release
|
||||||
|
```
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin vehicula pretium
|
||||||
|
quam sit amet facilisis. Class aptent taciti sociosqu ad litora torquent per
|
||||||
|
conubia nostra, per inceptos himenaeos. Curabitur metus sapien, rhoncus vitae
|
||||||
|
eleifend nec, convallis vel nunc. Nulla metus mauris, porta eu porta eu,
|
||||||
|
vulputate et est. Suspendisse lacinia leo vel auctor aliquet. Maecenas non arcu
|
||||||
|
libero. Nulla ut eleifend dui. Cras bibendum pharetra facilisis. Proin mattis
|
||||||
|
libero non pharetra tristique. Nam massa nulla, ultrices pharetra quam a,
|
||||||
|
fermentum placerat dolor. Nullam mollis libero et neque lobortis, id dignissim
|
||||||
|
lectus dignissim. Maecenas ligula enim, congue in ornare vel, volutpat ut ante.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo run --release
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
For more information, please refer to the [documentation](https://epfl-dias.github.io/mercator_parser/).
|
||||||
|
|
||||||
|
If you want to build the documentation and access it locally, you can use:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo doc --open
|
||||||
|
```
|
||||||
|
|
||||||
|
## Acknowledgements
|
||||||
|
|
||||||
|
This open source software code was developed in part or in whole in the
|
||||||
|
Human Brain Project, funded from the European Union’s Horizon 2020
|
||||||
|
Framework Programme for Research and Innovation under the Specific Grant
|
||||||
|
Agreement No. 785907 (Human Brain Project SGA2).
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
use crate::executors::ResultSet;
|
|
||||||
use crate::symbols::*;
|
|
||||||
|
|
||||||
//use ironsea_index::*;
|
|
||||||
|
|
||||||
pub fn get_all(_space_id: &String) -> ResultSet {
|
|
||||||
//space::get_all(space_id)
|
|
||||||
Err("not yet implemented".to_string())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_by_bounding_box(_space_id: &String, _bounding_box: &Vec<LiteralPosition>) -> ResultSet {
|
|
||||||
Err("not yet implemented".to_string())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_by_position(_space_id: &String, _position: &LiteralPosition) -> ResultSet {
|
|
||||||
Err("not yet implemented".to_string())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get(_point: &Object, _fields: &Vec<Field>) -> Result<LiteralPosition, String> {
|
|
||||||
Err("not yet implemented".to_string())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, Hash, Clone, Debug)]
|
|
||||||
pub struct Object {
|
|
||||||
id: u32,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Object {
|
|
||||||
pub fn length(&self) -> f64 {
|
|
||||||
0.0
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn eval(&self, _predicate: &Predicate) -> bool {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Position {
|
|
||||||
pub fn eval(&self, point: &Object) -> LiteralPosition {
|
|
||||||
match self {
|
|
||||||
Position::StrCmpICase(_selector, _string) => LiteralPosition(vec![]), //TODO
|
|
||||||
Position::StrCmp(_selector, _string) => LiteralPosition(vec![]), //TODO
|
|
||||||
Position::Selector(selector) => selector.eval(point),
|
|
||||||
Position::Literal(position) => position.clone(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl LiteralSelector {
|
|
||||||
pub fn eval(&self, point: &Object) -> LiteralPosition {
|
|
||||||
let LiteralSelector(fields) = self;
|
|
||||||
match get(point, fields) {
|
|
||||||
Err(_) => LiteralPosition(vec![]),
|
|
||||||
Ok(p @ LiteralPosition(_)) => p,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
use std::collections::HashMap;
|
|
||||||
|
|
||||||
use crate::types::LiteralTypes;
|
|
||||||
|
|
||||||
//FIXME: Improve, as this should not be static, but coming from DB.
|
|
||||||
lazy_static! {
|
|
||||||
static ref UNIVERSE: String = "Universe".to_string();
|
|
||||||
static ref SPACES: HashMap<&'static str, Space> = {
|
|
||||||
let mut m = HashMap::new();
|
|
||||||
m.insert(
|
|
||||||
"Universe",
|
|
||||||
Space {
|
|
||||||
space_type: LiteralTypes::Vector(vec![
|
|
||||||
LiteralTypes::Float,
|
|
||||||
LiteralTypes::Float,
|
|
||||||
LiteralTypes::Float,
|
|
||||||
]),
|
|
||||||
bounding_box: vec![
|
|
||||||
vec![0, 0, 0],
|
|
||||||
vec![
|
|
||||||
std::u32::MAX as i64,
|
|
||||||
std::u32::MAX as i64,
|
|
||||||
std::u32::MAX as i64,
|
|
||||||
],
|
|
||||||
],
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
m
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Space {
|
|
||||||
space_type: LiteralTypes,
|
|
||||||
bounding_box: Vec<Vec<i64>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Space {
|
|
||||||
pub fn max_volume(&self) -> f64 {
|
|
||||||
let mut volume = 1.0;
|
|
||||||
for max in &self.bounding_box[1] {
|
|
||||||
volume *= *max as f64;
|
|
||||||
}
|
|
||||||
|
|
||||||
volume
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn name() -> &'static String {
|
|
||||||
lazy_static! {
|
|
||||||
static ref UNIVERSE: String = "Universe".to_string();
|
|
||||||
};
|
|
||||||
|
|
||||||
&UNIVERSE
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn get_type(space_id: &String) -> &LiteralTypes {
|
|
||||||
lazy_static! {
|
|
||||||
static ref EMPTY_TYPE: LiteralTypes = LiteralTypes::Vector(Vec::new());
|
|
||||||
};
|
|
||||||
|
|
||||||
match SPACES.get(space_id.as_str()) {
|
|
||||||
None => &EMPTY_TYPE,
|
|
||||||
Some(space) => &space.space_type,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn bounding_box(space_id: &String) -> &Vec<Vec<i64>> {
|
|
||||||
lazy_static! {
|
|
||||||
static ref EMPTY_BOX: Vec<Vec<i64>> = Vec::new();
|
|
||||||
};
|
|
||||||
match SPACES.get(space_id.as_str()) {
|
|
||||||
None => &EMPTY_BOX,
|
|
||||||
Some(space) => &space.bounding_box,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn max_volume(space_id: &String) -> f64 {
|
|
||||||
match SPACES.get(space_id.as_str()) {
|
|
||||||
None => 0.0,
|
|
||||||
Some(space) => space.max_volume(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
17
src/evaluators.rs
Normal file
17
src/evaluators.rs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
use mercator_db::SpaceObject;
|
||||||
|
|
||||||
|
use super::expressions::*;
|
||||||
|
use super::symbols::*;
|
||||||
|
|
||||||
|
impl Evaluator for Predicate {
|
||||||
|
fn eval(&self, object: &SpaceObject) -> bool {
|
||||||
|
match self {
|
||||||
|
Predicate::Not(predicate) => !predicate.eval(object),
|
||||||
|
Predicate::And(lh, rh) => lh.eval(object) && rh.eval(object),
|
||||||
|
Predicate::Or(lh, rh) => lh.eval(object) || rh.eval(object),
|
||||||
|
Predicate::Less(selector, literal) => &selector.value(object) < literal,
|
||||||
|
Predicate::Greater(selector, literal) => &selector.value(object) > literal,
|
||||||
|
Predicate::Equal(selector, literal) => &selector.value(object) == literal,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
464
src/executors.rs
464
src/executors.rs
@@ -1,68 +1,61 @@
|
|||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
||||||
use super::database;
|
use mercator_db::space;
|
||||||
use super::expression::*;
|
use mercator_db::Core;
|
||||||
|
use mercator_db::DataBase;
|
||||||
|
use mercator_db::SpaceObject;
|
||||||
|
|
||||||
|
use super::expressions::*;
|
||||||
use super::symbols::*;
|
use super::symbols::*;
|
||||||
|
|
||||||
pub type ResultSet = Result<Vec<database::Object>, String>;
|
impl From<&LiteralPosition> for space::Position {
|
||||||
|
fn from(literal: &LiteralPosition) -> Self {
|
||||||
|
let v: Vec<f64> = literal.into();
|
||||||
|
v.into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Executor for Projection {
|
impl From<&LiteralNumber> for space::Coordinate {
|
||||||
type ResultSet = self::ResultSet;
|
fn from(literal: &LiteralNumber) -> Self {
|
||||||
|
match literal {
|
||||||
fn execute(&self) -> ResultSet {
|
LiteralNumber::Float(f) => (*f).into(),
|
||||||
match self {
|
LiteralNumber::Int(i) => (*i as u64).into(),
|
||||||
Projection::Nifti(_, _, _bag) => Err("not yet implemented".to_string()),
|
|
||||||
Projection::JSON(_, _format, bag) => bag.execute(), // FIXME: Add projections here
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Executor for Bag {
|
fn complement_helper(
|
||||||
type ResultSet = self::ResultSet;
|
db: &DataBase,
|
||||||
|
core: &Core,
|
||||||
fn execute(&self) -> ResultSet {
|
space_id: &str,
|
||||||
fn get_bounding_box(
|
inside: Vec<SpaceObject>,
|
||||||
position: &LiteralPosition,
|
output_space: Option<&str>,
|
||||||
radius: &LiteralNumber,
|
threshold: f64,
|
||||||
) -> Result<Vec<LiteralPosition>, String> {
|
) -> mercator_db::ResultSet {
|
||||||
let LiteralPosition(position) = position;
|
let (low, high) = db.space(space_id)?.bounding_box();
|
||||||
let mut low = vec![];
|
match core.get_by_shape(
|
||||||
let mut high = vec![];
|
db,
|
||||||
match radius {
|
&space::Shape::BoundingBox(low, high),
|
||||||
LiteralNumber::Int(r) => {
|
space_id,
|
||||||
for x in position {
|
output_space,
|
||||||
match x {
|
threshold,
|
||||||
LiteralNumber::Int(x) => {
|
) {
|
||||||
low.push(LiteralNumber::Int(x - r));
|
e @ Err(_) => e,
|
||||||
high.push(LiteralNumber::Int(x + r));
|
Ok(points) => Ok(points
|
||||||
}
|
.into_iter()
|
||||||
LiteralNumber::Float(x) => {
|
.filter(|o| !inside.contains(&o))
|
||||||
low.push(LiteralNumber::Float(x - (*r as f64)));
|
.collect::<Vec<_>>()),
|
||||||
high.push(LiteralNumber::Float(x + (*r as f64)));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
LiteralNumber::Float(r) => {
|
|
||||||
for x in position {
|
|
||||||
match x {
|
|
||||||
LiteralNumber::Int(_) => {
|
|
||||||
return Err(format!("The radius provided is a floating point value, which is incompatible with integer coordinates components: radius {:?}, coordinates {:?}", radius, position));
|
|
||||||
}
|
|
||||||
LiteralNumber::Float(x) => {
|
|
||||||
low.push(LiteralNumber::Float(x - r));
|
|
||||||
high.push(LiteralNumber::Float(x + r));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(vec![LiteralPosition(low), LiteralPosition(high)])
|
fn distinct(
|
||||||
};
|
db: &DataBase,
|
||||||
|
core_id: &str,
|
||||||
match self {
|
bag: &Bag,
|
||||||
Bag::Distinct(bag) => match bag.execute() {
|
output_space: Option<&str>,
|
||||||
|
threshold_volume: Option<f64>,
|
||||||
|
) -> mercator_db::ResultSet {
|
||||||
|
match bag.execute(db, core_id, output_space, threshold_volume) {
|
||||||
e @ Err(_) => e,
|
e @ Err(_) => e,
|
||||||
Ok(mut v) => {
|
Ok(mut v) => {
|
||||||
let set: HashSet<_> = v.drain(..).collect(); // dedup
|
let set: HashSet<_> = v.drain(..).collect(); // dedup
|
||||||
@@ -70,51 +63,67 @@ impl Executor for Bag {
|
|||||||
|
|
||||||
Ok(v)
|
Ok(v)
|
||||||
}
|
}
|
||||||
},
|
|
||||||
Bag::Filter(predicate, bag) => match predicate {
|
|
||||||
None => bag.execute(),
|
|
||||||
Some(predicate) => match bag.execute() {
|
|
||||||
e @ Err(_) => e,
|
|
||||||
Ok(source) => {
|
|
||||||
let mut filtered = Vec::new();
|
|
||||||
|
|
||||||
for point in source {
|
|
||||||
if point.eval(predicate) {
|
|
||||||
filtered.push(point);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(filtered)
|
fn filter(
|
||||||
}
|
db: &DataBase,
|
||||||
},
|
core_id: &str,
|
||||||
},
|
predicate: &Option<Predicate>,
|
||||||
Bag::Complement(bag) => match bag.execute() {
|
bag: &Bag,
|
||||||
// The complement of a set is computed within its definition space.
|
output_space: Option<&str>,
|
||||||
|
threshold_volume: Option<f64>,
|
||||||
|
) -> mercator_db::ResultSet {
|
||||||
|
match predicate {
|
||||||
|
None => bag.execute(db, core_id, output_space, threshold_volume),
|
||||||
|
Some(predicate) => match bag.execute(db, core_id, output_space, threshold_volume) {
|
||||||
e @ Err(_) => e,
|
e @ Err(_) => e,
|
||||||
Ok(inside) => {
|
Ok(results) => Ok(results
|
||||||
let mut outside = Vec::new();
|
.into_iter()
|
||||||
match database::get_all(bag.space()) {
|
.filter(|o| predicate.eval(&o))
|
||||||
e @ Err(_) => e,
|
.collect::<Vec<_>>()),
|
||||||
Ok(points) => {
|
},
|
||||||
for point in points {
|
|
||||||
if !inside.contains(&point) {
|
|
||||||
outside.push(point)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(outside)
|
fn complement(
|
||||||
|
db: &DataBase,
|
||||||
|
core_id: &str,
|
||||||
|
core: &Core,
|
||||||
|
bag: &Bag,
|
||||||
|
output_space: Option<&str>,
|
||||||
|
threshold: f64,
|
||||||
|
threshold_volume: Option<f64>,
|
||||||
|
) -> mercator_db::ResultSet {
|
||||||
|
match bag.execute(db, core_id, output_space, threshold_volume) {
|
||||||
|
// FIXME: The complement of a set is computed within its definition space.
|
||||||
|
e @ Err(_) => e,
|
||||||
|
Ok(inside) => complement_helper(
|
||||||
|
db,
|
||||||
|
core,
|
||||||
|
mercator_db::space::Space::universe().name(),
|
||||||
|
inside,
|
||||||
|
output_space,
|
||||||
|
threshold,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
},
|
fn intersection(
|
||||||
Bag::Intersection(lh, rh) => {
|
db: &DataBase,
|
||||||
let l = lh.execute();
|
core_id: &str,
|
||||||
|
rh: &Bag,
|
||||||
|
lh: &Bag,
|
||||||
|
output_space: Option<&str>,
|
||||||
|
threshold_volume: Option<f64>,
|
||||||
|
) -> mercator_db::ResultSet {
|
||||||
|
let l = lh.execute(db, core_id, output_space, threshold_volume);
|
||||||
if let Ok(l) = l {
|
if let Ok(l) = l {
|
||||||
let r = rh.execute();
|
let r = rh.execute(db, core_id, output_space, threshold_volume);
|
||||||
if let Ok(r) = r {
|
if let Ok(r) = r {
|
||||||
let mut v = vec![];
|
let mut v = vec![];
|
||||||
|
|
||||||
if rh.predict() < lh.predict() {
|
if rh.predict(db) < lh.predict(db) {
|
||||||
for o in r {
|
for o in r {
|
||||||
if l.contains(&o) {
|
if l.contains(&o) {
|
||||||
v.push(o);
|
v.push(o);
|
||||||
@@ -135,12 +144,20 @@ impl Executor for Bag {
|
|||||||
l
|
l
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Bag::Union(lh, rh) => {
|
|
||||||
let l = lh.execute();
|
fn union(
|
||||||
|
db: &DataBase,
|
||||||
|
core_id: &str,
|
||||||
|
rh: &Bag,
|
||||||
|
lh: &Bag,
|
||||||
|
output_space: Option<&str>,
|
||||||
|
threshold_volume: Option<f64>,
|
||||||
|
) -> mercator_db::ResultSet {
|
||||||
|
let l = lh.execute(db, core_id, output_space, threshold_volume);
|
||||||
if let Ok(mut l) = l {
|
if let Ok(mut l) = l {
|
||||||
let r = rh.execute();
|
let r = rh.execute(db, core_id, output_space, threshold_volume);
|
||||||
if let Ok(mut r) = r {
|
if let Ok(mut r) = r {
|
||||||
if rh.predict() < lh.predict() {
|
if rh.predict(db) < lh.predict(db) {
|
||||||
l.append(&mut r);
|
l.append(&mut r);
|
||||||
Ok(l)
|
Ok(l)
|
||||||
} else {
|
} else {
|
||||||
@@ -154,16 +171,22 @@ impl Executor for Bag {
|
|||||||
l
|
l
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Bag::Bag(bags) => {
|
|
||||||
|
fn bag(
|
||||||
|
db: &DataBase,
|
||||||
|
core_id: &str,
|
||||||
|
bags: &[Bag],
|
||||||
|
output_space: Option<&str>,
|
||||||
|
threshold_volume: Option<f64>,
|
||||||
|
) -> mercator_db::ResultSet {
|
||||||
let mut v = vec![];
|
let mut v = vec![];
|
||||||
for bag in bags {
|
for bag in bags {
|
||||||
let b = bag.execute();
|
let b = bag.execute(db, core_id, output_space, threshold_volume);
|
||||||
match b {
|
match b {
|
||||||
e @ Err(_) => {
|
e @ Err(_) => {
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
Ok(mut b) => {
|
Ok(mut b) => {
|
||||||
//TODO: SPACE CONVERSIONS IF NOT THE SAME SPACES?
|
|
||||||
v.append(&mut b);
|
v.append(&mut b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -171,59 +194,71 @@ impl Executor for Bag {
|
|||||||
|
|
||||||
Ok(v)
|
Ok(v)
|
||||||
}
|
}
|
||||||
Bag::Inside(shape) => match shape {
|
|
||||||
Shape::Point(space_id, position) => database::get_by_position(space_id, position),
|
fn inside(
|
||||||
|
db: &DataBase,
|
||||||
|
core: &Core,
|
||||||
|
shape: &Shape,
|
||||||
|
output_space: Option<&str>,
|
||||||
|
threshold: f64,
|
||||||
|
) -> mercator_db::ResultSet {
|
||||||
|
let parameters = match shape {
|
||||||
|
Shape::Point(space_id, position) => {
|
||||||
|
let space = db.space(space_id)?;
|
||||||
|
let position: Vec<f64> = position.into();
|
||||||
|
let position = space.encode(&position)?;
|
||||||
|
Ok((space_id, space::Shape::Point(position)))
|
||||||
|
}
|
||||||
Shape::HyperRectangle(space_id, bounding_box) => {
|
Shape::HyperRectangle(space_id, bounding_box) => {
|
||||||
database::get_by_bounding_box(space_id, bounding_box)
|
if bounding_box.len() != 2 {
|
||||||
|
Err("The number of position is different from 2, which is unsupported.".to_string())
|
||||||
|
} else {
|
||||||
|
let space = db.space(space_id)?;
|
||||||
|
let low: Vec<f64> = (&bounding_box[0]).into();
|
||||||
|
let high: Vec<f64> = (&bounding_box[1]).into();
|
||||||
|
let low = space.encode(&low)?;
|
||||||
|
let high = space.encode(&high)?;
|
||||||
|
|
||||||
|
Ok((space_id, space::Shape::BoundingBox(low, high)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Shape::HyperSphere(space_id, position, radius) => {
|
Shape::HyperSphere(space_id, position, radius) => {
|
||||||
let length = match radius {
|
let space = db.space(space_id)?;
|
||||||
LiteralNumber::Int(x) => *x as f64,
|
let position: Vec<f64> = position.into();
|
||||||
LiteralNumber::Float(x) => *x,
|
let position = space.encode(&position)?;
|
||||||
|
let mut r = vec![];
|
||||||
|
for _ in 0..position.dimensions() {
|
||||||
|
r.push(radius.into());
|
||||||
|
}
|
||||||
|
let radius = space.encode(&r)?[0];
|
||||||
|
|
||||||
|
//FIXME: RADIUS IS A LENGTH, HOW TO ENCODE IT INTO THE SPACE?
|
||||||
|
Ok((space_id, space::Shape::HyperSphere(position, radius)))
|
||||||
|
}
|
||||||
|
Shape::Nifti(_space_id) => Err("Inside-Nifti: not yet implemented".to_string()),
|
||||||
};
|
};
|
||||||
|
|
||||||
match get_bounding_box(position, radius) {
|
match parameters {
|
||||||
|
Ok((space_id, shape)) => core.get_by_shape(db, &shape, space_id, output_space, threshold),
|
||||||
Err(e) => Err(e),
|
Err(e) => Err(e),
|
||||||
Ok(inside) => match database::get_by_bounding_box(space_id, &inside) {
|
|
||||||
e @ Err(_) => e,
|
|
||||||
Ok(source) => {
|
|
||||||
let mut filtered = vec![];
|
|
||||||
|
|
||||||
for point in source {
|
|
||||||
// Include the surface of the sphere
|
|
||||||
if point.length() <= length {
|
|
||||||
filtered.push(point);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(filtered)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Shape::Nifti(_space_id) => Err("not yet implemented".to_string()),
|
|
||||||
},
|
|
||||||
Bag::Outside(shape) => {
|
|
||||||
fn outside_set(space_id: &String, inside: Vec<database::Object>) -> ResultSet {
|
|
||||||
let mut outside = Vec::new();
|
|
||||||
match database::get_all(space_id) {
|
|
||||||
e @ Err(_) => e,
|
|
||||||
Ok(points) => {
|
|
||||||
for point in points {
|
|
||||||
if !inside.contains(&point) {
|
|
||||||
outside.push(point)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(outside)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn outside(
|
||||||
|
db: &DataBase,
|
||||||
|
core: &Core,
|
||||||
|
shape: &Shape,
|
||||||
|
output_space: Option<&str>,
|
||||||
|
threshold: f64,
|
||||||
|
) -> mercator_db::ResultSet {
|
||||||
match shape {
|
match shape {
|
||||||
Shape::Point(space_id, position) => {
|
Shape::Point(space_id, position) => {
|
||||||
match database::get_by_position(space_id, position) {
|
let position: Vec<f64> = position.into();
|
||||||
|
match core.get_by_positions(db, &[position.into()], space_id, output_space, threshold) {
|
||||||
e @ Err(_) => e,
|
e @ Err(_) => e,
|
||||||
Ok(inside) => outside_set(space_id, inside),
|
Ok(inside) => {
|
||||||
|
complement_helper(db, core, space_id, inside, output_space, threshold)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Shape::HyperRectangle(space_id, bounding_box) => {
|
Shape::HyperRectangle(space_id, bounding_box) => {
|
||||||
@@ -233,82 +268,117 @@ impl Executor for Bag {
|
|||||||
// given box.
|
// given box.
|
||||||
|
|
||||||
// Smallest increment possible
|
// Smallest increment possible
|
||||||
let mut low: Vec<LiteralNumber> = vec![];
|
let mut increment = Vec::with_capacity(bounding_box[0].dimensions());
|
||||||
let LiteralPosition(coordinates) = &bounding_box[0];
|
for _ in 0..bounding_box[0].dimensions() {
|
||||||
for coordinate in coordinates {
|
increment.push(std::f64::EPSILON);
|
||||||
match coordinate {
|
|
||||||
LiteralNumber::Int(x) => low.push(LiteralNumber::Int(x + 1)),
|
|
||||||
LiteralNumber::Float(x) => {
|
|
||||||
low.push(LiteralNumber::Float(x + std::f64::EPSILON))
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
}
|
|
||||||
let low = LiteralPosition(low);
|
|
||||||
|
|
||||||
// Smallest decrement possible
|
// Add it to the lower bound
|
||||||
let mut high: Vec<LiteralNumber> = vec![];
|
let mut low: space::Position = (&bounding_box[0]).into();
|
||||||
let LiteralPosition(coordinates) = &bounding_box[1];
|
low += increment.clone().into();
|
||||||
for coordinate in coordinates {
|
|
||||||
match coordinate {
|
|
||||||
LiteralNumber::Int(x) => high.push(LiteralNumber::Int(x - 1)),
|
|
||||||
LiteralNumber::Float(x) => {
|
|
||||||
high.push(LiteralNumber::Float(x - std::f64::EPSILON))
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
let high = LiteralPosition(high);
|
|
||||||
|
|
||||||
match database::get_by_bounding_box(space_id, &vec![low, high]) {
|
// Substract it from the upper bound
|
||||||
|
let mut high: space::Position = (&bounding_box[1]).into();
|
||||||
|
high -= increment.into();
|
||||||
|
|
||||||
|
match core.get_by_shape(
|
||||||
|
db,
|
||||||
|
&space::Shape::BoundingBox(low, high),
|
||||||
|
space_id,
|
||||||
|
output_space,
|
||||||
|
threshold,
|
||||||
|
) {
|
||||||
e @ Err(_) => e,
|
e @ Err(_) => e,
|
||||||
Ok(inside) => outside_set(space_id, inside),
|
Ok(inside) => {
|
||||||
|
complement_helper(db, core, space_id, inside, output_space, threshold)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Shape::HyperSphere(space_id, position, radius) => {
|
}
|
||||||
let length = match radius {
|
Shape::HyperSphere(space_id, center, radius) => {
|
||||||
LiteralNumber::Int(x) => *x as f64,
|
// Smallest decrement possible, to exclude the surface
|
||||||
LiteralNumber::Float(x) => *x,
|
let mut radius: f64 = radius.into();
|
||||||
};
|
radius -= std::f64::EPSILON;
|
||||||
|
let center: space::Position = center.into();
|
||||||
|
|
||||||
match get_bounding_box(position, radius) {
|
match core.get_by_shape(
|
||||||
Err(e) => Err(e),
|
db,
|
||||||
Ok(inside) => match database::get_by_bounding_box(space_id, &inside) {
|
&space::Shape::HyperSphere(center, radius.into()),
|
||||||
Err(e) => Err(e),
|
space_id,
|
||||||
Ok(source) => {
|
output_space,
|
||||||
let mut filtered = vec![];
|
threshold,
|
||||||
|
) {
|
||||||
for point in source {
|
e @ Err(_) => e,
|
||||||
// Exclude the surface of the sphere, so
|
Ok(inside) => {
|
||||||
// that it is included in the
|
complement_helper(db, core, space_id, inside, output_space, threshold)
|
||||||
// complement.
|
}
|
||||||
if point.length() < length {
|
}
|
||||||
filtered.push(point);
|
}
|
||||||
|
Shape::Nifti(_space_id) => Err("Outside-nifti: not yet implemented".to_string()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
outside_set(space_id, filtered)
|
impl Executor for Projection {
|
||||||
}
|
type ResultSet = mercator_db::ResultSet;
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Shape::Nifti(_space_id) => Err("not yet implemented".to_string()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Predicate {
|
fn execute(
|
||||||
pub fn eval(&self, point: &database::Object) -> bool {
|
&self,
|
||||||
|
db: &DataBase,
|
||||||
|
core_id: &str,
|
||||||
|
output_space: Option<&str>,
|
||||||
|
threshold_volume: Option<f64>,
|
||||||
|
) -> Self::ResultSet {
|
||||||
match self {
|
match self {
|
||||||
Predicate::Not(predicate) => !predicate.eval(point),
|
Projection::Nifti(_, _, _bag) => Err("Proj-Nifti: not yet implemented".to_string()),
|
||||||
Predicate::And(lh, rh) => lh.eval(point) && rh.eval(point),
|
Projection::JSON(_, _format, bag) => {
|
||||||
Predicate::Or(lh, rh) => lh.eval(point) || rh.eval(point),
|
bag.execute(db, core_id, output_space, threshold_volume)
|
||||||
// I don't know how to evaluate these at this point, so let the DB object take care of that.
|
// FIXME: Add projections here
|
||||||
// Predicate::Less(selector, literal) => &selector.eval(point) < literal,
|
}
|
||||||
// Predicate::Greater(selector, literal) => &selector.eval(point) > literal,
|
}
|
||||||
// Predicate::Equal(selector, literal) => &selector.eval(point) == literal,
|
}
|
||||||
// Redirect to the DB Objet the evaluation of the remaining predicate operators
|
}
|
||||||
predicate => point.eval(predicate),
|
|
||||||
|
impl Executor for Bag {
|
||||||
|
type ResultSet = mercator_db::ResultSet;
|
||||||
|
|
||||||
|
fn execute(
|
||||||
|
&self,
|
||||||
|
db: &DataBase,
|
||||||
|
core_id: &str,
|
||||||
|
output_space: Option<&str>,
|
||||||
|
threshold_volume: Option<f64>,
|
||||||
|
) -> Self::ResultSet {
|
||||||
|
let threshold = match threshold_volume {
|
||||||
|
None => 0.0,
|
||||||
|
Some(v) => v,
|
||||||
|
};
|
||||||
|
let core = db.core(core_id)?;
|
||||||
|
|
||||||
|
match self {
|
||||||
|
Bag::Distinct(bag) => distinct(db, core_id, bag, output_space, threshold_volume),
|
||||||
|
Bag::Filter(predicate, bag) => {
|
||||||
|
filter(db, core_id, predicate, bag, output_space, threshold_volume)
|
||||||
|
}
|
||||||
|
Bag::Complement(bag) => complement(
|
||||||
|
db,
|
||||||
|
core_id,
|
||||||
|
core,
|
||||||
|
bag,
|
||||||
|
output_space,
|
||||||
|
threshold,
|
||||||
|
threshold_volume,
|
||||||
|
),
|
||||||
|
Bag::Intersection(lh, rh) => {
|
||||||
|
intersection(db, core_id, rh, lh, output_space, threshold_volume)
|
||||||
|
}
|
||||||
|
Bag::Union(lh, rh) => union(db, core_id, rh, lh, output_space, threshold_volume),
|
||||||
|
Bag::Bag(list) => bag(db, core_id, list, output_space, threshold_volume),
|
||||||
|
Bag::Inside(shape) => inside(db, core, shape, output_space, threshold),
|
||||||
|
Bag::Outside(shape) => {
|
||||||
|
//FIXME: This is currently computed as the complement of the values within the shape, except its surface.
|
||||||
|
// Should this be instead a list of positions within the shape?
|
||||||
|
//FIXME: Should we use the Shape's Space to get the maximum bounds or the output Space requested?
|
||||||
|
outside(db, core, shape, output_space, threshold)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
pub trait Validator {
|
|
||||||
type ValidationResult;
|
|
||||||
|
|
||||||
fn validate(&self) -> Self::ValidationResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait Predictor {
|
|
||||||
fn predict(&self) -> f64;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait Executor {
|
|
||||||
type ResultSet;
|
|
||||||
|
|
||||||
fn execute(&self) -> Self::ResultSet;
|
|
||||||
}
|
|
||||||
28
src/expressions.rs
Normal file
28
src/expressions.rs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
use mercator_db::DataBase;
|
||||||
|
use mercator_db::SpaceObject;
|
||||||
|
|
||||||
|
pub trait Validator {
|
||||||
|
type ValidationResult;
|
||||||
|
|
||||||
|
fn validate(&self) -> Self::ValidationResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait Predictor {
|
||||||
|
fn predict(&self, db: &DataBase) -> Result<f64, String>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait Executor {
|
||||||
|
type ResultSet;
|
||||||
|
|
||||||
|
fn execute(
|
||||||
|
&self,
|
||||||
|
db: &DataBase,
|
||||||
|
core_id: &str,
|
||||||
|
output_space: Option<&str>,
|
||||||
|
threshold_volume: Option<f64>,
|
||||||
|
) -> Self::ResultSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait Evaluator {
|
||||||
|
fn eval(&self, object: &SpaceObject) -> bool;
|
||||||
|
}
|
||||||
16
src/lib.rs
16
src/lib.rs
@@ -1,25 +1,23 @@
|
|||||||
#[macro_use]
|
|
||||||
extern crate lazy_static;
|
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate lalrpop_util;
|
extern crate lalrpop_util;
|
||||||
|
|
||||||
lalrpop_mod!(pub queries); // synthesized by LALRPOP
|
lalrpop_mod!(#[allow(clippy::all)] pub queries); // synthesized by LALRPOP
|
||||||
|
|
||||||
mod database;
|
mod evaluators;
|
||||||
mod executors;
|
mod executors;
|
||||||
mod expression;
|
mod expressions;
|
||||||
mod predictors;
|
mod predictors;
|
||||||
mod validators;
|
mod validators;
|
||||||
|
|
||||||
mod symbols;
|
mod symbols;
|
||||||
mod types;
|
mod types;
|
||||||
|
|
||||||
pub use expression::Executor;
|
pub use expressions::Executor;
|
||||||
pub use expression::Predictor;
|
pub use expressions::Predictor;
|
||||||
pub use expression::Validator;
|
pub use expressions::Validator;
|
||||||
pub use queries::FiltersParser;
|
pub use queries::FiltersParser;
|
||||||
pub use queries::QueryParser;
|
pub use queries::QueryParser;
|
||||||
|
pub use validators::ValidationResult;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests;
|
mod tests;
|
||||||
|
|||||||
95
src/main.rs
95
src/main.rs
@@ -1,12 +1,16 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate measure_time;
|
extern crate measure_time;
|
||||||
|
|
||||||
extern crate parser;
|
|
||||||
|
|
||||||
use parser::QueryParser;
|
|
||||||
use parser::{Executor, Predictor, Validator};
|
|
||||||
|
|
||||||
use std::io;
|
use std::io;
|
||||||
|
use std::process::exit;
|
||||||
|
|
||||||
|
use mercator_db::json::storage;
|
||||||
|
use mercator_db::DataBase;
|
||||||
|
use parser::Executor;
|
||||||
|
use parser::FiltersParser;
|
||||||
|
use parser::Predictor;
|
||||||
|
use parser::QueryParser;
|
||||||
|
use parser::Validator;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
// If RUST_LOG is unset, set it to INFO, otherwise keep it as-is.
|
// If RUST_LOG is unset, set it to INFO, otherwise keep it as-is.
|
||||||
@@ -15,8 +19,41 @@ fn main() {
|
|||||||
}
|
}
|
||||||
pretty_env_logger::init();
|
pretty_env_logger::init();
|
||||||
|
|
||||||
//let parser = queries::FiltersParser::new();
|
let import;
|
||||||
|
|
||||||
|
if std::env::var("MERCATOR_IMPORT_DATA").is_err() {
|
||||||
|
std::env::set_var("MERCATOR_IMPORT_DATA", "test");
|
||||||
|
}
|
||||||
|
|
||||||
|
match std::env::var("MERCATOR_IMPORT_DATA") {
|
||||||
|
Ok(val) => import = val,
|
||||||
|
Err(val) => {
|
||||||
|
error!("Could not fetch {} : `{}`", "MERCATOR_IMPORT_DATA", val);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Convert to binary the JSON data:
|
||||||
|
if true {
|
||||||
|
info_time!("Converting to binary JSON data");
|
||||||
|
storage::convert(&import);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build a Database Index:
|
||||||
|
if true {
|
||||||
|
info_time!("Building database index");
|
||||||
|
storage::build(&import);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load a Database:
|
||||||
|
let db;
|
||||||
|
{
|
||||||
|
info_time!("Loading database index");
|
||||||
|
db = DataBase::load(import).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
let parser = QueryParser::new();
|
let parser = QueryParser::new();
|
||||||
|
let parser = FiltersParser::new();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
println!();
|
println!();
|
||||||
@@ -27,49 +64,59 @@ fn main() {
|
|||||||
Ok(0) => break, // Catch ^D
|
Ok(0) => break, // Catch ^D
|
||||||
Ok(1) => continue, // Catch \n
|
Ok(1) => continue, // Catch \n
|
||||||
Err(_) => continue,
|
Err(_) => continue,
|
||||||
Ok(_) => (),
|
Ok(_) => {
|
||||||
}
|
|
||||||
|
|
||||||
if input.trim().eq_ignore_ascii_case("quit") {
|
if input.trim().eq_ignore_ascii_case("quit") {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
let input = input.as_str();
|
info_time!("Interpretation");
|
||||||
{
|
|
||||||
debug_time!("Interpretation");
|
|
||||||
let mut parse;
|
let mut parse;
|
||||||
{
|
{
|
||||||
trace_time!("Parsing");
|
info_time!("Parsing");
|
||||||
parse = parser.parse(input);
|
parse = parser.parse(&input);
|
||||||
}
|
}
|
||||||
trace!("Tree: \n{:?}", parse);
|
|
||||||
|
|
||||||
match parse {
|
if let Err(e) = &parse {
|
||||||
Ok(Some(t)) => {
|
warn!("Parsing failed: \n{:?}", e);
|
||||||
|
} else {
|
||||||
|
trace!("Tree: \n{:?}", parse);
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryParser
|
||||||
|
//if let Ok(Some(t)) = parse {
|
||||||
|
|
||||||
|
// FiltersParser
|
||||||
|
if let Ok(t) = parse {
|
||||||
let validate;
|
let validate;
|
||||||
{
|
{
|
||||||
trace_time!("Type check");
|
info_time!("Type check");
|
||||||
validate = t.validate();
|
validate = t.validate();
|
||||||
}
|
}
|
||||||
info!("Type: \n{:?}", validate);
|
info!("Type: \n{:?}", validate);
|
||||||
|
|
||||||
if let Ok(_) = validate {
|
if validate.is_ok() {
|
||||||
let predict;
|
let predict;
|
||||||
{
|
{
|
||||||
trace_time!("Prediction");
|
info_time!("Prediction");
|
||||||
predict = t.predict();
|
predict = t.predict(&db);
|
||||||
}
|
}
|
||||||
info!("Predict: \n{:?}", predict);
|
info!("Predict: \n{:?}", predict);
|
||||||
|
|
||||||
let execute;
|
let execute;
|
||||||
{
|
{
|
||||||
trace_time!("Exectution");
|
info_time!("Execution");
|
||||||
execute = t.execute();
|
execute = t.execute(&db, "test", None, None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Ok(r) = execute {
|
||||||
|
//let r = model::to_spatial_objects(&db, r);
|
||||||
|
info!("Execution: \n{:#?}", r);
|
||||||
|
info!("NB results: {:?}", r.len());
|
||||||
|
} else {
|
||||||
info!("Execution: \n{:?}", execute);
|
info!("Execution: \n{:?}", execute);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => (),
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,48 +1,48 @@
|
|||||||
use super::expression::Predictor;
|
use mercator_db::DataBase;
|
||||||
|
|
||||||
|
use super::expressions::Predictor;
|
||||||
use super::symbols::*;
|
use super::symbols::*;
|
||||||
|
|
||||||
use super::database::space;
|
|
||||||
|
|
||||||
impl Predictor for Projection {
|
impl Predictor for Projection {
|
||||||
fn predict(&self) -> f64 {
|
fn predict(&self, db: &DataBase) -> Result<f64, String> {
|
||||||
match self {
|
match self {
|
||||||
Projection::Nifti(_, _, bag) => bag.predict(),
|
Projection::Nifti(_, _, bag) => bag.predict(db),
|
||||||
Projection::JSON(_, _, bag) => bag.predict(),
|
Projection::JSON(_, _, bag) => bag.predict(db),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Predictor for Bag {
|
impl Predictor for Bag {
|
||||||
fn predict(&self) -> f64 {
|
fn predict(&self, db: &DataBase) -> Result<f64, String> {
|
||||||
match self {
|
match self {
|
||||||
Bag::Distinct(bag) => bag.predict(),
|
Bag::Distinct(bag) => bag.predict(db),
|
||||||
Bag::Filter(_, bag) => bag.predict(),
|
Bag::Filter(_, bag) => bag.predict(db),
|
||||||
Bag::Complement(bag) => space::max_volume(bag.space()) - bag.predict(),
|
Bag::Complement(bag) => Ok(db.space(bag.space())?.volume() - bag.predict(db)?),
|
||||||
Bag::Intersection(lh, rh) => {
|
Bag::Intersection(lh, rh) => {
|
||||||
let l = lh.predict();
|
let l = lh.predict(db)?;
|
||||||
let r = rh.predict();
|
let r = rh.predict(db)?;
|
||||||
if l < r {
|
if l < r {
|
||||||
l
|
Ok(l)
|
||||||
} else {
|
} else {
|
||||||
r
|
Ok(r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Bag::Union(lh, rh) => lh.predict() + rh.predict(),
|
Bag::Union(lh, rh) => Ok(lh.predict(db)? + rh.predict(db)?),
|
||||||
Bag::Bag(bags) => {
|
Bag::Bag(bags) => {
|
||||||
let mut s = 0.0;
|
let mut s = 0.0;
|
||||||
for bag in bags {
|
for bag in bags {
|
||||||
s += bag.predict();
|
s += bag.predict(db)?;
|
||||||
}
|
}
|
||||||
s
|
Ok(s)
|
||||||
}
|
}
|
||||||
Bag::Inside(shape) => shape.predict(),
|
Bag::Inside(shape) => shape.predict(db),
|
||||||
Bag::Outside(shape) => space::max_volume(shape.space()) - shape.predict(),
|
Bag::Outside(shape) => Ok(db.space(shape.space())?.volume() - shape.predict(db)?),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Predictor for Shape {
|
impl Predictor for Shape {
|
||||||
fn predict(&self) -> f64 {
|
fn predict(&self, _db: &DataBase) -> Result<f64, String> {
|
||||||
self.volume()
|
Ok(self.volume())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use mercator_db::space::Space;
|
||||||
|
|
||||||
use crate::symbols;
|
use crate::symbols;
|
||||||
use crate::database::space;
|
|
||||||
|
|
||||||
grammar;
|
grammar;
|
||||||
|
|
||||||
@@ -27,7 +28,7 @@ NiftiOperator: symbols::Projection = {
|
|||||||
")" => {
|
")" => {
|
||||||
let space_id = match rs {
|
let space_id = match rs {
|
||||||
Some(id) => id,
|
Some(id) => id,
|
||||||
None => space::name().clone(),
|
None => Space::universe().name().clone(),
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some((sel, _)) = s {
|
if let Some((sel, _)) = s {
|
||||||
@@ -47,7 +48,7 @@ JsonOperator: symbols::Projection = {
|
|||||||
")" => {
|
")" => {
|
||||||
let space_id = match rs {
|
let space_id = match rs {
|
||||||
Some(id) => id,
|
Some(id) => id,
|
||||||
None => space::name().clone(),
|
None => Space::universe().name().clone(),
|
||||||
};
|
};
|
||||||
|
|
||||||
symbols::Projection::JSON(space_id, f, b)
|
symbols::Projection::JSON(space_id, f, b)
|
||||||
@@ -148,9 +149,6 @@ Bags: symbols::Bag = {
|
|||||||
// Spatial Operators
|
// Spatial Operators
|
||||||
Inside,
|
Inside,
|
||||||
Outside,
|
Outside,
|
||||||
// When used directly here, the inside() operation on the shape is
|
|
||||||
// implied.
|
|
||||||
Shapes => symbols::Bag::Inside(<>)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//*********************************************************************/
|
//*********************************************************************/
|
||||||
@@ -186,26 +184,8 @@ Filter: symbols::Bag = {
|
|||||||
// "filter" "(" <p:Predicates> "," <b:Bags> ")" =>
|
// "filter" "(" <p:Predicates> "," <b:Bags> ")" =>
|
||||||
"filter" "(" <b:Bags> ")" =>
|
"filter" "(" <b:Bags> ")" =>
|
||||||
symbols::Bag::Filter(None, Box::new(b)),
|
symbols::Bag::Filter(None, Box::new(b)),
|
||||||
"filter" "(" <p:Predicates> <b:("," <Bags> )?> ")" => match b {
|
"filter" "(" <p:Predicates> <b:("," <Bags> )?> ")" =>
|
||||||
Some(b) => symbols::Bag::Filter(Some(p), Box::new(b)),
|
symbols::get_filter(p, b)
|
||||||
None => {
|
|
||||||
let v = space::bounding_box(space::name());
|
|
||||||
let mut positions = Vec::new();
|
|
||||||
for point in v {
|
|
||||||
let mut position = Vec::new();
|
|
||||||
for c in point {
|
|
||||||
position.push(symbols::LiteralNumber::Int(*c))
|
|
||||||
}
|
|
||||||
positions.push(symbols::LiteralPosition(position));
|
|
||||||
}
|
|
||||||
let bb = symbols::Shape::HyperRectangle(
|
|
||||||
space::name().clone(),
|
|
||||||
positions
|
|
||||||
);
|
|
||||||
|
|
||||||
symbols::Bag::Filter(Some(p), Box::new(symbols::Bag::Inside(bb)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Predicates: symbols::Predicate = {
|
Predicates: symbols::Predicate = {
|
||||||
@@ -311,7 +291,7 @@ HyperRectangle: symbols::Shape = {
|
|||||||
"}" => {
|
"}" => {
|
||||||
let space_id = match rs {
|
let space_id = match rs {
|
||||||
Some(id) => id,
|
Some(id) => id,
|
||||||
None => space::name().clone(),
|
None => Space::universe().name().clone(),
|
||||||
};
|
};
|
||||||
let mut pos = vec![l, h];
|
let mut pos = vec![l, h];
|
||||||
for (_, lh, _, rh) in list.iter() {
|
for (_, lh, _, rh) in list.iter() {
|
||||||
@@ -331,7 +311,7 @@ HyperSphere: symbols::Shape = {
|
|||||||
"}" => {
|
"}" => {
|
||||||
let space_id = match rs {
|
let space_id = match rs {
|
||||||
Some(id) => id,
|
Some(id) => id,
|
||||||
None => space::name().clone(),
|
None => Space::universe().name().clone(),
|
||||||
};
|
};
|
||||||
|
|
||||||
symbols::Shape::HyperSphere(space_id, c, r)
|
symbols::Shape::HyperSphere(space_id, c, r)
|
||||||
@@ -342,7 +322,7 @@ Point: symbols::Shape = {
|
|||||||
"point" "{" <pos:Position> <rs:( "," <String> )?> "}" => {
|
"point" "{" <pos:Position> <rs:( "," <String> )?> "}" => {
|
||||||
let space_id = match rs {
|
let space_id = match rs {
|
||||||
Some(id) => id,
|
Some(id) => id,
|
||||||
None => space::name().clone(),
|
None => Space::universe().name().clone(),
|
||||||
};
|
};
|
||||||
|
|
||||||
symbols::Shape::Point(space_id, pos)
|
symbols::Shape::Point(space_id, pos)
|
||||||
@@ -365,7 +345,7 @@ Nifti: symbols::Shape = {
|
|||||||
"}" => {
|
"}" => {
|
||||||
let space_id = match rs {
|
let space_id = match rs {
|
||||||
Some(id) => id,
|
Some(id) => id,
|
||||||
None => space::name().clone(),
|
None => Space::universe().name().clone(),
|
||||||
};
|
};
|
||||||
symbols::Shape::Nifti(space_id)
|
symbols::Shape::Nifti(space_id)
|
||||||
}
|
}
|
||||||
@@ -383,7 +363,6 @@ ByteProvider = { "uri" "(" String ")" };
|
|||||||
// Always returns a vector of numbers, a.k.a a position (a scalar will
|
// Always returns a vector of numbers, a.k.a a position (a scalar will
|
||||||
// be represented as a vector of one element)
|
// be represented as a vector of one element)
|
||||||
Positions: symbols::Position = {
|
Positions: symbols::Position = {
|
||||||
StrCmpICase,
|
|
||||||
StrCmp,
|
StrCmp,
|
||||||
Selector => symbols::Position::Selector(<>),
|
Selector => symbols::Position::Selector(<>),
|
||||||
Position => symbols::Position::Literal(<>)
|
Position => symbols::Position::Literal(<>)
|
||||||
@@ -399,13 +378,6 @@ StrCmp: symbols::Position = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Same, but case insensitive.
|
|
||||||
StrCmpICase: symbols::Position = {
|
|
||||||
"str_cmp_ignore_case" "(" <s:Selector> "," <v:String> ")" => {
|
|
||||||
symbols::Position::StrCmpICase(s, v)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// FIXME: FIELDS are expected to be exisiting in the data model. Root Object is assumed to be the type of the ressource on which the POST call was done.
|
// FIXME: FIELDS are expected to be exisiting in the data model. Root Object is assumed to be the type of the ressource on which the POST call was done.
|
||||||
Selector: symbols::LiteralSelector = {
|
Selector: symbols::LiteralSelector = {
|
||||||
( <Field> )+ => symbols::LiteralSelector(<>)
|
( <Field> )+ => symbols::LiteralSelector(<>)
|
||||||
|
|||||||
152
src/symbols.rs
152
src/symbols.rs
@@ -1,6 +1,8 @@
|
|||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
|
|
||||||
use super::database::space;
|
use mercator_db::space;
|
||||||
|
use mercator_db::SpaceObject;
|
||||||
|
|
||||||
pub use super::types::*;
|
pub use super::types::*;
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
@@ -63,6 +65,8 @@ pub enum Bag {
|
|||||||
Bag(Vec<Bag>),
|
Bag(Vec<Bag>),
|
||||||
Inside(Shape),
|
Inside(Shape),
|
||||||
Outside(Shape),
|
Outside(Shape),
|
||||||
|
//FIXME: ADD A SHAPE VARIANT WHICH JUST RETURNS ALL THE POSITIONS OF THAT SHAPE
|
||||||
|
//Shape(Shape),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Bag {
|
impl Bag {
|
||||||
@@ -84,7 +88,7 @@ impl Bag {
|
|||||||
Bag::Bag(_) => {
|
Bag::Bag(_) => {
|
||||||
// Bags can be defined in different spaces, thus the output is
|
// Bags can be defined in different spaces, thus the output is
|
||||||
// always in the universe space.
|
// always in the universe space.
|
||||||
space::name()
|
space::Space::universe().name()
|
||||||
}
|
}
|
||||||
Bag::Inside(shape) => shape.space(),
|
Bag::Inside(shape) => shape.space(),
|
||||||
Bag::Outside(shape) => shape.space(),
|
Bag::Outside(shape) => shape.space(),
|
||||||
@@ -163,12 +167,12 @@ impl Shape {
|
|||||||
|
|
||||||
volume
|
volume
|
||||||
}
|
}
|
||||||
Shape::HyperSphere(_space, pos, r) => {
|
Shape::HyperSphere(_space, pos, radius) => {
|
||||||
// Formula from https://en.wikipedia.org/wiki/N-sphere#/media/File:N_SpheresVolumeAndSurfaceArea.png
|
// Formula from https://en.wikipedia.org/wiki/N-sphere#/media/File:N_SpheresVolumeAndSurfaceArea.png
|
||||||
let LiteralPosition(p) = pos;
|
let LiteralPosition(position) = pos;
|
||||||
let k = p.len(); // Number of dimensions.
|
let k = position.len(); // Number of dimensions.
|
||||||
|
|
||||||
let r = match *r {
|
let radius = match *radius {
|
||||||
LiteralNumber::Int(x) => x as f64,
|
LiteralNumber::Int(x) => x as f64,
|
||||||
LiteralNumber::Float(x) => x,
|
LiteralNumber::Float(x) => x,
|
||||||
};
|
};
|
||||||
@@ -178,12 +182,12 @@ impl Shape {
|
|||||||
|
|
||||||
// Set starting values for the coefficient
|
// Set starting values for the coefficient
|
||||||
let mut a = 2.0;
|
let mut a = 2.0;
|
||||||
let mut i = 1;
|
let mut i = if (k % 2) == 0 {
|
||||||
|
|
||||||
if (k % 2) == 0 {
|
|
||||||
a = pi;
|
a = pi;
|
||||||
i = 2;
|
2
|
||||||
}
|
} else {
|
||||||
|
1
|
||||||
|
};
|
||||||
|
|
||||||
while i < k {
|
while i < k {
|
||||||
i += 2;
|
i += 2;
|
||||||
@@ -191,7 +195,7 @@ impl Shape {
|
|||||||
a /= i as f64;
|
a /= i as f64;
|
||||||
}
|
}
|
||||||
|
|
||||||
a * r.powi(i as i32)
|
a * radius.powi(i as i32)
|
||||||
}
|
}
|
||||||
Shape::Nifti(_) => unimplemented!(),
|
Shape::Nifti(_) => unimplemented!(),
|
||||||
}
|
}
|
||||||
@@ -203,12 +207,28 @@ impl Shape {
|
|||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum Position {
|
pub enum Position {
|
||||||
StrCmpICase(LiteralSelector, String),
|
|
||||||
StrCmp(LiteralSelector, String),
|
StrCmp(LiteralSelector, String),
|
||||||
Selector(LiteralSelector),
|
Selector(LiteralSelector),
|
||||||
Literal(LiteralPosition),
|
Literal(LiteralPosition),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Position {
|
||||||
|
pub fn value(&self, object: &SpaceObject) -> LiteralPosition {
|
||||||
|
match self {
|
||||||
|
Position::Literal(literal) => literal.clone(),
|
||||||
|
Position::Selector(selector) => selector.position(object),
|
||||||
|
Position::StrCmp(selector, literal) => {
|
||||||
|
let x = match (selector.str(object)).cmp(literal) {
|
||||||
|
Ordering::Equal => 0,
|
||||||
|
Ordering::Greater => 1,
|
||||||
|
Ordering::Less => -1,
|
||||||
|
};
|
||||||
|
LiteralPosition(vec![LiteralNumber::Int(x)])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
/* Literals / TOKENS */
|
/* Literals / TOKENS */
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
@@ -222,6 +242,17 @@ pub enum LiteralNumber {
|
|||||||
Float(f64),
|
Float(f64),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<&LiteralNumber> for Vec<f64> {
|
||||||
|
fn from(l: &LiteralNumber) -> Self {
|
||||||
|
let r = match l {
|
||||||
|
LiteralNumber::Int(x) => (*x) as f64,
|
||||||
|
LiteralNumber::Float(x) => *x,
|
||||||
|
};
|
||||||
|
|
||||||
|
vec![r]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl PartialEq for LiteralNumber {
|
impl PartialEq for LiteralNumber {
|
||||||
fn eq(&self, other: &LiteralNumber) -> bool {
|
fn eq(&self, other: &LiteralNumber) -> bool {
|
||||||
match self {
|
match self {
|
||||||
@@ -270,6 +301,36 @@ impl LiteralPosition {
|
|||||||
|
|
||||||
a
|
a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn dimensions(&self) -> usize {
|
||||||
|
self.0.len()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&LiteralNumber> for f64 {
|
||||||
|
fn from(l: &LiteralNumber) -> Self {
|
||||||
|
match l {
|
||||||
|
LiteralNumber::Int(x) => (*x) as f64,
|
||||||
|
LiteralNumber::Float(x) => *x,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&LiteralPosition> for Vec<f64> {
|
||||||
|
fn from(l: &LiteralPosition) -> Self {
|
||||||
|
let LiteralPosition(v) = l;
|
||||||
|
let mut r = Vec::with_capacity(v.len());
|
||||||
|
|
||||||
|
for x in v {
|
||||||
|
let x = match x {
|
||||||
|
LiteralNumber::Int(x) => (*x) as f64,
|
||||||
|
LiteralNumber::Float(x) => *x,
|
||||||
|
};
|
||||||
|
r.push(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
r
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PartialOrd for LiteralPosition {
|
impl PartialOrd for LiteralPosition {
|
||||||
@@ -316,4 +377,69 @@ impl LiteralSelector {
|
|||||||
// FIXME: Pretend for now that everything is a number, needs to be actually looked up in data model.
|
// FIXME: Pretend for now that everything is a number, needs to be actually looked up in data model.
|
||||||
LiteralTypes::Int
|
LiteralTypes::Int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: THIS IS SOOO WRONG
|
||||||
|
pub fn position(&self, object: &SpaceObject) -> LiteralPosition {
|
||||||
|
println!("LiteralSelector.position(): {:?}", self);
|
||||||
|
let v: Vec<f64> = object.position.clone().into();
|
||||||
|
|
||||||
|
LiteralPosition(v.into_iter().map(LiteralNumber::Float).collect::<Vec<_>>())
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: THIS IS SOOO WRONG
|
||||||
|
pub fn str(&self, object: &SpaceObject) -> String {
|
||||||
|
let LiteralSelector(v) = self;
|
||||||
|
let last = v.last();
|
||||||
|
if let Some(Field(name, _)) = last {
|
||||||
|
if name == "id" {
|
||||||
|
return object.value.id().clone();
|
||||||
|
} else if name == "type" {
|
||||||
|
return object.value.type_name();
|
||||||
|
} else if name == "reference_space" {
|
||||||
|
return object.space_id.clone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("LiteralSelector.str(): {:?}", self);
|
||||||
|
unimplemented!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The logic was getting a bit too complex to be embedded directly into the
|
||||||
|
// grammar definition.
|
||||||
|
pub fn get_filter(p: Predicate, b: Option<Bag>) -> Bag {
|
||||||
|
match b {
|
||||||
|
Some(b) => Bag::Filter(Some(p), Box::new(b)),
|
||||||
|
None => {
|
||||||
|
let (low, high) = space::Space::universe().bounding_box();
|
||||||
|
let low: Vec<_> = low.into();
|
||||||
|
let high: Vec<_> = high.into();
|
||||||
|
let bb = Shape::HyperRectangle(
|
||||||
|
space::Space::universe().name().clone(),
|
||||||
|
vec![
|
||||||
|
LiteralPosition(
|
||||||
|
low.into_iter()
|
||||||
|
.map(LiteralNumber::Float)
|
||||||
|
.collect::<Vec<_>>(),
|
||||||
|
),
|
||||||
|
LiteralPosition(
|
||||||
|
high.into_iter()
|
||||||
|
.map(LiteralNumber::Float)
|
||||||
|
.collect::<Vec<_>>(),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
Bag::Filter(Some(p), Box::new(Bag::Inside(bb)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//FIXME: HACK FOR NOW; NEED PROPER TYPE CHECKING!
|
||||||
|
pub fn get_type() -> LiteralTypes {
|
||||||
|
LiteralTypes::Vector(vec![
|
||||||
|
LiteralTypes::Float,
|
||||||
|
LiteralTypes::Float,
|
||||||
|
LiteralTypes::Float,
|
||||||
|
])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
use super::database::space;
|
use super::expressions::Validator;
|
||||||
use super::expression::Validator;
|
|
||||||
use super::symbols::*;
|
use super::symbols::*;
|
||||||
|
|
||||||
pub type ValidationResult = Result<LiteralTypes, String>;
|
pub type ValidationResult = Result<LiteralTypes, String>;
|
||||||
@@ -24,7 +23,7 @@ impl Validator for Bag {
|
|||||||
type ValidationResult = self::ValidationResult;
|
type ValidationResult = self::ValidationResult;
|
||||||
|
|
||||||
fn validate(&self) -> ValidationResult {
|
fn validate(&self) -> ValidationResult {
|
||||||
fn compare_bag_types(lh: &Box<Bag>, rh: &Box<Bag>) -> ValidationResult {
|
fn compare_bag_types(lh: &Bag, rh: &Bag) -> ValidationResult {
|
||||||
if lh.space().cmp(rh.space()) != std::cmp::Ordering::Equal {
|
if lh.space().cmp(rh.space()) != std::cmp::Ordering::Equal {
|
||||||
return Err(format!(
|
return Err(format!(
|
||||||
"left and right sets are defined in different reference spaces: '{}' vs '{}'.",
|
"left and right sets are defined in different reference spaces: '{}' vs '{}'.",
|
||||||
@@ -68,7 +67,7 @@ impl Validator for Bag {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(space::get_type(space::name()).clone())
|
Ok(get_type())
|
||||||
}
|
}
|
||||||
Bag::Inside(shape) => shape.validate(),
|
Bag::Inside(shape) => shape.validate(),
|
||||||
Bag::Outside(shape) => shape.validate(),
|
Bag::Outside(shape) => shape.validate(),
|
||||||
|
|||||||
Reference in New Issue
Block a user