eyros (εύρος) est une base de données d'intervalles multidimensionnelle.
La base de données est basée sur des arbres bkd et d'intervalles.
eyros fonctionne sur des coordonnées scalaires (x) ou d'intervalle (min,max) pour chaque dimension. Il existe 2 opérations : l'écriture par lots (pour l'insertion et la suppression) et la requête par cadre de délimitation. Toutes les entités qui croisent le cadre de délimitation sont renvoyées dans les résultats de la requête.
Cet exemple insère 5 000 enregistrements, écrit les données sur le disque, puis interroge et imprime les enregistrements à l'intérieur du cadre de délimitation ((-120.0,20.0,10_000),(-100.0,35.0,20_000))
.
La boîte englobante est de la forme ((min_x,min_y,min_z),(max_x,max_y,max_z))
.
use eyros :: { Row , Coord } ;
use rand :: random ;
use async_std :: prelude :: * ;
type P = ( Coord < f32 > , Coord < f32 > , Coord < u16 > ) ;
type V = u64 ;
type E = Box < dyn std :: error :: Error + Sync + Send > ;
# [ async_std :: main ]
async fn main ( ) -> Result < ( ) , E > {
let mut db = eyros :: open_from_path3 (
& std :: path :: PathBuf :: from ( "/tmp/eyros.db" )
) . await ? ;
let batch : Vec < Row < P , V > > = ( 0 .. 5_000 ) . map ( |i| {
let xmin = ( random :: < f32 > ( ) * 2.0 - 1.0 ) * 180.0 ;
let xmax = xmin + random :: < f32 > ( ) . powf ( 16.0 ) * ( 180.0 -xmin ) ;
let ymin = ( random :: < f32 > ( ) * 2.0 - 1.0 ) * 90.0 ;
let ymax = ymin + random :: < f32 > ( ) . powf ( 16.0 ) * ( 90.0 -ymin ) ;
let z = random :: < u16 > ( ) ;
let point = (
Coord :: Interval ( xmin , xmax ) ,
Coord :: Interval ( ymin , ymax ) ,
Coord :: Scalar ( z )
) ;
Row :: Insert ( point , i )
} ) . collect ( ) ;
db . batch ( & batch ) . await ? ;
db . sync ( ) . await ? ;
let bbox = ( ( - 120.0 , 20.0 , 10_000 ) , ( - 100.0 , 35.0 , 20_000 ) ) ;
let mut stream = db . query ( & bbox ) . await ? ;
while let Some ( result ) = stream . next ( ) . await {
println ! ( "{:?}" , result? ) ;
}
Ok ( ( ) )
}
La sortie de ce programme est de la forme (coords, value)
:
$ cargo run --example polygons -q
(( Interval( - 100 . 94689 , - 100 . 94689 ) , Interval( 20 . 108843 , 20 . 109331 ) , Scalar( 16522 )) , 4580)
(( Interval( - 111 . 62768 , - 110 . 40406 ) , Interval( - 7 . 519809 , 86 . 154755 ) , Scalar( 12384 )) , 2603)
(( Interval( - 114 . 46505 , - 31 . 340988 ) , Interval( - 57 . 901405 , 20 . 235504 ) , Scalar( 11360 )) , 1245)
(( Interval( - 159 . 97859 , 121 . 304184 ) , Interval( 32 . 35743 , 32 . 35743 ) , Scalar( 10164 )) , 3294)
(( Interval( - 150 . 29192 , - 35 . 475517 ) , Interval( - 39 . 97779 , 29 . 163605 ) , Scalar( 15333 )) , 2336)
(( Interval( - 162 . 45879 , - 92 . 46166 ) , Interval( 31 . 187943 , 31 . 187975 ) , Scalar( 12221 )) , 2826)
(( Interval( - 160 . 53441 , - 88 . 66396 ) , Interval( 10 . 031784 , 21 . 852394 ) , Scalar( 11711 )) , 2366)
(( Interval( - 132 . 39021 , - 98 . 14838 ) , Interval( - 0 . 06010294 , 53 . 88453 ) , Scalar( 10685 )) , 3441)
licence zéro parité 7.0.0 et apache 2.0 (contributions)