import { DataLoader } from "./DataLoader.js";
import { DataFrame } from "./DataFrame.js";
/**
* The default URL for accessing the DWS (Data Web Service) API. * */
export const DWS_DEFAULT_URL = 'https://dashboard.awi.de/data-xxl/rest';
/**
* A loader for data provided by the Data Web Service.
*
* @author rkoppe <roland.koppe@awi.de>
*/
export class DwsLoader extends DataLoader {
baseUrl = '';
constructor(baseUrl) {
super();
this.baseUrl = baseUrl || DWS_DEFAULT_URL;
}
/**
* Returns a list of available parameters, columns, data streams as Promise.
*
* @return {Promise<String[]>}
*/
async parameters() {
// FIXME: switch to search to also retrieve data pool parameters?
let response = await fetch(this.baseUrl + '/sensors', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
});
if (!response.ok) return [];
let parameters = ['datetime'];
let json = await response.json();
for (let i = 0; i < json.length; i++) {
parameters.push(json[i].code);
}
return parameters;
}
/**
* Returns a DataFrame of the content as Promise.
*
* FIXME: support generic but compiled? filters, remove defined attributes
*
* @param {*} parameters
* @param {*} beginDate
* @param {*} endDate
* @param {*} limit
* @param {*} aggregate
* @param {*} aggregateFunctions
* @return {Promise<DataFrame>} Promise<DataFrame>
*/
async data(parameters, beginDate, endDate, limit, aggregate = 'HOUR', aggregateFunctions = ['MEAN']) {
const request = {
sensors: parameters,
beginDate: beginDate,
endDate: endDate,
limit: limit
};
if (aggregate) {
request.aggregate = aggregate;
if (aggregate.toLowerCase() != "second") request.aggregateFunctions = aggregateFunctions;
}
let response = await fetch(this.baseUrl + '/data/bulk', {
method: 'POST',
body: JSON.stringify(request),
headers: {
'Content-Type': 'application/json',
'Accept': 'text/tab-separated-values'
}
});
if (!response.ok) return null;
let content = await response.text();
let df = new DataFrame();
df.read(content, '\t');
return df;
}
}