Skip to content

Commit

Permalink
spaceFilter as expression
Browse files Browse the repository at this point in the history
  • Loading branch information
Evgeny Metelkin committed Nov 13, 2023
1 parent e318d69 commit 59d3e3a
Show file tree
Hide file tree
Showing 19 changed files with 65 additions and 283 deletions.
4 changes: 3 additions & 1 deletion TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@

## features

- regular expression for spaceFilter
- check empty exports
- default `filepath` for Export
- checking legal functions inside Expressions and functionDefinition
- `#defineFunction`: circular dependences within functions, internal functions, different exports, functionDef vs units
- calculate units for pow function
Expand All @@ -46,6 +47,7 @@

## ideas

- deprecated `include` statement
- `#move`, `#moveNS`
- `#deleteNS` action
- `#move`, `#moveNS`
Expand Down
8 changes: 4 additions & 4 deletions export-formats.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ The general format for all export actions is the following:
#export {
format: JSON, // or other supported formats, required
filepath: path/to/output, // Relative or absolute path to generated directory or file
spaceFilter: [nameless, another] // [] if set, namespaces out of the list will be skipped.
spaceFilter: "regex-expression" // only filtered namespaces will be exported, see RegExp rules
... // other options
};
```
Expand Down Expand Up @@ -73,7 +73,7 @@ All options is the same as for [JSON format](#json).
filepath: output, // save result in file "dist/output.json"
omit: [aux.wiki], // omit aux.wiki properties from components
noUnitsExpr: false, // save units in format UnitsExpr
spaceFilter: [ nameless, another ]
spaceFilter: ".+" // all namespaces
};
```

