Skip to content

Commit

Permalink
Merge pull request #38 from quanho/hva/modifiers-update-2
Browse files Browse the repository at this point in the history
fix(modifiers): update expression generation
  • Loading branch information
quanho committed Oct 18, 2019
2 parents 07b0bac + 8f6b2ec commit 3b73dc1
Show file tree
Hide file tree
Showing 7 changed files with 136 additions and 98 deletions.
50 changes: 25 additions & 25 deletions src/expression-modifiers/accumulation/__tests__/index.spec.js

Large diffs are not rendered by default.

5 changes: 4 additions & 1 deletion src/expression-modifiers/accumulation/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,10 @@ export default {
const dim1Comp = helper.getDimComp(dimensions, 1, libraryItemsProps);
const dim2Comp = helper.getDimComp(dimensions, 0, libraryItemsProps);
const aggrComp = helper.getAggrComp(generatedExpression, dim1Comp, dim2Comp);
generatedExpression = aggrComp;
generatedExpression = !modifier.showExcludedValues ? aggrComp
: helper.getExcludedComp({
modifier, dimensions, libraryItemsProps, dimensionAndFieldList, valueComp: aggrComp,
});
}
return generatedExpression;
},
Expand Down
26 changes: 13 additions & 13 deletions src/expression-modifiers/difference/__tests__/index.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,15 +82,15 @@ describe('difference', () => {
expression, modifier, properties, libraryItemsProps, dimensionAndFieldList,
});

expect(outputExpression).to.equal('If(Count([dim1]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={">=$(=Min([dim1]))<=$(=Max([dim1]))"}>}0), 0) - Above(If(Count([dim1]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={">=$(=Min([dim1]))<=$(=Max([dim1]))"}>}0), 0))');
expect(outputExpression).to.equal('If(Count(dim1) > 0, ( Sum(Sales) ) + Sum({1<dim1={">=$(=Min(dim1))<=$(=Max(dim1))"}>}0), 0) - Above(If(Count(dim1) > 0, ( Sum(Sales) ) + Sum({1<dim1={">=$(=Min(dim1))<=$(=Max(dim1))"}>}0), 0))');
});

it('should generate correct expression when dimension is non-numeric', () => {
outputExpression = difference.generateExpression({
expression, modifier, properties, libraryItemsProps,
});

expect(outputExpression).to.equal('If(Count([dim1]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={"=Only({1}[dim1])>=\'$(=MinString([dim1]))\' and Only({1}[dim1])<=\'$(=MaxString([dim1]))\'"}>}0), 0) - Above(If(Count([dim1]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={"=Only({1}[dim1])>=\'$(=MinString([dim1]))\' and Only({1}[dim1])<=\'$(=MaxString([dim1]))\'"}>}0), 0))');
expect(outputExpression).to.equal('If(Count(dim1) > 0, ( Sum(Sales) ) + Sum({1<dim1={"=Only({1}dim1)>=\'$(=MinString(dim1))\' and Only({1}dim1)<=\'$(=MaxString(dim1))\'"}>}0), 0) - Above(If(Count(dim1) > 0, ( Sum(Sales) ) + Sum({1<dim1={"=Only({1}dim1)>=\'$(=MinString(dim1))\' and Only({1}dim1)<=\'$(=MaxString(dim1))\'"}>}0), 0))');
});
});

Expand Down Expand Up @@ -133,15 +133,15 @@ describe('difference', () => {
expression, modifier, properties, libraryItemsProps, dimensionAndFieldList,
});

expect(outputExpression).to.equal('Aggr(If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={">=$(=Min([dim1]))<=$(=Max([dim1]))"},[dim2]={">=$(=Min([dim2]))<=$(=Max([dim2]))"}>}0), 0) - Above(Total If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={">=$(=Min([dim1]))<=$(=Max([dim1]))"},[dim2]={">=$(=Min([dim2]))<=$(=Max([dim2]))"}>}0), 0)), [dim2], [dim1])');
expect(outputExpression).to.equal('Only({1<dim1={">=$(=Min(dim1))<=$(=Max(dim1))"},dim2={">=$(=Min(dim2))<=$(=Max(dim2))"}>}Aggr(If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={">=$(=Min(dim1))<=$(=Max(dim1))"},dim2={">=$(=Min(dim2))<=$(=Max(dim2))"}>}0), 0) - Above(Total If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={">=$(=Min(dim1))<=$(=Max(dim1))"},dim2={">=$(=Min(dim2))<=$(=Max(dim2))"}>}0), 0)), dim2, dim1))');
});

