Skip to content

Commit

Permalink
feat: support the LimitedRank property in a hierarchy (#813)
Browse files Browse the repository at this point in the history
* feat: support the LimitedRank property in a hierarchy

* fix the basic test

* Create spotty-cups-warn.md

* fix the complex test

---------

Co-authored-by: Nicolas Lunet <nicolas.lunet@sap.com>
  • Loading branch information
vescalier and nlunets committed Apr 29, 2024
1 parent db559aa commit a103f9d
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 17 deletions.
5 changes: 5 additions & 0 deletions .changeset/spotty-cups-warn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@sap-ux/fe-mockserver-core": patch
---

feat: support the LimitedRank property in a hierarchy
30 changes: 14 additions & 16 deletions packages/fe-mockserver-core/src/data/dataAccess.ts
Original file line number Diff line number Diff line change
Expand Up @@ -761,22 +761,6 @@ export class DataAccess implements DataAccessInterface {
);

const mockEntitySet = await this.getMockEntitySet((currentEntitySet ?? currentEntityType).name);

// Apply $filter
if (odataRequest.filterDefinition && Array.isArray(data)) {
const filterDef = odataRequest.filterDefinition;

data = data.filter((dataLine) => {
return mockEntitySet.checkFilter(dataLine, filterDef, odataRequest.tenantId, odataRequest);
});
}
// Apply $search
if (odataRequest.searchQuery && Array.isArray(data)) {
data = data.filter((dataLine) => {
return mockEntitySet.checkSearch(dataLine, odataRequest.searchQuery, odataRequest);
});
}

// Apply $apply for aggregates
const applyDefinition = odataRequest.applyDefinition;
if (applyDefinition) {
Expand All @@ -792,6 +776,20 @@ export class DataAccess implements DataAccessInterface {
);
}
}
// Apply $filter
if (odataRequest.filterDefinition && Array.isArray(data)) {
const filterDef = odataRequest.filterDefinition;

data = data.filter((dataLine) => {
return mockEntitySet.checkFilter(dataLine, filterDef, odataRequest.tenantId, odataRequest);
});
}
// Apply $search
if (odataRequest.searchQuery && Array.isArray(data)) {
data = data.filter((dataLine) => {
return mockEntitySet.checkSearch(dataLine, odataRequest.searchQuery, odataRequest);
});
}

// Apply $orderby
if (odataRequest.orderBy && odataRequest.orderBy.length > 0) {
Expand Down
12 changes: 12 additions & 0 deletions packages/fe-mockserver-core/src/mockdata/fileBasedMockData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ type HierarchyDefinition = {
matchedDescendantCountProperty: string | undefined;
matchedProperty: string | undefined;
limitedDescendantCountProperty: string | undefined;
limitedRankProperty: string | undefined;
sourceReference: string;
};

Expand Down Expand Up @@ -204,6 +205,10 @@ export class FileBasedMockData {
deleteData(mockEntry, hierarchyDefinition.distanceFromRootProperty);
delete mockEntry[hierarchyDefinition.distanceFromRootProperty];
}
if (hierarchyDefinition.limitedRankProperty) {
deleteData(mockEntry, hierarchyDefinition.limitedRankProperty);
delete mockEntry[hierarchyDefinition.limitedRankProperty];
}
}