Expand Down Expand Up @@ -143,7 +143,7 @@ Export to SLV format which is the model format for [DBSolveOptimum](http://insys
#export {
format: SLV,
filepath: model, // save results in file "dist/model.slv"
spaceFilter: nameless, // namespace used for model generation
spaceFilter: "^nameless$", // namespace used for model generation
eventsOff: false, // all switchers will be transformed to DBSolve events
powTransform: keep, // use x^y and pow(x, y) without changes
groupConstBy: "tags[1]" // use the second tag
Expand Down Expand Up @@ -344,7 +344,7 @@ Creation of Matlab files (.m) which represent ODE and code to run ODE.
#export {
format: Matlab,
filepath: matlab_code, // save result in directory "dist/matlab_code"
spaceFilter: nameless // create model based on nameless namespace
spaceFilter: (nameless|another_one) // create model based on nameless namespace
};
```

Expand Down
8 changes: 3 additions & 5 deletions src/another-xlsx-export/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,9 @@ class AnotherXLSXExport extends XLSXExport {
}
makeSheet(){
// filtered namespaces
let nsArray = [...this._container.namespaceStorage]
.map((pair) => pair[1]);
let nsOutput = typeof this.spaceFilter === 'undefined'
? nsArray
: nsArray.filter((ns) => this.spaceFilter.indexOf(ns.spaceName) !== -1);
let nsOutput = [...this._container.namespaceStorage]
.filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName))
.map(([spaceName, ns]) => ns);

let qArr = nsOutput
.map((ns) => ns.toArray())
Expand Down
7 changes: 3 additions & 4 deletions src/core/abstract-export.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@ const schema = {
required: ['filepath'],
properties: {
filepath: {type: 'string', pattern: '^[\\w\\d\\\\/._!-]+$'},
spaceFilter: { oneOf: [
{ type: 'array', items: { '$ref': '#/definitions/ID' } },
{ '$ref': '#/definitions/ID' }
]}
spaceFilter: { type: 'string' }
},
definitions: {
ID: {
Expand Down Expand Up @@ -40,6 +37,8 @@ class AbstractExport extends Top {
if (!valid) { this.errored = true; return; }

if (q.filepath) this.filepath = q.filepath;

this.spaceFilter = q.spaceFilter || '.+';
}
get className(){
return 'AbstractExport';
Expand Down
39 changes: 6 additions & 33 deletions src/dbsolve-export/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,7 @@ class DBSolveExport extends AbstractExport{
} else {
this.groupConstBy = 'tags[0]';
}
if (q.spaceFilter instanceof Array) {
this.spaceFilter = q.spaceFilter;
} else if (typeof q.spaceFilter === 'string') {
this.spaceFilter = [q.spaceFilter];
}

this.version = q.version ? q.version + '' : '26'; // force string

if (q.defaultTask) this.defaultTask = q.defaultTask;
Expand All @@ -44,26 +40,6 @@ class DBSolveExport extends AbstractExport{
*/
makeText(){
let logger = this._container.logger;

if (this.spaceFilter !== undefined) {
// empty namespace is not allowed
if (this.spaceFilter.length === 0) {
let msg = 'spaceFilter for DBSolve format should include at least one namespace, got empty.';
logger.error(msg);
return []; // BRAKE
}

// check if namespaces exists
let lostNamespaces = this.spaceFilter.filter((x) => {
let ns = this._container.namespaceStorage.get(x);
return !ns || ns.isAbstract;
});
if (lostNamespaces.length > 0) {
let msg = `Namespaces: ${lostNamespaces.join(', ')} either do not exist or are abstract. Simbio export stopped.`;
logger.error(msg);
return []; // BRAKE
}
}

// display that function definition is not supported
let functionsNames = [...this._container.functionDefStorage.keys()];
Expand All @@ -72,15 +48,12 @@ class DBSolveExport extends AbstractExport{
}

// filter namespaces if set
let selectedNamespaces = this.spaceFilter !== undefined
? [...this._container.namespaceStorage].filter((x) => this.spaceFilter.indexOf(x[0]) !== -1)
: [...this._container.namespaceStorage].filter((x) => !x[1].isAbstract);

let results = selectedNamespaces.map((x) => {
let spaceName = x[0];
let ns = x[1];
let selectedNamespaces = [...this._container.namespaceStorage]
.filter(([spaceName, space]) => new RegExp(this.spaceFilter).test(spaceName))
.filter(([spaceName, space]) => !space.isAbstract);

let image = this.getSLVImage(ns);
let results = selectedNamespaces.map(([spaceName, namespace]) => {
let image = this.getSLVImage(namespace);
let content = this.getSLVCode(image);

return {
Expand Down
36 changes: 3 additions & 33 deletions src/dot-export/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,6 @@ class DotExport extends AbstractExport{
let logger = this._container.logger;
let valid = DotExport.isValid(q, logger);
if (!valid) { this.errored = true; return; }

if (q.spaceFilter instanceof Array) {
this.spaceFilter = q.spaceFilter;
} else if (typeof q.spaceFilter === 'string') {
this.spaceFilter = [q.spaceFilter];
}
}
get className(){
return 'DotExport';
Expand All @@ -32,35 +26,11 @@ class DotExport extends AbstractExport{
makeText(){
let logger = this._container.logger;

if (this.spaceFilter !== undefined) {
// empty namespace is not allowed
if (this.spaceFilter.length === 0) { // check non-empty space filter
let msg = 'spaceFilter for Dot format should include at least one namespace but is empty';
logger.error(msg);
return []; // BRAKE
}

// check if namespaces exists
let lostNamespaces = this.spaceFilter.filter((x) => {
let ns = this._container.namespaceStorage.get(x);
return !ns || ns.isAbstract;
});
if (lostNamespaces.length > 0) {
let msg = `Namespaces: ${lostNamespaces.join(', ')} either do not exist or are abstract. Dot export stopped.`;
logger.error(msg);
return []; // BRAKE
}
}

// filter namespaces if set
let selectedNamespaces = this.spaceFilter !== undefined
? [...this._container.namespaceStorage].filter((x) => this.spaceFilter.indexOf(x[0]) !== -1)
: [...this._container.namespaceStorage].filter((x) => !x[1].isAbstract);

let results = selectedNamespaces.map((x) => {
let spaceName = x[0];
let ns = x[1];
let selectedNamespaces = [...this._container.namespaceStorage]
.filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName));

let results = selectedNamespaces.map(([spaceName, ns]) => {
let image = this.getDotImage(ns);
let content = this.getDotCode(image);

Expand Down
6 changes: 2 additions & 4 deletions src/heta-code-export/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ class HetaCodeExport extends AbstractExport{
let logger = this._container.logger;
let valid = HetaCodeExport.isValid(q, logger);
if (!valid) { this.errored = true; return; }
if (q.spaceFilter) this.spaceFilter = q.spaceFilter;
}
get className(){
return 'HetaExport';
Expand Down Expand Up @@ -50,9 +49,8 @@ class HetaCodeExport extends AbstractExport{
getHetaCodeImage(container){
// let logger = this._container.logger;

let filteredNamespaceStorage = this.spaceFilter === undefined
? [...container.namespaceStorage]
: [...container.namespaceStorage].filter((x) => this.spaceFilter.indexOf(x[0]) !== -1);
let filteredNamespaceStorage = [...container.namespaceStorage]
.filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName));

return {
functionDefStorage: [...container.functionDefStorage],
Expand Down
9 changes: 3 additions & 6 deletions src/json-export/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ class JSONExport extends AbstractExport {

if (q.omit) this.omit = q.omit;
if (q.noUnitsExpr) this.noUnitsExpr = q.noUnitsExpr;
if (q.spaceFilter) this.spaceFilter = q.spaceFilter;
}
get className(){
return 'JSONExport';
Expand All @@ -34,11 +33,9 @@ class JSONExport extends AbstractExport {
}
makeText(){
// filtered namespaces
let nsArray = [...this._container.namespaceStorage]
.map((pair) => pair[1]);
let nsArrayFiltered = typeof this.spaceFilter === 'undefined'
? nsArray
: nsArray.filter((ns) => this.spaceFilter.indexOf(ns.spaceName) !== -1);
let nsArrayFiltered = [...this._container.namespaceStorage]
.filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName))
.map(([spaceName, ns]) => ns);

// create qArr from NS
let qArr_ns = nsArrayFiltered.reduce((accumulator, ns) => {
Expand Down
15 changes: 3 additions & 12 deletions src/julia-export/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,6 @@ class JuliaExport extends AbstractExport {
let logger = this._container.logger;
let valid = JuliaExport.isValid(q, logger);
if (!valid) { this.errored = true; return; }

if (q.spaceFilter instanceof Array) {
this.spaceFilter = q.spaceFilter;
} else if (typeof q.spaceFilter === 'string') {
this.spaceFilter = [q.spaceFilter];
}
}
get className(){
return 'JuliaExport';
Expand All @@ -40,12 +34,9 @@ class JuliaExport extends AbstractExport {
//let logger = this._container.logger;
// create image for multiple namespaces
let nsImages = [...this._container.namespaceStorage]
.filter((pair) => {
let allowedByFilter = typeof this.spaceFilter === 'undefined'
|| this.spaceFilter.indexOf(pair[0]) !== -1;
return allowedByFilter && !pair[1].isAbstract;
})
.map((pair) => this.getJuliaImage(pair[1]));
.filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName))
.filter(([spaceName, ns]) => !ns.isAbstract)
.map(([spaceName, ns]) => this.getJuliaImage(ns));

// create Content
let image = {
Expand Down
37 changes: 4 additions & 33 deletions src/matlab-export/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,6 @@ class MatlabExport extends AbstractExport {
let logger = this._container.logger;
let valid = MatlabExport.isValid(q, logger);
if (!valid) { this.errored = true; return; }

if (q.spaceFilter instanceof Array) {
this.spaceFilter = q.spaceFilter;
} else if (typeof q.spaceFilter === 'string') {
this.spaceFilter = [q.spaceFilter];
}
}
get className(){
return 'MatlabExport';
Expand All @@ -40,37 +34,14 @@ class MatlabExport extends AbstractExport {
makeText(skipVersionCode = false){
let logger = this._container.logger;

if (this.spaceFilter !== undefined) {
// empty namespace is not allowed
if (this.spaceFilter.length === 0) {
let msg = 'spaceFilter for Matlab format should include at least one namespace, got empty';
logger.error(msg);
return []; // BRAKE
}

// check if namespaces exists
let lostNamespaces = this.spaceFilter.filter((x) => {
let ns = this._container.namespaceStorage.get(x);
return !ns || ns.isAbstract;
});
if (lostNamespaces.length > 0) {
let msg = `Namespaces: ${lostNamespaces.join(', ')} either do not exist or are abstract. Simbio export stopped.`;
logger.error(msg);
return []; // BRAKE
}
}

// filter namespaces if set
let selectedNamespaces = this.spaceFilter !== undefined
? [...this._container.namespaceStorage].filter((x) => this.spaceFilter.indexOf(x[0]) !== -1)
: [...this._container.namespaceStorage].filter((x) => !x[1].isAbstract);
let selectedNamespaces = [...this._container.namespaceStorage]
.filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName))
.filter(([spaceName, ns]) => !ns.isAbstract);

let results = [];

selectedNamespaces.forEach((x) => {
let spaceName = x[0];
let ns = x[1];

selectedNamespaces.forEach(([spaceName, ns]) => {
let image = this.getMatlabImage(ns);

let modelContent = this.getModelCode(image);
Expand Down
37 changes: 4 additions & 33 deletions src/mrgsolve-export/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,6 @@ class MrgsolveExport extends AbstractExport {
let logger = this._container.logger;
let valid = MrgsolveExport.isValid(q, logger);
if (!valid) { this.errored = true; return; }

if (q.spaceFilter instanceof Array) {
this.spaceFilter = q.spaceFilter;
} else if (typeof q.spaceFilter === 'string') {
this.spaceFilter = [q.spaceFilter];
}
}
get className(){
return 'MrgsolveExport';
Expand All @@ -36,41 +30,18 @@ class MrgsolveExport extends AbstractExport {
makeText(){
let logger = this._container.logger;

if (this.spaceFilter !== undefined) {
// empty namespace is not allowed
if (this.spaceFilter.length === 0) {
let msg = 'spaceFilter for Mrgsolve format should include at least one namespace, got empty.';
logger.error(msg);
return []; // BRAKE
}

// check if namespaces exists
let lostNamespaces = this.spaceFilter.filter((x) => {
let ns = this._container.namespaceStorage.get(x);
return !ns || ns.isAbstract;
});
if (lostNamespaces.length > 0) {
let msg = `Namespaces: ${lostNamespaces.join(', ')} either do not exist or are abstract. Simbio export stopped.`;
logger.error(msg);
return []; // BRAKE
}
}

// filter namespaces if set
let selectedNamespaces = this.spaceFilter !== undefined
? [...this._container.namespaceStorage].filter((x) => this.spaceFilter.indexOf(x[0]) !== -1)
: [...this._container.namespaceStorage].filter((x) => !x[1].isAbstract);
let selectedNamespaces = [...this._container.namespaceStorage]
.filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName))
.filter(([spaceName, ns]) => !ns.isAbstract);

// display that function definition is not supported
let functionsNames = [...this._container.functionDefStorage.keys()];
if (functionsNames.length > 0) {
logger.warn(`"FunctionDef" object: ${functionsNames.join(', ')} are presented in platform but not supported by Mrgsolve export.`);
}

let results = selectedNamespaces.map((x) => {
let spaceName = x[0];
let ns = x[1];

let results = selectedNamespaces.map(([spaceName, ns]) => {
let image = this.getMrgsolveImage(ns);
var codeContent = this.getMrgsolveCode(image);

Expand Down
Loading

0 comments on commit 59d3e3a

Please sign in to comment.