8e6f37e709
* Part 1 - Create as_edn_value function. * Do not include defaults inside output. * Pretty-printed by default. Do we want to make that a flag? * Includes simple test just to make sure it works. * Part 2 - only include ident if available. * Part 3 - Remove spacing and newlines as unnecessary. * Update function to build edn::Value directly rather than parsing from string * Update test to actually test the functionality. * Address review comments ncalexan. * Rename `as_edn_value` to `to_edn_value`. * Move `db/src/values.rs` to `core/src/values.rs` so we can reference inside `core/src/ib.rs`. * Add `lazy-static` crate to core `Cargo.toml` * Expose `values` as a public module from `core`. * Update references to values in `db/src/bootstrap.rs` & `db/src/lib.rs`. * Add new static vars for `DB_FULLTEXT`, `DB_INDEX` & `DB_IS_COMPONENT`. * Use static vars exposed in `values` inside `to_edn_value`. * Remove `db/id` as key in attribute output and use `entid` as `db/ident` if no `ident` is found for that `entid`. * Update test to match new expected output. * Add doc comment for function * Address review comments ncalexan. * Update function docstring to give clearer description of function. * Do not all entid at all to output. * Clean up code fetching ident (make it rustier). * Address review comments rnewman. * Extract out to new `to_edn_value` functions code for creating `edn::Value`\'s for `ValueType` and `Attribute`. * Use `map()` to create schema edn value rather than a loop. * Address review comments rnewman. * pass cloned instance of ident to `Attribute::get_edn_value`. * update `use` import for `edn`. * remove unnecessary call when using ident as key on `associate_ident`. * Fixed bug whereby we didn't differentiate between `db.index/value` and `db.index/identity` when generating `edn::Value` * Add extra assert at the end to ensure we get the same output when we convert the same schema to edn multiple times * Move check for type of uniqueness to `match` statement. * Also use `iter` instead of `into_iter` when iterating schema map.
98 lines
2.9 KiB
Rust
98 lines
2.9 KiB
Rust
// Copyright 2016 Mozilla
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
|
// this file except in compliance with the License. You may obtain a copy of the
|
|
// License at http://www.apache.org/licenses/LICENSE-2.0
|
|
// Unless required by applicable law or agreed to in writing, software distributed
|
|
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
|
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
|
// specific language governing permissions and limitations under the License.
|
|
|
|
#[macro_use]
|
|
extern crate error_chain;
|
|
extern crate itertools;
|
|
#[macro_use]
|
|
extern crate lazy_static;
|
|
extern crate rusqlite;
|
|
extern crate time;
|
|
|
|
extern crate tabwriter;
|
|
|
|
#[macro_use]
|
|
extern crate edn;
|
|
extern crate mentat_core;
|
|
extern crate mentat_tx;
|
|
extern crate mentat_tx_parser;
|
|
|
|
use itertools::Itertools;
|
|
use std::iter::repeat;
|
|
pub use errors::{Error, ErrorKind, ResultExt, Result};
|
|
|
|
pub mod db;
|
|
mod bootstrap;
|
|
pub mod debug;
|
|
mod add_retract_alter_set;
|
|
mod entids;
|
|
pub mod errors;
|
|
mod metadata;
|
|
mod schema;
|
|
mod types;
|
|
mod internal_types;
|
|
mod upsert_resolution;
|
|
mod tx;
|
|
|
|
pub use db::{
|
|
TypedSQLValue,
|
|
new_connection,
|
|
};
|
|
|
|
pub use tx::transact;
|
|
pub use types::{
|
|
DB,
|
|
PartitionMap,
|
|
TxReport,
|
|
};
|
|
|
|
use edn::symbols;
|
|
|
|
pub fn to_namespaced_keyword(s: &str) -> Result<symbols::NamespacedKeyword> {
|
|
let splits = [':', '/'];
|
|
let mut i = s.split(&splits[..]);
|
|
let nsk = match (i.next(), i.next(), i.next(), i.next()) {
|
|
(Some(""), Some(namespace), Some(name), None) => Some(symbols::NamespacedKeyword::new(namespace, name)),
|
|
_ => None,
|
|
};
|
|
|
|
// TODO Use custom ErrorKind https://github.com/brson/error-chain/issues/117
|
|
nsk.ok_or(ErrorKind::NotYetImplemented(format!("InvalidNamespacedKeyword: {}", s)).into())
|
|
}
|
|
|
|
/// Prepare an SQL `VALUES` block, like (?, ?, ?), (?, ?, ?).
|
|
///
|
|
/// The number of values per tuple determines `(?, ?, ?)`. The number of tuples determines `(...), (...)`.
|
|
///
|
|
/// # Examples
|
|
///
|
|
/// ```rust
|
|
/// # use mentat_db::{repeat_values};
|
|
/// assert_eq!(repeat_values(1, 3), "(?), (?), (?)".to_string());
|
|
/// assert_eq!(repeat_values(3, 1), "(?, ?, ?)".to_string());
|
|
/// assert_eq!(repeat_values(2, 2), "(?, ?), (?, ?)".to_string());
|
|
/// ```
|
|
pub fn repeat_values(values_per_tuple: usize, tuples: usize) -> String {
|
|
assert!(values_per_tuple >= 1);
|
|
assert!(tuples >= 1);
|
|
// Like "(?, ?, ?)".
|
|
let inner = format!("({})", repeat("?").take(values_per_tuple).join(", "));
|
|
// Like "(?, ?, ?), (?, ?, ?)".
|
|
let values: String = repeat(inner).take(tuples).join(", ");
|
|
values
|
|
}
|
|
|
|
/// Return the current time in milliseconds after the Unix epoch according to the local clock.
|
|
///
|
|
/// Compare `Date.now()` in JavaScript, `System.currentTimeMillis` in Java.
|
|
pub fn now() -> i64 {
|
|
let now = time::get_time();
|
|
(now.sec as i64 * 1_000) + (now.nsec as i64 / (1_000_000))
|
|
}
|