Skip to content

Commit

Permalink
resolve json object attribute (#154)
Browse files Browse the repository at this point in the history
* resolve json object attribute

* remove unused imports

* bump @themost/query

* 2.14.1
  • Loading branch information
kbarbounakis authored Aug 14, 2024
1 parent 1b86568 commit c8bd147
Show file tree
Hide file tree
Showing 7 changed files with 52 additions and 21 deletions.
6 changes: 3 additions & 3 deletions data-attribute-resolver.d.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { QueryEntity, QueryField } from '@themost/query';
import {MethodCallExpression, QueryEntity, QueryField} from '@themost/query';

export declare class DataAttributeResolver {
orderByNestedAttribute(attr: string): any;
selectNestedAttribute(attr: string): any;
selectAggregatedAttribute(aggregation: string, attribute: string, alias: string): any;
resolveNestedAttribute(attr: string): any;
resolveNestedAttributeJoin(memberExpr: string): { $select?: QueryField, $expand?: QueryEntity[] };
resolveNestedAttributeJoin(memberExpr: string): { $select?: QueryField | MethodCallExpression, $expand?: QueryEntity[] };
testAttribute(s: string): any;
testAggregatedNestedAttribute(s: string): any;
testNestedAttribute(s: string): any;
resolveJunctionAttributeJoin(attr: string): { $select?: QueryField, $expand?: QueryEntity[] };
resolveJunctionAttributeJoin(attr: string): { $select?: QueryField | MethodCallExpression, $expand?: QueryEntity[] };
}
21 changes: 19 additions & 2 deletions data-attribute-resolver.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
var {QueryField, QueryEntity, QueryUtils} = require('@themost/query');
var {QueryField, QueryEntity, QueryUtils, MethodCallExpression, MemberExpression, Expression} = require('@themost/query');
var {sprintf} = require('sprintf-js');
var _ = require('lodash');
var {DataError} = require('@themost/common');
Expand Down Expand Up @@ -89,6 +89,11 @@ DataAttributeResolver.prototype.resolveNestedAttribute = function(attr) {
};
// and pass member expression
expr = new DataAttributeResolver().resolveNestedAttributeJoin.call(self.model, memberExpr);
// if expr.$select is an instance of Expression then return it
// important note: this operation is very important in cases where a json object is selected
if (expr && expr.$select instanceof Expression) {
return expr.$select;
}
//select field
if (member.length>2) {
if (memberExpr.name !== attr) {
Expand Down Expand Up @@ -178,6 +183,18 @@ DataAttributeResolver.prototype.resolveNestedAttributeJoin = function(memberExpr
//search for field mapping
var mapping = self.inferMapping(arrMember[0]);
if (_.isNil(mapping)) {
// add support for json objects
if (attrMember.type === 'Json') {
var collection = self[aliasProperty] || self.viewAdapter;
var objectPath = arrMember.join('.');
var objectGet = new MethodCallExpression('jsonGet', [
new MemberExpression(collection + '.' + objectPath)
]);
return {
$select: objectGet,
$expand: []
}
}
throw new Error(sprintf('The target model does not have an association defined for attribute named %s',arrMember[0]));
}
if (mapping.childModel===self.name && mapping.associationType==='association') {
Expand Down Expand Up @@ -647,4 +664,4 @@ DataAttributeResolver.prototype.resolveZeroOrOneNestedAttribute = function(attr)

module.exports = {
DataAttributeResolver
}
}
3 changes: 3 additions & 0 deletions data-filter-resolver.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ function DataFilterResolver() {
}

DataFilterResolver.prototype.resolveMember = function(member, callback) {
if (typeof member !== 'string') {
return callback(null, member);
}
if (/\//.test(member)) {
var arr = member.split('/');
callback(null, arr.slice(arr.length-2).join('.'));
Expand Down
18 changes: 12 additions & 6 deletions data-model.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ var {sprintf} = require('sprintf-js');
var Symbol = require('symbol');
var pluralize = require('pluralize');
var async = require('async');
var {QueryUtils} = require('@themost/query');
var {QueryUtils, Expression} = require('@themost/query');
var {OpenDataParser} = require('@themost/query');
var types = require('./types');
var {DataAssociationMapping} = require('./types');
Expand Down Expand Up @@ -785,7 +785,11 @@ function filterInternal(params, callback) {
else {
expr = DataAttributeResolver.prototype.resolveNestedAttributeJoin.call(self, member);
if (expr.$select) {
member = expr.$select.$name.replace(/\./g,'/');
if (expr.$select instanceof Expression) {
member = expr.$select;
} else {
member = expr.$select.$name.replace(/\./g, '/');
}
}
}
if (expr && expr.$expand) {
Expand All @@ -812,16 +816,18 @@ function filterInternal(params, callback) {
return;
}
}
if (typeof self.resolveMember === 'function')
if (typeof self.resolveMember === 'function') {
self.resolveMember.call(self, member, cb);
else
} else {
DataFilterResolver.prototype.resolveMember.call(self, member, cb);
}
};
parser.resolveMethod = function(name, args, cb) {
if (typeof self.resolveMethod === 'function')
if (typeof self.resolveMethod === 'function') {
self.resolveMethod.call(self, name, args, cb);
else
} else {
DataFilterResolver.prototype.resolveMethod.call(self, name, args, cb);
}
};
var filter;

Expand Down
7 changes: 6 additions & 1 deletion data-queryable.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ var {TextUtils} = require('@themost/common');
var {DataMappingExtender} = require('./data-mapping-extensions');
var {DataAssociationMapping} = require('./types');
var {DataError} = require('@themost/common');
var {QueryField} = require('@themost/query');
var {QueryField, Expression} = require('@themost/query');
var {QueryEntity} = require('@themost/query');
var {QueryUtils} = require('@themost/query');
var Q = require('q');
Expand All @@ -32,6 +32,11 @@ function resolveJoinMember(target) {
member: member[1]
})
}
if (expr instanceof Expression) {
Object.assign(event, {
member: expr
})
}
}
}

Expand Down
12 changes: 6 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@themost/data",
"version": "2.14.0",
"version": "2.14.1",
"description": "MOST Web Framework Codename Blueshift - Data module",
"main": "index.js",
"scripts": {
Expand All @@ -9,7 +9,7 @@
},
"peerDependencies": {
"@themost/common": "^2.10.4",
"@themost/query": ">=2.13.1",
"@themost/query": ">=2.14.1",
"@themost/xml": "^2"
},
"engines": {
Expand Down Expand Up @@ -43,7 +43,7 @@
"@babel/preset-typescript": "^7.16.7",
"@themost/common": "^2.10.4",
"@themost/peers": "^1.0.2",
"@themost/query": "^2.13.1",
"@themost/query": "^2.14.1",
"@themost/sqlite": "^2.6.16",
"@themost/xml": "^2.5.2",
"@types/core-js": "^2.5.0",
Expand Down

0 comments on commit c8bd147

Please sign in to comment.