Кастомные дэши. Работа с несколькими кубами

Возможно ли использовать в одном кастомном дэше данных из нескольких кубов?
Например, в одном дэше будет одновременно несколько визуализаций?
Как я понимаю, это возможно только через АПИ (через bixel нельзя).
Так же прошу пояснить реализацию на примере.

Здравствуйте, да, можно и с bixel, но тогда сами запросы вы делаете внутри дешлета.
Можно даже не прописывать это в конфиге в стандартном разделе dataSource, ибо как раз стандартное поведение вам не подойдет. Можете хранить идентификаторы кубов в конфиге дешлета, но в иных, вами придуманных ключах, которые вы потом будете читать внутри вашего кастомного дешлета.
Тогда вы можете использовать в качестве стартовой точки обработчик

bixel.on(‘no-data’, function(axes) {
//…тут вызов функции загрузки информации из кубов
})

Вам понадобятся следующие функции для получения информации о кубе и из куба:

// Загружает объект куба с информацией о дименшнах, межах и их конфигурациях

function loadKoob(koobId: string) {
return fetch(/api/v3/koob/${koobId}).then(response => response.json());
}

// функция для получения данных из куба

function loadKoobData(koobId: string, columns: string, filters: any) {
const headers = {
“accept”: “application/json, text/javascript, /; q=0.01”,
“accept-language”: “en-US,en;q=0.9,ru;q=0.8”,
“cache-control”: “no-cache”,
“content-type”: “application/json”,
“pragma”: “no-cache”,
“x-requested-with”: “XMLHttpRequest”
};

const body = {
columns,
filters,
with: koobId
};

return fetch(/api/v3/koob/data, {
credentials: ‘include’,
headers: headers,
body: JSON.stringify(body),
method: ‘POST’,
‘mode’: ‘cors’
}).then(function (res) {
if (!res.ok) {
res.text().then(function(v) {error(v)});
throw new Error(‘Not ok’);
}
return res.json();
});
}

koob - название идентификатора куба
columns - массив строковых значений (идентификаторы дименшнов, меж или конструкции для меж типа “sum(value)”)
filters - объект (или массив строк) аналогичный тому, что можно прописать в конфигурации дешлета с указанием фильтров на дименшн
типа age: [“=”, 23, 45, 99]

P.S. Помимо with, columns, filters в запросе body можно отправить offset, limit, sort,distinct = что будет означать соответственно отступ от начала таблицы (число), ограничения по запросу (число), сортировка (массив строк)

Добрый день, Илья.
Сделал дэш на базе примера.
Загрузка куба прошла успешно.
Но загрузка данных не идет. 406 код ошибки.
Возможно что-то не то с параметрами. Посмотрите пожалуйста.

ниже код страницы
bixel.init({
zsCount: 1,
}).then(function (dashlet_) {
dashlet = dashlet_;
//config = dashlet_.config || {};
});

test_api();

var collumns_arr = ['a', 'c'];
var filter_arr = [];
var koobId = "xls_krs_6.xdds_t58";
loadKoobData(koobId, collumns_arr, filter_arr);

function test_api(){
	fetch('/api/v3/koob/xls_krs_6.xdds_t58')  
		.then(  
			function(response) {  
				if (response.status !== 200) {  
					console.log('Looks like there was a problem. Status Code: ' +  response.status);  
					return;  
				}

				// Examine the text in the response  
				response.json().then(function(data) {  
					console.log(data);  
				});  
			}  
		) 
}

function loadKoobData(koobId, columns, filters) {
	const headers = {
		'accept': 'application/json, text/javascript, /; q=0.01',
		'accept-language': 'en-US,en;q=0.9,ru;q=0.8',
		'cache-control': 'no-cache',
		'content-type': 'application/json',
		'pragma': 'no-cache',
		'x-requested-with': 'XMLHttpRequest'
	};

	const body = {
		columns,
		filters,
		with: koobId
	};

	return fetch('/api/v3/koob/data', {
			credentials: 'include',
			headers: headers,
			body: JSON.stringify(body),
			method: 'POST',
			mode: 'cors'
			})
				.then(function (res) {
					if (!res.ok) {
						res.text().then(function(v) {error(v)});
						throw new Error('Not ok');
					}
					return res.json();
				});
}

Здравствуйте! Попробуйте указать заголовок Accept виде “application/stream+json” вместо ‘application/json, text/javascript, /; q=0.01’. Я мог случайно указать не тот заголовок, когда прилагал код функции

Добрый день Илья. Попробовал.
теперь выходит код ошибки 500.

И еще прошу напить какие параметры в целом принимает body в запросе к АПИ “/api/v3/koob/data”
Так же не ясно, как в данном запросе передается идентификатор куба.
В первом запросе понятно. Идентификатор передается в теле запроса. Типа ‘/api/v3/koob/xls_krs_6.xdds_t58’
А во втором не понятно.

Какой запрос вы шлете? пришлите и сам запрос и код ошибки, пожалуйста.

У вас есть метод loadKoobData, он первым параметром принимает id куба, в который вы идете за данными. columns - строковый массив идентификаторов интересующих дименшнов и/или меж (типа “sum(value)”), filters - объект с фильтрами как тот, который вы пишете в конфиге дешлетов.

Разобрался. Написал: ‘accept’: ‘application/stream, application/json’,
Ошибки больше нет.

1 лайк

Илья, вы ранее написали что в запросе body можно отправить offset, limit, sort,distinct
прошу дать пример body где все это заполнено.

Так же я передал в куб условие для фильтра
var filter = [“a:[‘=’,‘ДОБЫВАЮЩАЯ’]”];
но после применения функции /api/v3/koob/data выходной результат выдал все строки (фильтр не применился).
это код заполнения body
const body_kub = {
columns,
filters,
with: koobId
};
Подскажите пожалуйста, где у меня ошибка.

Тут нет ничего специфического) просто в body помимо columns, with, filters появятся так же limit (число > 0 (если 0 то это наоборот будет значит, что ограничений нет (ибо по умолчанию 128 значений кажется))), offset (число) и sort (это массив строчек типа “+age” или “-sex”, где + и - это ASC и DESC по соответствующим дименшнам или никнеймам для меж).

В фильтре у вас ошибка: это объект должен быть:
filters: {
“a”: [‘=’,‘ДОБЫВАЮЩАЯ’]
}
Это же JSON все же, не забывайте )

С фильтром все получилось. Спасибо.