Набор данных. Types/source:DataSet
Набор данных — это комплексный объект, содержащий рекордсеты, рекорды и скалярные значения.
Набор данных возвращают методы call() и query() источников данных. Это используется для решения следующих задач:
- возможность рассмотреть любой тип результата, возвращаемого произвольным методом;
- оптимизация количества запросов: вместо вызова нескольких методов можно вызвать один, который умеет возвращать сразу несколько результатов.
Возможности
- получение рекордсета/рекорда/скаляра, ассоциированного с именем свойства;
- использование сырых данных в разных форматах;
- внедрение собственных конструкторов рекордов и рекордсетов.
Важно
По умолчанию используется адаптер для данных в формате JSON. Если вы используете данные в каком-либо другом формате (СБИС-JSON, XML), то нужно подключить соответствующий адаптер.
Примеры
Создадим комплексный набор в формате JSON из двух выборок "Заказы" и "Покупатели", одной записи "Итого" и даты выполнения запроса:
import { DataSet } from 'Types/source';
const data = new DataSet({
rawData: {
orders: [
{id: 1, buyer_id: 1, date: '2016-06-02 14:12:45', amount: 96},
{id: 2, buyer_id: 2, date: '2016-06-02 17:01:12', amount: 174},
{id: 3, buyer_id: 1, date: '2016-06-03 10:24:28', amount: 475}
],
buyers: [
{id: 1, email: 'tony@stark-industries.com', phone: '555-111-222'},
{id: 2, email: 'steve-rogers@avengers.us', phone: '555-222-333'}
],
total: {
date_from: '2016-06-01 00:00:00',
date_to: '2016-07-01 00:00:00',
amount: 745,
deals: 3,
completed: 2,
paid: 2,
awaited: 1,
rejected: 0
},
executeDate: '2016-06-27 11:34:57'
},
keyProperty: 'id'
});
const orders = data.getAll('orders');
// 3
orders.getCount();
// 96
orders.at(0).get('amount');
const buyers = data.getAll('buyers');
// 2
buyers.getCount();
// 'tony@stark-industries.com'
buyers.at(0).get('email');
const total = data.getRow('total');
// 745
total.get('amount');
// '2016-06-27 11:34:57'
const executeDate = data.getScalar('executeDate');
Тот же самый набор данных ("Заказы" и "Покупатели", "Итого", дата выполнения запроса) можно представить в виде XML:
<?xml version="1.0"?>
<response>
<orders>
<order>
<id>1</id>
<buyer_id>1</buyer_id>
<date>2016-06-02 14:12:45</date>
<amount>96</amount>
</order>
<order>
<id>2</id>
<buyer_id>2</buyer_id>
<date>2016-06-02 17:01:12</date>
<amount>174</amount>
</order>
<order>
<id>3</id>
<buyer_id>1</buyer_id>
<date>2016-06-03 10:24:28</date>
<amount>475</amount>
</order>
</orders>
<buyers>
<buyer>
<id>1</id>
<email>tony@stark-industries.com</email>
<phone>555-111-222</phone>
</buyer>
<buyer>
<id>2</id>
<email>steve-rogers@avengers.us</email>
<phone>555-222-333</phone>
</buyer>
</buyers>
<total>
<date_from>2016-06-01 00:00:00</date_from>
<date_to>2016-07-01 00:00:00</date_to>
<amount>475</amount>
<deals>3</deals>
<completed>2</completed>
<paid>2</paid>
<awaited>1</awaited>
<rejected>0</rejected>
</total>
<executeDate>2016-06-27 11:34:57</executeDate>
</response>
И работать с XML, подключив соответствующий адаптер:
import { DataSet } from 'Types/source';
const data = new DataSet({
rawData: '<?xml version="1.0"?>...',
adapter: new XmlAdapter(),
keyProperty: 'id'
});
// XPath syntax
const orders = data.getAll('orders/order');
// 3
orders.getCount();
// 96
orders.at(0).get('amount');
// XPath syntax
const buyers = data.getAll('buyers/buyer');
// 2
buyers.getCount();
// 'tony@stark-industries.com'
buyers.at(0).get('email');
const total = data.getRow('total');
// 745
total.get('amount');
// '2016-06-27 11:34:57'
const executeDate = data.getScalar('executeDate');
Создадим комплексный набор в формате СБИС-JSON, состоящий из рекордсета:
import { DataSet } from 'Types/source';
import { adapter } from 'Types/entity';
const data = new DataSet({
adapter: new adapter.Sbis(),
rawData: {
_type: 'recordset',
d: [
[1, 'Иванов'],
[2, 'Петров'],
[3, 'Сидоров']
],
s: [
{n: 'Ид', t: 'Число целое'},
{n: 'Фамилия', t: 'Строка'}
]
},
keyProperty: 'Ид'
});
const users = data.getAll();
// 3
users.getCount();
// 'Иванов'
orders.at(0).get('Фамилия');
Создадим комплексный набор в формате СБИС-JSON, состоящий из рекорда:
import { DataSet } from 'Types/source';
import { adapter } from 'Types/entity';
const data = new DataSet({
adapter: new adapter.Sbis(),
rawData: {
_type: 'record',
d: [1, 'Иванов'],
s: [
{n: 'Ид', t: 'Число целое'},
{n: 'Фамилия', t: 'Строка'}
]
},
keyProperty: 'Ид'
});
const user = data.getRow();
// 'Иванов'
orders.get('Фамилия');