it('should generate correct expression when dimension is non-numeric', () => {
outputExpression = difference.generateExpression({
expression, modifier, properties, libraryItemsProps,
});

expect(outputExpression).to.equal('Aggr(If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={"=Only({1}[dim1])>=\'$(=MinString([dim1]))\' and Only({1}[dim1])<=\'$(=MaxString([dim1]))\'"},[dim2]={"=Only({1}[dim2])>=\'$(=MinString([dim2]))\' and Only({1}[dim2])<=\'$(=MaxString([dim2]))\'"}>}0), 0) - Above(Total If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={"=Only({1}[dim1])>=\'$(=MinString([dim1]))\' and Only({1}[dim1])<=\'$(=MaxString([dim1]))\'"},[dim2]={"=Only({1}[dim2])>=\'$(=MinString([dim2]))\' and Only({1}[dim2])<=\'$(=MaxString([dim2]))\'"}>}0), 0)), [dim2], [dim1])');
expect(outputExpression).to.equal('Only({1<dim1={"=Only({1}dim1)>=\'$(=MinString(dim1))\' and Only({1}dim1)<=\'$(=MaxString(dim1))\'"},dim2={"=Only({1}dim2)>=\'$(=MinString(dim2))\' and Only({1}dim2)<=\'$(=MaxString(dim2))\'"}>}Aggr(If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={"=Only({1}dim1)>=\'$(=MinString(dim1))\' and Only({1}dim1)<=\'$(=MaxString(dim1))\'"},dim2={"=Only({1}dim2)>=\'$(=MinString(dim2))\' and Only({1}dim2)<=\'$(=MaxString(dim2))\'"}>}0), 0) - Above(Total If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={"=Only({1}dim1)>=\'$(=MinString(dim1))\' and Only({1}dim1)<=\'$(=MaxString(dim1))\'"},dim2={"=Only({1}dim2)>=\'$(=MinString(dim2))\' and Only({1}dim2)<=\'$(=MaxString(dim2))\'"}>}0), 0)), dim2, dim1))');
});
});

Expand All @@ -155,7 +155,7 @@ describe('difference', () => {
expression, modifier, properties, libraryItemsProps,
});

expect(outputExpression).to.equal('Aggr( ( Sum(Sales) ) - Above(Total ( Sum(Sales) ) ), [dim2], [dim1])');
expect(outputExpression).to.equal('Aggr( ( Sum(Sales) ) - Above(Total ( Sum(Sales) ) ), dim2, dim1)');
});
});
});
Expand All @@ -175,15 +175,15 @@ describe('difference', () => {
expression, modifier, properties, libraryItemsProps, dimensionAndFieldList,
});

expect(outputExpression).to.equal('Aggr(If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={">=$(=Min([dim1]))<=$(=Max([dim1]))"},[dim2]={">=$(=Min([dim2]))<=$(=Max([dim2]))"}>}0), 0) - Above(If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={">=$(=Min([dim1]))<=$(=Max([dim1]))"},[dim2]={">=$(=Min([dim2]))<=$(=Max([dim2]))"}>}0), 0)), [dim2], [dim1])');
expect(outputExpression).to.equal('Only({1<dim1={">=$(=Min(dim1))<=$(=Max(dim1))"},dim2={">=$(=Min(dim2))<=$(=Max(dim2))"}>}Aggr(If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={">=$(=Min(dim1))<=$(=Max(dim1))"},dim2={">=$(=Min(dim2))<=$(=Max(dim2))"}>}0), 0) - Above(If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={">=$(=Min(dim1))<=$(=Max(dim1))"},dim2={">=$(=Min(dim2))<=$(=Max(dim2))"}>}0), 0)), dim2, dim1))');
});

