Data

Data

7.2.2017 16:51

Библиотека com/teacode/data

Сформирована библиотека com/teacode/data, повторяющая функционал com/teacode/base на базах libretto/data. Основные методы библиотеки соответствуют libretto/data:

// допустимые типы ключей и значений объектов
struct Const = Int | Real | String | Unit

def dir(pathstring: String!) // получение хэндлера базы по пути к ней

def Data close() // закрытие базы, использовать не обязательно

def context

def c(data: Data!, #block) // установка базы по умолчанию

def currentData // 

def w(#block) // выполнение блока в транзакции в базе по умолчанию

def w(data, #block) // выполнение блока в транзакции в базе data

def r(#block) // readonly–выполнение блока в транзакции в базе по умолчанию

def r(data, #block) // readonly-выполнение блока в транзакции в базе data

def Map id // уникальный идентификатор объекта базы

def Map data // хэндлер базы, в которой хранится объект

def Map remove() // постоянное удаление объекта из базы

def root(data: Data!) // корневой объект базы data

def root // корневой элемент в базе по умолчанию

def new(data: Data!) // создание нового объекта в базе data

def new() // создание нового объекта в базе по-умолчанию

def Map to(key: Const!, value: Const*) // присваивание ключу значений

def Map keys // все ключи объекта

def Map `!`(ctx: Const!, key: Const!) // получение значений по ключу

def Map `=`(key: Const!, values: Const*) // присваивание значений ключу

def Map `+=`(key: Const!, vals: Const*) // добавка значения в ключ как последнего

def Map `.=`(key: Const!, vals: Const*) // добавка значения в ключ как первого

Дополнительные методы.

Метод создания нового мэпа по "примеру" существующего

def Map new()

Методы получения мэпа по ID:

def byid(data: Data!, id: Int!) // в базе с хэндлером data

def byid(id: Int!) // в базе по-умолчанию

Типизированные конвейерные методы получения значений ключей

// получение мэпов в качестве значений ключа
// работает на целочисленных значениях ключей, 
// интерпретируя их как идентификаторы объектов
def Map map(key:Const!):Map?   // один или ни одного объекта
def Map maps(key:Const!):Map*  // любое кол-во объектов
def Map mape(key:Const!):Map!  // ровно один объект
def Map mapp(key:Const!):Map+  // один или больше объектов

// получение строк в качестве значений ключа
def Map string(key:Const!):String?
def Map strings(key:Const!):String*
def Map stringe(key:Const!):String!
def Map stringp(key:Const!):String+

// получение целых в качестве значений ключа
def Map int(key:Const!):Int?
def Map ints(key:Const!):Int*
def Map inte(key:Const!):Int!
def Map intp(key:Const!):Int+

// получение вещественных в качестве значений ключа
def Map real(key:Const!):Real?
def Map reals(key:Const!):Real*
def Map reale(key:Const!):Real!
def Map realp(key:Const!):Real+

Конвейерный метод, берущий мэп по ключу, а при отсутствии, создающий его (get or create):

def Map gecr(key:Const!):Map!

Метод, очищающий все значения полей мэпа

def Map clear

Метод, выдающий все значения всех ключей мэпа

def Map values:Const*

Методы установки значений (конвейерные)

def Map set(key, value) // присвоить значения
def Map addf(key, value) // добавить значения в начало
def Map addl(key, value) // добавить значения в конец

Метод удаления значения из последовательности в ключе

def Map remove(key, value)

Методы, интерпретирующие мэп как множество (проверяет наличие элемента в множестве, удаляет элемент из множества, добавляет элемент в множество, изменяет состояние элемента в множестве на противоположное):

def Map sethas(el)
def Map setdel(el)
def Map setadd(el)
def Map settoggle(el)

Пример работы с базой.


use com/teacode/data
 
def dbase = data/dir("/Users/Andrei/Desktop/ournewbase")
 
def root = data/root(dbase)
 
def addperson(name:String!, address:String!) = {
 
  // транзакция
  data/w: { 
    root.addl("persons", data/new() {"name" to name; "address" to address})     
  }
}
 
def getpersons {
  root.maps("persons").println:($!"name", $!"address")
}
 
def main {
  
  addperson("Ann", "Paris")
  addperson("Mike", "London")
  addperson("John", "Toronto")
 
  // транзакция
  data/w: getpersons
 
}

Результат:

(Ann,Paris)
(Mike,London)
(John,Toronto)

(если до этого база была пустой или отсутствовала).