Skip to content

Commit

Permalink
Merge pull request #182 from datavisyn/keckelt/idType-viewDesc
Browse files Browse the repository at this point in the history
Refactor DB view descriptions
  • Loading branch information
Christian Lehner authored Oct 21, 2019
2 parents 2ff13fe + b9be6db commit 1afc4f8
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 27 deletions.
6 changes: 3 additions & 3 deletions src/base/AEmbeddedRanking.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import {IViewProvider} from '../lineup/internal/cmds';
import {resolve} from 'phovea_core/src/idtype';
import {EXTENSION_POINT_TDP_SCORE_IMPL} from '../extensions';
import {get as getPlugin} from 'phovea_core/src/plugin';
import {IServerColumnDesc} from '../rest';
import {IFormElementDesc} from '../form';


interface IEmbeddedRanking extends ARankingView {
rebuildLineUp(mode: 'data' | 'scores' | 'data+scores' | 'data+desc+scores' | 'data+desc'): void;
runWithoutTracking<T>(f: () => T): Promise<T>;
Expand Down Expand Up @@ -51,8 +51,8 @@ export abstract class AEmbeddedRanking<T extends IRow> implements IViewProvider
class EmbeddedRankingView extends ARankingView implements IEmbeddedRanking {
private triggerScoreReload = false;

protected loadColumnDesc() {
return Promise.resolve(that.loadColumnDescs()).then((columns: any[]) => ({columns}));
protected loadColumnDesc() : Promise<IServerColumnDesc> {
return Promise.resolve(that.loadColumnDescs()).then((columns: any[]) => ({columns, idType: this.idType.name}));
}

protected getColumnDescs(columns: any[]) {
Expand Down
7 changes: 4 additions & 3 deletions src/internal/PhoveaDataAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import {get} from 'phovea_core/src/data';
import {ITable, ITableColumn} from 'phovea_core/src/table';
import {ICategoricalValueTypeDesc, INumberValueTypeDesc, IValueTypeDesc} from 'phovea_core/src/datatype';
import {IRow, IViewDescription} from '../rest';
import {IRow, IServerColumnDesc} from '../rest';

export default class PhoveaDataAdapter {
private readonly data: Promise<ITable>;
Expand All @@ -13,13 +13,14 @@ export default class PhoveaDataAdapter {
this.data = <any>get(datasetId);
}

async getDesc(): Promise<IViewDescription> {
async getDesc(): Promise<IServerColumnDesc> {
const t = await this.data;
return {
columns: t.desc.columns.map((c: ITableColumn<IValueTypeDesc>) => Object.assign({
column: c.column || c.name,
label: c.name
}, mapType(c.value)))
}, mapType(c.value))),
idType: t.idtype.name
};
}

Expand Down
5 changes: 2 additions & 3 deletions src/lineup/ARankingView.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,8 @@ import {IRankingWrapper, wrapRanking} from './internal/ranking';
import {pushScoreAsync} from './internal/scorecmds';
import {debounce, mixin, resolveImmediately} from 'phovea_core/src';
import LineUpColors from './internal/LineUpColors';
import {IRow} from '../rest';
import {IRow, IServerColumn, IServerColumnDesc} from '../rest';
import {IContext, ISelectionAdapter, ISelectionColumn} from './selection';
import {IServerColumn, IViewDescription} from '../rest';
import LineUpPanelActions, {rule} from './internal/LineUpPanelActions';
import {addLazyColumn} from './internal/column';
import {successfullySaved} from '../notifications';
Expand Down Expand Up @@ -463,7 +462,7 @@ export abstract class ARankingView extends AView {
* load the table description from the server
* @returns {Promise<IViewDescription>} the column descriptions
*/
protected abstract loadColumnDesc(): Promise<IViewDescription>;
protected abstract loadColumnDesc(): Promise<IServerColumnDesc>;

/**
* load the rows of LineUp
Expand Down
31 changes: 18 additions & 13 deletions src/rest.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {api2absURL, getAPIData, getAPIJSON, encodeParams, sendAPI, MAX_URL_LENGTH} from 'phovea_core/src/ajax';
import {IScoreRow} from './lineup';
import {IDTypeLike} from 'phovea_core/src/idtype';

export const REST_NAMESPACE = '/tdp';
export const REST_DB_NAMESPACE = `${REST_NAMESPACE}/db`;
Expand Down Expand Up @@ -39,18 +40,29 @@ export function getTDPDatabases(): Promise<IDatabaseDesc[]> {
return getAPIJSON(`${REST_DB_NAMESPACE}/`);
}

export interface IViewDesc {
export interface IServerColumnDesc {

/**
* idType of the DBView, can be null
*/
idType: IDTypeLike | null;

/**
* list of columns within this view, can be empty
*/
columns: IServerColumn[];
}

export interface IDatabaseViewDesc extends IServerColumnDesc {
name: string;
description: string;
arguments: string[];
query: string;
columns?: IServerColumn[];
idType?: string;
filters?: string[];
queries?: { [name: string]: string };
}

export function getTDPViews(database: string): Promise<Readonly<IViewDesc>[]> {
export function getTDPViews(database: string): Promise<Readonly<IDatabaseViewDesc>[]> {
return getAPIJSON(`${REST_DB_NAMESPACE}/${database}/`);
}

Expand Down Expand Up @@ -321,19 +333,12 @@ export interface IServerColumn {
max?: number;
}

export interface IViewDescription {
/**
* list of columns within this view
*/
columns: IServerColumn[];
}

/**
* queries the server side column information of the given view
* @param {string} database
* @param {string} view
* @returns {Promise<Readonly<IViewDescription>>}
* @returns {Promise<Readonly<IDatabaseViewDesc>>}
*/
export function getTDPDesc(database: string, view: string): Promise<Readonly<IViewDescription>> {
export function getTDPDesc(database: string, view: string): Promise<Readonly<IDatabaseViewDesc>> {
return getTDPDataImpl(database, view, 'desc');
}
6 changes: 2 additions & 4 deletions tdp_core/dbview.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,14 +52,12 @@ def needs_to_fill_up_columns(self):
def dump(self, name):
from collections import OrderedDict
r = OrderedDict(name=name, description=self.description, type=self.query_type)
if self.idtype:
r['idType'] = self.idtype
r['idType'] = self.idtype
r['query'] = clean_query(self.query)
args = [a for a in self.arguments]
args.extend(self.replacements)
r['arguments'] = args
if self.columns:
r['columns'] = self.columns.values()
r['columns'] = self.columns.values() if self.columns else [] # some views have no columns -> return empty array
if self.filters:
r['filters'] = self.filters.keys()
if self.queries:
Expand Down
2 changes: 1 addition & 1 deletion tdp_core/sql.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ def get_count_data(database, view_name):
def get_desc(database, view_name):
view_name, _ = formatter(view_name)
config, _, view = db.resolve_view(database, view_name)
return jsonify(dict(idType=view.idtype, columns=view.columns.values()))
return jsonify(view.dump(view_name))


@app.route('/<database>/<view_name>/lookup', methods=['GET', 'POST'])
Expand Down

0 comments on commit 1afc4f8

Please sign in to comment.