it('should generate correct expression when dimension is non-numeric', () => {
outputExpression = difference.generateExpression({
expression, modifier, properties, libraryItemsProps,
});

expect(outputExpression).to.equal('Aggr(If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={"=Only({1}[dim1])>=\'$(=MinString([dim1]))\' and Only({1}[dim1])<=\'$(=MaxString([dim1]))\'"},[dim2]={"=Only({1}[dim2])>=\'$(=MinString([dim2]))\' and Only({1}[dim2])<=\'$(=MaxString([dim2]))\'"}>}0), 0) - Above(If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={"=Only({1}[dim1])>=\'$(=MinString([dim1]))\' and Only({1}[dim1])<=\'$(=MaxString([dim1]))\'"},[dim2]={"=Only({1}[dim2])>=\'$(=MinString([dim2]))\' and Only({1}[dim2])<=\'$(=MaxString([dim2]))\'"}>}0), 0)), [dim2], [dim1])');
expect(outputExpression).to.equal('Only({1<dim1={"=Only({1}dim1)>=\'$(=MinString(dim1))\' and Only({1}dim1)<=\'$(=MaxString(dim1))\'"},dim2={"=Only({1}dim2)>=\'$(=MinString(dim2))\' and Only({1}dim2)<=\'$(=MaxString(dim2))\'"}>}Aggr(If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={"=Only({1}dim1)>=\'$(=MinString(dim1))\' and Only({1}dim1)<=\'$(=MaxString(dim1))\'"},dim2={"=Only({1}dim2)>=\'$(=MinString(dim2))\' and Only({1}dim2)<=\'$(=MaxString(dim2))\'"}>}0), 0) - Above(If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={"=Only({1}dim1)>=\'$(=MinString(dim1))\' and Only({1}dim1)<=\'$(=MaxString(dim1))\'"},dim2={"=Only({1}dim2)>=\'$(=MinString(dim2))\' and Only({1}dim2)<=\'$(=MaxString(dim2))\'"}>}0), 0)), dim2, dim1))');
});
});

Expand All @@ -197,7 +197,7 @@ describe('difference', () => {
expression, modifier, properties, libraryItemsProps,
});

expect(outputExpression).to.equal('Aggr( ( Sum(Sales) ) - Above( ( Sum(Sales) ) ), [dim2], [dim1])');
expect(outputExpression).to.equal('Aggr( ( Sum(Sales) ) - Above( ( Sum(Sales) ) ), dim2, dim1)');
});
});
});
Expand All @@ -223,15 +223,15 @@ describe('difference', () => {
expression, modifier, properties, libraryItemsProps, dimensionAndFieldList,
});

expect(outputExpression).to.equal('If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={">=$(=Min([dim1]))<=$(=Max([dim1]))"},[dim2]={">=$(=Min([dim2]))<=$(=Max([dim2]))"}>}0), 0) - Above(Total If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={">=$(=Min([dim1]))<=$(=Max([dim1]))"},[dim2]={">=$(=Min([dim2]))<=$(=Max([dim2]))"}>}0), 0))');
expect(outputExpression).to.equal('If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={">=$(=Min(dim1))<=$(=Max(dim1))"},dim2={">=$(=Min(dim2))<=$(=Max(dim2))"}>}0), 0) - Above(Total If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={">=$(=Min(dim1))<=$(=Max(dim1))"},dim2={">=$(=Min(dim2))<=$(=Max(dim2))"}>}0), 0))');
});

it('should generate correct expression when dimension is non-numeric', () => {
outputExpression = difference.generateExpression({
expression, modifier, properties, libraryItemsProps,
});

expect(outputExpression).to.equal('If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={"=Only({1}[dim1])>=\'$(=MinString([dim1]))\' and Only({1}[dim1])<=\'$(=MaxString([dim1]))\'"},[dim2]={"=Only({1}[dim2])>=\'$(=MinString([dim2]))\' and Only({1}[dim2])<=\'$(=MaxString([dim2]))\'"}>}0), 0) - Above(Total If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={"=Only({1}[dim1])>=\'$(=MinString([dim1]))\' and Only({1}[dim1])<=\'$(=MaxString([dim1]))\'"},[dim2]={"=Only({1}[dim2])>=\'$(=MinString([dim2]))\' and Only({1}[dim2])<=\'$(=MaxString([dim2]))\'"}>}0), 0))');
expect(outputExpression).to.equal('If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={"=Only({1}dim1)>=\'$(=MinString(dim1))\' and Only({1}dim1)<=\'$(=MaxString(dim1))\'"},dim2={"=Only({1}dim2)>=\'$(=MinString(dim2))\' and Only({1}dim2)<=\'$(=MaxString(dim2))\'"}>}0), 0) - Above(Total If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={"=Only({1}dim1)>=\'$(=MinString(dim1))\' and Only({1}dim1)<=\'$(=MaxString(dim1))\'"},dim2={"=Only({1}dim2)>=\'$(=MinString(dim2))\' and Only({1}dim2)<=\'$(=MaxString(dim2))\'"}>}0), 0))');
});
});

