Page MenuHomec4science

search.ts
No OneTemporary

File Metadata

Created
Thu, May 2, 03:30

search.ts

import { BasicResultBindingElement, FusekiResults} from './basic_datatype';
import { TLN_SEARCH_ROUTE } from '../constants';
import { TlnWord } from './word';
export class TlnExtWord extends TlnWord {
startLine?: string;
endLine?: string;
constructor(data: any, id?: string, service?: any){
super(data, id, service)
this.startLine = this.getData4Key('startLine');
this.endLine = this.getData4Key('endLine');
}
}
export class PageResult {
words: TlnExtWord[] = [];
constructor(words: TlnExtWord[]){
this.words = words;
}
public getWords(): string[] {
return this.words.map(word =>word.id);
}
public getStartLine(): string {
let sortedWords = this.words.sort((word0, word1) =>word0.line_number - word1.line_number)
if (sortedWords.length == 0){
return '';
}
return (sortedWords[0].startLine != undefined && sortedWords[0].startLine != null) ? sortedWords[0].startLine : sortedWords[0].line;
}
public getEndLine(): string {
let sortedWords = this.words.sort((word0, word1) =>word0.line_number - word1.line_number)
if (sortedWords.length == 0){
return '';
}
return (sortedWords[sortedWords.length-1].endLine != undefined && sortedWords[sortedWords.length-1].endLine != null)
? sortedWords[sortedWords.length-1].endLine : sortedWords[sortedWords.length-1].line;
}
}
export class FoundPage extends BasicResultBindingElement{
static readonly storagePrefix = TLN_SEARCH_ROUTE + '_' + FoundPage.name
static readonly query: string = `
PREFIX tln: <http://www.nie.org/ontology/nietzsche#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT DISTINCT ?id ?manuscript ?title ?number ?word ?text ?line ?line_number ?startLine ?endLine WHERE {
?id a tln:Page;
tln:hasNumber ?number;
tln:hasPseudoText ?fulltext.
FILTER regex(?fulltext, "#find#", "s").
?manuscript a tln:ArchivalManuscriptUnity;
tln:hasManuscriptType "Mappe";
tln:hasPages/rdf:rest*/rdf:first ?id;
tln:hasTitle ?title.
?id tln:hasWords/rdf:rest*/rdf:first ?word.
?word tln:hasOutputText ?text;
tln:wordBelongsToLine ?line.
?line tln:lineHasNumber ?line_number.
OPTIONAL{ ?previouseNode rdf:rest/rdf:first ?line;
rdf:first ?startLine.}
OPTIONAL{ ?myNode rdf:first ?line;
rdf:rest/rdf:first ?endLine.}
#FILTER().
} order by ?id ?line_number`;
title: string
number: string;
manuscript: string
results: PageResult[] = [];
constructor (data: any, id?: string, service?: any) {
super(data, id, service);
this.title = this.getData4Key('title');
this.number = this.getData4Key('number');
this.manuscript = this.getData4Key('manuscript');
}
public removeIncompleteResults(searchTerms: string[]) {
this.results = this.results.filter(result =>searchTerms.every(searchText =>result.words.filter(word =>word.text.match('^[^\w\s]*' + searchText + '.*')).length > 0))
}
/**
* This method returns the parametrized SPARQL query of this FoundPage
*
* If "key" is omitted {@link /classes/BasicResultBindingElement.html#default_key|default_key} will be used.
*
* @param find the search text
* @param key will be ignored.
**/
public static getQuery(find?: string, key?: string): string {
if(find == undefined || find == null){
return this.query;
}
let words = find.split(' ')
let find_regex = words.join('.*') + '.*'
let filter = 'FILTER regex(?text, "^[^\\\\w]?(' + words.join('.*|') + '.*)")';
let query = this.query.replace('#find#', find_regex).replace('#FILTER()', filter);
//console.log(query);
return query;
}
public static convertData<T extends typeof BasicResultBindingElement>(this: T, data: FusekiResults, id?: string, service?: any): Array<InstanceType<T>> {
let elements = [];
let pages = [];
let searchTerms = service.getSearchTerms();
let content = this.getContent(data);
let currentResult: PageResult = null;
let currentPage: FoundPage = null;
for (var i = 0; i < content.length; i++){
let page = new FoundPage(content[i], id, service);
if(content[i]['word'] != undefined && content[i]['word'] != null) {
let words = TlnExtWord.convertData({ head: { vars: []}, results: { bindings: <any>[ content[i] ] } }, content[i]['word']['value']);
if (pages.length == 0 || pages.map(page =>page.id).indexOf(page.id) == -1){
currentResult = new PageResult(words);
currentPage = page;
currentPage.results.push(currentResult)
pages.push(currentPage)
} else {
if (currentResult.words.indexOf(words[0]) == -1){
if (currentResult.words.length > 0
&& (Math.abs(Math.min(...currentResult.words.map(word =>word.line_number)) - words[0].line_number) > 4
|| Math.abs(Math.max(...currentResult.words.map(word =>word.line_number)) - words[0].line_number) > 4)){
currentResult = new PageResult(words);
currentPage.results.push(currentResult);
} else {
currentResult.words.push(words[0]);
}
}
}
}
}
pages.forEach(page =>page.removeIncompleteResults(searchTerms));
return pages.filter(page =>page.results.length > 0);
}
}

Event Timeline