blob: 49141918da3f743bf873addd86c1fd3fc964aade [file] [log] [blame]
/********************************************************************************
* Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
********************************************************************************/
import {Injectable, EventEmitter} from '@angular/core';
import {Http, Response, Headers, RequestOptions} from '@angular/http';
import { Observable } from 'rxjs/Observable';
import {PropertyService} from '../core/property.service';
import {MDMItem} from '../core/mdm-item';
import {HttpErrorHandler} from '../core/http-error-handler';
import {Type, Exclude, plainToClass, serialize, deserialize} from 'class-transformer';
export class Filter {
sourceName: string;
filter: string;
searchString: string;
constructor(sourceName: string, filter: string, searchString: string) {
this.sourceName = sourceName;
this.filter = filter;
this.searchString = searchString;
}
}
export class Query {
resultType: string;
@Type(() => Filter)
filters: Filter[] = [];
columns: String[] = [];
addFilter(sourceName: string, filter: string) {
let f = this.filters.find(i => i.sourceName === sourceName);
if (f) {
f.filter += ' or ' + filter; // TODO
} else {
this.filters.push(new Filter(sourceName, filter, ''));
}
}
}
export class Columns {
type: string;
attribute: string;
value: string;
}
export class Row {
source: string;
type: string;
id: string;
@Type(() => Columns)
columns: Columns[] = [];
getColumn(col: string) {
let column = this.columns.find(c => c.type + '.' + c.attribute === col);
if (column) {
return column.value;
} else {
return '';
}
}
equals (row: Row) {
return this.source === row.source && this.type === row.type && this.id === row.id;
}
public getItem() {
return new MDMItem(this.source, this.type, this.id);
}
}
export class SearchResult {
@Type(() => Row)
rows: Row[] = [];
}
@Injectable()
export class QueryService {
private queryUrl: string;
constructor(private http: Http,
private httpErrorHandler: HttpErrorHandler,
private _prop: PropertyService) {
this.queryUrl = _prop.getUrl('/mdm/query');
}
query(query: Query): Observable<SearchResult> {
return this.http.post(this.queryUrl, query)
.map(res => deserialize(SearchResult, res.text()))
.catch(this.httpErrorHandler.handleError);
}
queryItems(items: MDMItem[], columns: string[]): Observable<SearchResult>[] {
let byType = items.reduce((acc: [string, MDMItem[]], item: MDMItem) => {
let key = item.type;
acc[key] = acc[key] || [];
acc[key].push(item);
return acc;
}, {});
return Object.keys(byType).map(type => this.queryType(type, byType[type], columns));
}
queryType(type: string, items: MDMItem[], columns: string[]) {
if (items && items.length > 0) {
let query = new Query();
query.resultType = type;
query.columns = columns;
query.columns.push(type + '.Id');
items.forEach(i => query.addFilter(i.source, i.type + '.Id eq \'' + i.id + '\''));
return this.query(query);
} else {
return Observable.of(new SearchResult());
}
}
suggestValues(environments: string[], type: string, attribute: string) {
let body = JSON.stringify({
'sourceNames': environments,
'type': type,
'attrName': attribute
});
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
let url = this._prop.getUrl('/mdm/suggestions');
return this.http.post(url, body, options)
.map(res => res.json().data)
.catch(this.httpErrorHandler.handleError);
}
}