Expand Down Expand Up @@ -265,15 +265,15 @@ describe('difference', () => {
expression, modifier, properties, libraryItemsProps, dimensionAndFieldList,
});

expect(outputExpression).to.equal('If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={">=$(=Min([dim1]))<=$(=Max([dim1]))"},[dim2]={">=$(=Min([dim2]))<=$(=Max([dim2]))"}>}0), 0) - Above(If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={">=$(=Min([dim1]))<=$(=Max([dim1]))"},[dim2]={">=$(=Min([dim2]))<=$(=Max([dim2]))"}>}0), 0))');
expect(outputExpression).to.equal('If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={">=$(=Min(dim1))<=$(=Max(dim1))"},dim2={">=$(=Min(dim2))<=$(=Max(dim2))"}>}0), 0) - Above(If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={">=$(=Min(dim1))<=$(=Max(dim1))"},dim2={">=$(=Min(dim2))<=$(=Max(dim2))"}>}0), 0))');
});

it('should generate correct expression when dimension is non-numeric', () => {
outputExpression = difference.generateExpression({
expression, modifier, properties, libraryItemsProps,
});

expect(outputExpression).to.equal('If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={"=Only({1}[dim1])>=\'$(=MinString([dim1]))\' and Only({1}[dim1])<=\'$(=MaxString([dim1]))\'"},[dim2]={"=Only({1}[dim2])>=\'$(=MinString([dim2]))\' and Only({1}[dim2])<=\'$(=MaxString([dim2]))\'"}>}0), 0) - Above(If(Count([dim1]) * Count([dim2]) > 0, ( Sum(Sales) ) + Sum({1<[dim1]={"=Only({1}[dim1])>=\'$(=MinString([dim1]))\' and Only({1}[dim1])<=\'$(=MaxString([dim1]))\'"},[dim2]={"=Only({1}[dim2])>=\'$(=MinString([dim2]))\' and Only({1}[dim2])<=\'$(=MaxString([dim2]))\'"}>}0), 0))');
expect(outputExpression).to.equal('If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={"=Only({1}dim1)>=\'$(=MinString(dim1))\' and Only({1}dim1)<=\'$(=MaxString(dim1))\'"},dim2={"=Only({1}dim2)>=\'$(=MinString(dim2))\' and Only({1}dim2)<=\'$(=MaxString(dim2))\'"}>}0), 0) - Above(If(Count(dim1) * Count(dim2) > 0, ( Sum(Sales) ) + Sum({1<dim1={"=Only({1}dim1)>=\'$(=MinString(dim1))\' and Only({1}dim1)<=\'$(=MaxString(dim1))\'"},dim2={"=Only({1}dim2)>=\'$(=MinString(dim2))\' and Only({1}dim2)<=\'$(=MaxString(dim2))\'"}>}0), 0))');
});
});