async addEntry(mockEntry: any, _odataRequest: ODataRequest): Promise<void> {
Expand Down Expand Up @@ -1017,6 +1022,11 @@ export class FileBasedMockData {
outData.push(item);
}
});
if (hierarchyDefinition.limitedRankProperty) {
outData.forEach((item, dataIdx) => {
setData(item, hierarchyDefinition.limitedRankProperty!, dataIdx);
});
}
// restrict tree data with skiplocation && skipcontext
if (_odataRequest.skipLocation) {
let skipLocation = _odataRequest.skipLocation.split('(')[1].split(')')[0];
Expand Down Expand Up @@ -1147,6 +1157,7 @@ export class FileBasedMockData {
getPathOrPropertyPath(
hierarchyAnnotation.LimitedDescendantCount ?? hierarchyAnnotation.LimitedDescendantCountProperty
) ?? '$$limitedDescendantCountProperty',
limitedRankProperty: getPathOrPropertyPath(hierarchyAnnotation.LimitedRank),
matchedDescendantCountProperty:
getPathOrPropertyPath(
hierarchyAnnotation.MatchedDescendantCount ?? hierarchyAnnotation.MatchedDescendantCountProperty
Expand All @@ -1167,6 +1178,7 @@ export class FileBasedMockData {
limitedDescendantCountProperty: getPathOrPropertyPath(
hierarchyAnnotation.LimitedDescendantCount ?? hierarchyAnnotation.LimitedDescendantCountProperty
),
limitedRankProperty: getPathOrPropertyPath(hierarchyAnnotation.LimitedRank),
matchedDescendantCountProperty: getPathOrPropertyPath(
hierarchyAnnotation.MatchedDescendantCount ?? hierarchyAnnotation.MatchedDescendantCountProperty
),
Expand Down
101 changes: 101 additions & 0 deletions packages/fe-mockserver-core/test/unit/v4/hierarchyAccess.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1668,6 +1668,106 @@ describe('Hierarchy Access', () => {
`);
});

test('Limited rank - no filter', async () => {
const odataRequest = new ODataRequest(
{
method: 'GET',
url: '/SalesOrganizations?$apply=com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/SalesOrganizations,HierarchyQualifier=\'SalesOrgHierarchy\',NodeProperty=\'ID\',Levels=2,ExpandLevels=[{"NodeID":"US","Levels":1}])&$count=true&$select=Name,LimitedRank'
},
dataAccess
);
expect(odataRequest.applyDefinition).toMatchInlineSnapshot(`
[
{
"name": "com.sap.vocabularies.Hierarchy.v1.TopLevels",
"parameters": {
"ExpandLevels": [
{
""Levels"": "1",
""NodeID"": ""US"",
},
],
"HierarchyNodes": "$root/SalesOrganizations",
"HierarchyQualifier": "'SalesOrgHierarchy'",
"Levels": "2",
"NodeProperty": "'ID'",
},
"type": "customFunction",
},
]
`);
const data = await dataAccess.getData(odataRequest);
expect(data).toMatchInlineSnapshot(`
[
{
"ID": "Sales",
"LimitedRank": 0,
"Name": "Corporate Sales",
},
{
"ID": "EMEA",
"LimitedRank": 1,
"Name": "EMEA",
},
{
"ID": "US",
"LimitedRank": 2,
"Name": "US",
},
{
"ID": "US West",
"LimitedRank": 3,
"Name": "US West",
},
{
"ID": "US East",
"LimitedRank": 4,
"Name": "US East",
},
]
`);
});

test('Limited rank - with filter', async () => {
const odataRequest = new ODataRequest(
{
method: 'GET',
url: '/SalesOrganizations?$apply=com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/SalesOrganizations,HierarchyQualifier=\'SalesOrgHierarchy\',NodeProperty=\'ID\',Levels=2,ExpandLevels=[{"NodeID":"US","Levels":1}])&$count=true&$filter=ID%20eq%20\'US West\'&$select=Name,LimitedRank'
},
dataAccess
);
expect(odataRequest.applyDefinition).toMatchInlineSnapshot(`
[
{
"name": "com.sap.vocabularies.Hierarchy.v1.TopLevels",
"parameters": {
"ExpandLevels": [
{
""Levels"": "1",
""NodeID"": ""US"",
},
],
"HierarchyNodes": "$root/SalesOrganizations",
"HierarchyQualifier": "'SalesOrgHierarchy'",
"Levels": "2",
"NodeProperty": "'ID'",
},
"type": "customFunction",
},
]
`);
const data = await dataAccess.getData(odataRequest);
expect(data).toMatchInlineSnapshot(`
[
{
"ID": "US West",
"LimitedRank": 3,
"Name": "US West",
},
]
`);
});

test('9 - Create new root and a child', async () => {
const createRequest = new ODataRequest(
{
Expand Down Expand Up @@ -1810,6 +1910,7 @@ describe('Hierarchy Access', () => {
"DrillState": "",
"ID": "APJ",
"LimitedDescendantCount": 0,
"LimitedRank": 0,
"Matched": false,
"MatchedDescendantCount": 0,
"Name": "APJ",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ service v4tree {
DistanceFromRoot: DistanceFromRoot,
DrillState: DrillState,
Matched: Matched,
MatchedDescendantCount: MatchedDescendantCount
MatchedDescendantCount: MatchedDescendantCount,
LimitedRank : LimitedRank,
}
@Capabilities.FilterRestrictions: {
NonFilterableProperties: [LimitedDescendantCount,DistanceFromRoot,DrillState,Matched,MatchedDescendantCount]
Expand All @@ -33,6 +34,8 @@ service v4tree {
Matched : Boolean;
@Core.Computed: true
MatchedDescendantCount : Integer64;
@Core.Computed: true
LimitedRank : Integer64;
};

@Aggregation.RecursiveHierarchy#ProductsHierarchy: {
Expand Down

0 comments on commit a103f9d

Please sign in to comment.