Skip to content

Commit 4f6342b

Browse files
committed
resolve entity instances for sortedSet
1 parent 0697c22 commit 4f6342b

File tree

4 files changed

+194
-6
lines changed

4 files changed

+194
-6
lines changed

.vscode/launch.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
// Use IntelliSense to learn about possible attributes.
3+
// Hover to view descriptions of existing attributes.
4+
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5+
"version": "0.2.0",
6+
"configurations": [
7+
{
8+
"type": "node",
9+
"request": "launch",
10+
"name": "Launch Program",
11+
"skipFiles": [
12+
"<node_internals>/**"
13+
],
14+
"program": "${workspaceFolder}\\dist\\index.js",
15+
"preLaunchTask": "tsc: build - tsconfig.json",
16+
"outFiles": [
17+
"${workspaceFolder}/dist/**/*.js"
18+
]
19+
}
20+
]
21+
}

src/aspect-meta-model/characteristic/default-sorted-set.ts

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,45 @@
1414
import {DefaultCollection} from './default-collection';
1515
import {Characteristic} from './default-characteristic';
1616
import {Type} from '../type';
17+
import { DefaultEntityInstance } from '../default-entity-instance';
18+
import { DefaultEntity } from '../default-entity';
1719

18-
export class DefaultSortedSet extends DefaultCollection {
19-
constructor(metaModelVersion: string, aspectModelUrn: string, name: string, elementCharacteristic?: Characteristic, dataType?: Type) {
20+
export interface SortedSet extends Characteristic {
21+
values: Array<DefaultEntityInstance | string | number>;
22+
23+
indexOf(value: string): number;
24+
}
25+
26+
export class DefaultSortedSet extends DefaultCollection implements SortedSet {
27+
constructor(metaModelVersion: string, aspectModelUrn: string, name: string, elementCharacteristic?: Characteristic, dataType?: Type,private _values?: Array<DefaultEntityInstance | string | number>) {
2028
super(metaModelVersion, aspectModelUrn, name, false, true, elementCharacteristic, dataType);
2129
}
30+
public set values(values: Array<DefaultEntityInstance | string | number>) {
31+
this._values = values;
32+
}
33+
34+
public get values(): Array<DefaultEntityInstance | string | number> {
35+
return this._values;
36+
}
37+
38+
/**
39+
* Find the index of the given value in the values array.
40+
*
41+
* @return returns the index of the value or -1
42+
*/
43+
public indexOf(value: string): number {
44+
if (!this.values) {
45+
return -1;
46+
}
47+
48+
if (this.dataType && this.dataType.isComplex) {
49+
const propertyValue = (<DefaultEntity>this.dataType).properties.find(property => property.isNotInPayload === false);
50+
51+
return this.values.findIndex((valueEntry: DefaultEntityInstance) => {
52+
return valueEntry[propertyValue.name] === value;
53+
});
54+
} else {
55+
return this.values.findIndex(valueEntry => valueEntry === value);
56+
}
57+
}
2258
}

src/instantiator/characteristic/enumeration-characteristic-instantiator.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,23 @@ export interface MultiLanguageText {
2727
export class EnumerationCharacteristicInstantiator extends CharacteristicInstantiator {
2828
constructor(metaModelElementInstantiator: MetaModelElementInstantiator, nextProcessor: CharacteristicInstantiator) {
2929
super(metaModelElementInstantiator, nextProcessor);
30+
console.log('+++ in EnumerationCharacteristicInstantiator constructor +++');
3031
}
3132

3233
protected processElement(quads: Array<Quad>): Characteristic {
3334
const samm = this.metaModelElementInstantiator.samm;
3435
const sammC = this.metaModelElementInstantiator.sammC;
3536
const enumeration = this.creatEnumerationObject();
36-
37+
console.log('+++ in EnumerationCharacteristicInstantiator processElement +++');
3738
const dataType = quads.find(quad => this.samm.isDataTypeProperty(quad.predicate.value));
3839

40+
3941
quads.forEach(quad => {
42+
console.log('+++ quad.predicate.value+++', quad.predicate.value);
4043
if (samm.isValueProperty(quad.predicate.value) || sammC.isValuesProperty(quad.predicate.value)) {
44+
console.log('+++ in EnumerationCharacteristicInstantiator quads.forEach in if +++');
4145
if (Util.isBlankNode(quad.object)) {
46+
console.log('+++ in EnumerationCharacteristicInstantiator in if isBlankNode +++');
4247
enumeration.values = this.getEnumerationValues(quad, dataType?.object.value);
4348
}
4449
}

src/instantiator/characteristic/sorted-set-characteristic-instantiator.ts

Lines changed: 129 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,147 @@
1313

1414
import {CharacteristicInstantiator} from '../characteristic/characteristic-instantiator';
1515
import {MetaModelElementInstantiator} from '../meta-model-element-instantiator';
16-
import {NamedNode} from 'n3';
17-
import {Collection} from '../../aspect-meta-model';
1816
import {CollectionCharacteristicInstantiator} from './collection-characteristic-instantiator';
1917
import {DefaultSortedSet} from '../../aspect-meta-model/characteristic/default-sorted-set';
2018

19+
import {NamedNode, Quad, Util} from 'n3';
20+
import {Characteristic} from '../../aspect-meta-model';
21+
import {Samm} from '../../vocabulary';
22+
import {EntityInstantiator} from '../entity-instantiator';
23+
import {DefaultEntityInstance} from '../../aspect-meta-model/default-entity-instance';
24+
25+
export interface MultiLanguageText {
26+
value: string;
27+
language: string;
28+
}
29+
2130
export class SortedSetCharacteristicInstantiator extends CollectionCharacteristicInstantiator {
2231
constructor(metaModelElementInstantiator: MetaModelElementInstantiator, nextProcessor: CharacteristicInstantiator) {
2332
super(metaModelElementInstantiator, nextProcessor);
2433
}
2534

26-
protected creatCollectionObject(): Collection {
35+
protected processElement(quads: Array<Quad>): Characteristic {
36+
const samm = this.metaModelElementInstantiator.samm;
37+
const sammC = this.metaModelElementInstantiator.sammC;
38+
const sortedSet = this.creatCollectionObject();
39+
40+
const dataType = quads.find(quad => this.samm.isDataTypeProperty(quad.predicate.value));
41+
42+
quads.forEach(quad => {
43+
if (samm.isValueProperty(quad.predicate.value) || sammC.isValuesProperty(quad.predicate.value)) {
44+
if (Util.isBlankNode(quad.object)) {
45+
sortedSet.values = this.getEnumerationValues(quad, dataType?.object.value);
46+
}
47+
}
48+
});
49+
return sortedSet;
50+
}
51+
52+
protected creatCollectionObject(): any {
2753
return new DefaultSortedSet(null, null, null, null);
2854
}
2955

3056
shouldProcess(nameNode: NamedNode): boolean {
3157
return this.metaModelElementInstantiator.sammC.SortedSetCharacteristic().equals(nameNode);
3258
}
59+
60+
protected resolveEntityInstance(quad: Quad): DefaultEntityInstance {
61+
const entityInstanceQuads = this.metaModelElementInstantiator.rdfModel.store.getQuads(quad.object, null, null, null);
62+
const entityTypeQuad = entityInstanceQuads.find(
63+
entityInstanceQuad => entityInstanceQuad.predicate.value === `${Samm.RDF_URI}#type`
64+
);
65+
66+
if (entityTypeQuad) {
67+
const entity = new EntityInstantiator(this.metaModelElementInstantiator).createEntity(
68+
this.metaModelElementInstantiator.rdfModel.store.getQuads(entityTypeQuad.object, null, null, null)
69+
);
70+
71+
// determine the description of the value/instance if defined
72+
const descriptionQuad = entityInstanceQuads.find(
73+
quad =>
74+
quad.predicate.id.toLowerCase().includes('description') &&
75+
entity.properties.find(property => property.isNotInPayload === false && quad.predicate.id)
76+
);
77+
const descriptions = new Map<string, string>();
78+
if (descriptionQuad) {
79+
entityInstanceQuads
80+
.filter(quad => quad.predicate.id === descriptionQuad.predicate.id)
81+
.forEach(quad =>
82+
descriptions.set(this.metaModelElementInstantiator.rdfModel.getLocale(quad) || 'en', quad.object.value)
83+
);
84+
}
85+
86+
// create the related instance and attach the metamodel element to it
87+
const entityInstance = new DefaultEntityInstance(quad.object.value.split('#')[1], entity, descriptions);
88+
entityInstanceQuads.forEach(quad => {
89+
const predicateKey = this.getPredicateKey(quad);
90+
entityInstance[predicateKey] = this.resolveQuadObject(quad);
91+
});
92+
93+
return entityInstance;
94+
}
95+
throw new Error(`Could resolve Entity instance ${entityTypeQuad.subject.value}`);
96+
}
97+
98+
private resolveQuadObject(quad: Quad): MultiLanguageText | Array<MultiLanguageText> | string {
99+
if (Util.isBlankNode(quad.object)) {
100+
const resolvedBlankNodes = this.metaModelElementInstantiator.rdfModel.resolveBlankNodes(quad.object.value);
101+
return this.solveBlankNodeValues([...resolvedBlankNodes]);
102+
}
103+
104+
if (((quad.object as any).datatypeString === Samm.RDF_LANG_STRING) ||
105+
((quad.object as any).datatypeString === Samm.XML_LANG_STRING)) {
106+
return this.createLanguageObject(quad);
107+
}
108+
109+
return quad.object.value;
110+
}
111+
112+
private solveBlankNodeValues(resolvedBlankNodes: Array<Quad>): Array<MultiLanguageText> {
113+
return resolvedBlankNodes.length > 0 ? resolvedBlankNodes.map(item => this.createLanguageObject(item)) : [];
114+
}
115+
116+
private getPredicateKey(quad: Quad): string {
117+
return quad.predicate.value.split('#')[1];
118+
}
119+
120+
private createLanguageObject(quad: Quad): MultiLanguageText {
121+
return {value: quad.object.value, language: (quad.object as any).language};
122+
}
123+
124+
private getEnumerationValues(quad: Quad, dataType: string): Array<string | number | DefaultEntityInstance> {
125+
const quads = this.metaModelElementInstantiator.rdfModel.resolveBlankNodes(quad.object.value);
126+
return quads.map(quadValue =>
127+
Util.isLiteral(quadValue.object) ? this.resolveValues(quadValue, dataType) : this.resolveEntityInstance(quadValue)
128+
);
129+
}
130+
131+
private resolveValues(quad: Quad, dataType: string): string | number {
132+
if (!dataType || !dataType.includes('#')) {
133+
return `${quad.object.value}`;
134+
}
135+
136+
switch (dataType.split('#')[1]) {
137+
case 'decimal':
138+
case 'integer':
139+
case 'double':
140+
case 'float':
141+
case 'byte':
142+
case 'short':
143+
case 'int':
144+
case 'long':
145+
case 'unsignedByte':
146+
case 'unsignedLong':
147+
case 'unsignedInt':
148+
case 'unsignedShort':
149+
case 'positiveInteger':
150+
case 'nonNegativeInteger':
151+
case 'negativeInteger':
152+
case 'nonPositiveInteger':
153+
return Number(quad.object.value);
154+
default:
155+
return `${quad.object.value}`;
156+
}
157+
}
158+
33159
}

0 commit comments

Comments
 (0)