Expand All @@ -299,7 +299,7 @@ describe('difference', () => {
describe('extractExpression', () => {
describe('One dimension', () => {
beforeEach(() => {
properties.qHyperCubeDef.qDimensions = [dim1];
properties.qHyperCubeDef.qDimensions = dim1;
});

describe('showExcludedValues = true', () => {
Expand Down
5 changes: 4 additions & 1 deletion src/expression-modifiers/difference/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,10 @@ export default {
const dim1Comp = helper.getDimComp(dimensions, 1, libraryItemsProps);
const dim2Comp = helper.getDimComp(dimensions, 0, libraryItemsProps);
const aggrComp = helper.getAggrComp(generatedExpression, dim1Comp, dim2Comp);
generatedExpression = aggrComp;
generatedExpression = !modifier.showExcludedValues ? aggrComp
: helper.getExcludedComp({
modifier, dimensions, libraryItemsProps, dimensionAndFieldList, funcComp: 'Only', valueComp: aggrComp,
});
}
return generatedExpression;
},
Expand Down
45 changes: 37 additions & 8 deletions src/expression-modifiers/helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,28 @@ function getRowNoComp(modifier, numDimensions) {
return numDimensions === 2 && crossAllDimensions ? 'RowNo(Total)' : 'RowNo()';
}

function stripLineComments(expression) {
return expression.replace(/\/\/(.*)$/gm, '');
}

function stripBlockComments(expression) {
return expression.replace(/\/\*[^]*?\*\//g, '');
}

function stripComments(expression) {
if (!expression) {
return '';
}
// eslint-disable-next-line no-param-reassign
expression = stripLineComments(expression);
// eslint-disable-next-line no-param-reassign
expression = stripBlockComments(expression);
return expression.trim();
}

function simplifyExpression(expression) {
const s = expression.trim();
const exp = stripComments(expression);
const s = exp.trim();
const expComp = s.substring(0, 1) === '=' ? s.substring(1).trim() : s;
return expComp;
}
Expand All @@ -106,14 +126,25 @@ function getDimSortCriterias(dimensions, dimIdx = 0) {

function getDimDef(dimensions, dimIdx = 0, libraryItemsProps) {
const dimension = dimensions[dimIdx];
return dimension.qLibraryId
const dimDef = dimension.qLibraryId
? libraryItemsProps[dimension.qLibraryId].qDim.qFieldDefs[0]
: dimension.qDef.qFieldDefs[0];
return stripComments(dimDef);
}

function escapeField(field) {
if (!field || field === ']') {
return field;
}
if (/^[A-Za-z][A-Za-z0-9_]*$/.test(field)) {
return field;
}
return `[${field.replace(/\]/g, ']]')}]`;
}

function getDimDefWithWrapper(dimensions, dimIdx = 0, libraryItemsProps) {
const dimDef = getDimDef(dimensions, dimIdx, libraryItemsProps);
return `[${dimDef}]`;
return escapeField(dimDef);
}

function getDimComp(dimensions, dimIdx, libraryItemsProps) {
Expand Down Expand Up @@ -166,14 +197,12 @@ function getRangeLimit(isDimNumeric, dim) {
}

function getExcludedComp({
modifier = {}, dimensions, libraryItemsProps, dimensionAndFieldList,
modifier = {}, dimensions, libraryItemsProps, dimensionAndFieldList, funcComp = 'Sum', valueComp = '0',
}) {
const { showExcludedValues } = modifier;
if (!showExcludedValues) {
return '';
}
const valueComp = '0';
const funcComp = 'Sum';
if (dimensions && dimensions.length === 1) {
const isDim1Numeric = isNumeric(dimensions[0], dimensionAndFieldList);
const dim1 = getDimDefWithWrapper(dimensions, 0, libraryItemsProps);
Expand Down Expand Up @@ -202,7 +231,7 @@ function getExpressionWithExcludedComp({
return expWithMarkersComp;
}
const excludedComp = getExcludedComp({
modifier, dimensions, libraryItemsProps, dimensionAndFieldList, treatMissingAsNull,
modifier, dimensions, libraryItemsProps, dimensionAndFieldList,
});
const valueComp = treatMissingAsNull ? '' : ', 0';
if (dimensions && dimensions.length === 1) {
Expand Down Expand Up @@ -242,7 +271,7 @@ function getNumDimensions({ properties, layout }) {

function needDimension({ modifier, properties, layout }) {
const primaryDimension = getPrimaryDimension(modifier);
return getNumDimensions({ properties, layout }) === 2 && primaryDimension === 0;
return primaryDimension === 0 && getNumDimensions({ properties, layout }) === 2;
}

function extractInputExpression({
Expand Down
Loading

0 comments on commit 3b73dc1

Please sign in to comment.