@lcap/nasl
Version:
NetEase Application Specific Language
345 lines • 14.1 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.genEditQueryStructure = exports.joinEntity = exports.genQueryLogic = exports.genQueryAssignment = exports.genWhereExpression = exports.genQueryStructure = void 0;
const utils = __importStar(require("../utils"));
const concepts_1 = require("../concepts");
const utils_1 = require("./utils");
function genQueryStructure(allEntities, nameGroup) {
allEntities = Array.from(new Set(allEntities));
return utils_1.NaslNode.Structure({
name: nameGroup.structure,
origin: 'CallQueryComponent',
properties: allEntities.map((entity) => utils_1.NaslNode.StructureProperty({
name: utils.firstLowerCase(entity.name),
typeAnnotation: utils_1.NaslTypeAnnotation.Reference({
typeNamespace: entity.getNamespace(),
typeName: entity.name,
}),
})),
});
}
exports.genQueryStructure = genQueryStructure;
function genWhereExpression(entity) {
const properties = entity.properties.filter((property) => property?.display.inFilter);
const expressions = properties.map((property) => {
const res = utils_1.NaslLogicItem.BinaryExpression({
left: utils_1.NaslQueryExpression.QueryFieldExpression({
label: '查询组件实体属性',
isDotStar: false,
entityAsName: entity.name,
propertyName: property.name,
}),
right: utils_1.NaslLogicItem.MemberExpression({
object: utils_1.NaslLogicItem.Identifier({
name: 'filter',
}),
property: utils_1.NaslLogicItem.Identifier({
name: property.name,
}),
}),
operator: '==',
});
if (!property.relationEntity && ['String', 'Text'].includes(property.typeAnnotation.typeName)) {
Object.assign(res, {
operator: 'like',
});
}
return res;
});
function transList2Tree(arr) {
if (arr.length <= 1)
return arr[0];
const len = arr.length;
const mid = len >> 1;
const left = arr.slice(0, mid);
const right = arr.slice(mid);
return utils_1.NaslLogicItem.BinaryExpression({
operator: '&&',
left: transList2Tree(left),
right: transList2Tree(right),
});
}
return transList2Tree(expressions);
}
exports.genWhereExpression = genWhereExpression;
function genQueryAssignment(allEntities, nameGroup, supportFilter, supportSort) {
allEntities = Array.from(allEntities);
const entity = allEntities.shift();
const moduleNode = entity.app;
const moduleNamespace = moduleNode?.getNamespace();
const from = utils_1.NaslQueryExpression.QueryFromExpression({
entityNamespace: entity.getNamespace(),
entityName: entity.name,
joinParts: allEntities.map((relationEntity) => {
const onExpressions = entity.properties
?.filter((property) => property.relationEntity === relationEntity.name)
.map((leftProperty) => utils_1.NaslLogicItem.BinaryExpression({
operator: '==',
left: utils_1.NaslQueryExpression.QueryFieldExpression({
label: '查询组件实体属性',
isDotStar: false,
entityAsName: entity.name,
propertyName: leftProperty.name,
}),
right: utils_1.NaslQueryExpression.QueryFieldExpression({
label: '查询组件实体属性',
isDotStar: false,
entityAsName: relationEntity.name,
propertyName: leftProperty.relationProperty,
}),
}));
return utils_1.NaslQueryExpression.QueryJoinExpression({
entityNamespace: relationEntity.getNamespace(),
entityName: relationEntity.name,
joinType: 'LEFT',
onExpressions,
joinParts: [],
});
}),
});
const selectElements = [];
selectElements.push(concepts_1.QueryFieldExpression.from({
entityAsName: entity.name,
isDotStar: true,
}));
from.joinParts.forEach((joinPart) => {
selectElements.push(concepts_1.QueryFieldExpression.from({
entityAsName: joinPart.entityName,
isDotStar: true,
}));
});
const select = utils_1.NaslQueryExpression.QuerySelectExpression({
label: '查询组件Select子句',
distinct: false,
star: true,
selectElements,
});
const where = supportFilter ? genWhereExpression(entity) : undefined;
const aStructureProperties = [
utils_1.NaslNode.StructureProperty({
name: utils.firstLowerCase(entity.name),
typeAnnotation: utils_1.NaslTypeAnnotation.Reference({
typeNamespace: entity.getNamespace(),
typeName: entity.name,
}),
}),
...allEntities.map((relationEntity) => utils_1.NaslNode.StructureProperty({
name: utils.firstLowerCase(relationEntity.name),
typeAnnotation: utils_1.NaslTypeAnnotation.Reference({
typeNamespace: relationEntity.getNamespace(),
typeName: relationEntity.name,
}),
})),
];
const callQueryComponent = utils_1.NaslQueryExpression.CallQueryComponent({
label: '数据查询',
// 2.11版本的数据查询,返回类型将自动推断
// 2.22版本的数据查询,实体支持列筛选,(select.selectElements 会初始化实体对应的 QueryFieldExpression 节点)
ideVersion: '2.22',
typeAnnotation: utils_1.NaslTypeAnnotation.AnonymousStructure(aStructureProperties),
select,
from,
where,
groupBy: [],
having: null,
orderBy: supportSort
? [
utils_1.NaslQueryExpression.QueryOrderByExpression({
label: '查询组件OrderBy元素',
order: utils_1.NaslLogicItem.Identifier({
name: 'order',
}),
orderElement: utils_1.NaslLogicItem.Identifier({
name: 'sort',
}),
}),
]
: [],
logicName: nameGroup.logic,
structureName: nameGroup.structure,
limit: null,
});
return utils_1.NaslLogicItem.Assignment({
left: utils_1.NaslLogicItem.Identifier({ name: 'result' }),
right: utils_1.NaslLogicItem.Paginate({
list: callQueryComponent,
page: utils_1.NaslLogicItem.Identifier({ name: 'page' }),
size: utils_1.NaslLogicItem.Identifier({ name: 'size' }),
}),
});
}
exports.genQueryAssignment = genQueryAssignment;
function genQueryLogic(allEntities, nameGroup, supportFilter, supportSort, parentNode) {
const entity = allEntities?.[0];
const moduleNode = entity.app;
const moduleNamespace = moduleNode?.getNamespace();
const logic = utils_1.NaslNode.Logic({
name: nameGroup.logic,
description: '',
params: [
utils_1.NaslNode.Param({
name: 'page',
typeAnnotation: utils_1.NaslCoreTypeAnnotation.Long,
}),
utils_1.NaslNode.Param({
name: 'size',
typeAnnotation: utils_1.NaslCoreTypeAnnotation.Long,
}),
],
returns: [
utils_1.NaslNode.Return({
name: 'result',
typeAnnotation: null,
}),
],
variables: [],
body: [utils_1.NaslLogicItem.Start, genQueryAssignment(allEntities, nameGroup, supportFilter, supportSort), utils_1.NaslLogicItem.End],
playground: [],
});
if (supportSort) {
logic.params.push(utils_1.NaslNode.Param({
name: 'sort',
typeAnnotation: utils_1.NaslCoreTypeAnnotation.String,
}), utils_1.NaslNode.Param({
name: 'order',
typeAnnotation: utils_1.NaslCoreTypeAnnotation.String,
}));
}
if (supportFilter && entity) {
logic.params.push(utils_1.NaslNode.Param({
name: 'filter',
typeAnnotation: utils_1.NaslTypeAnnotation.Reference({
typeNamespace: entity.getNamespace(),
typeName: entity.name,
}),
}));
}
return logic;
}
exports.genQueryLogic = genQueryLogic;
async function joinEntity(callQueryComponent, entity, recordStructure) {
const dataSource = entity.parentNode;
const { from } = callQueryComponent;
let joinInfo;
// 无法判断用户行为,优先加有关系的
const lastEntity = dataSource.findEntityByName(from.entityName);
// lastEntity 和 entity Join
// 判断要不要自动关联 onExpression
// 一般左联是自动有的了
const rightProperty = entity.properties.find((property) => property.relationEntity === lastEntity.name);
if (rightProperty) {
const leftProperty = lastEntity.properties.find((property) => property.name === rightProperty.relationProperty);
joinInfo = {
leftProperty,
rightProperty,
};
}
else {
const leftProperty = lastEntity.properties.find((property) => property.relationEntity === entity.name);
if (leftProperty) {
const rightProperty = entity.properties.find((property) => property.name === leftProperty.relationProperty);
joinInfo = {
leftProperty,
rightProperty,
};
}
}
const queryJoinExpression = utils_1.NaslQueryExpression.QueryJoinExpression({
joinType: 'LEFT',
entityNamespace: entity.getNamespace(),
entityName: entity.name,
joinParts: [],
onExpressions: [],
});
if (joinInfo) {
queryJoinExpression.onExpressions.push(utils_1.NaslLogicItem.BinaryExpression({
operator: '==',
left: utils_1.NaslQueryExpression.QueryFieldExpression({
label: '查询组件实体属性',
isDotStar: false,
entityAsName: joinInfo.leftProperty.entity.name,
propertyName: joinInfo.leftProperty.name,
}),
right: utils_1.NaslQueryExpression.QueryFieldExpression({
label: '查询组件实体属性',
isDotStar: false,
entityAsName: joinInfo.rightProperty.entity.name,
propertyName: joinInfo.rightProperty.name,
}),
}));
}
else {
queryJoinExpression.onExpressions.push(utils_1.NaslLogicItem.BinaryExpression({
operator: '==',
left: utils_1.NaslQueryExpression.QueryFieldExpression({
label: '查询组件实体属性',
isDotStar: false,
entityAsName: lastEntity.name,
}),
right: utils_1.NaslQueryExpression.QueryFieldExpression({
label: '查询组件实体属性',
isDotStar: false,
entityAsName: entity.name,
}),
}));
}
const structureProperty = concepts_1.StructureProperty.from(utils_1.NaslNode.StructureProperty({
name: utils.firstLowerCase(entity.name),
typeAnnotation: utils_1.NaslTypeAnnotation.Reference({
typeNamespace: entity.getNamespace(),
typeName: entity.name,
}),
}), recordStructure, 'properties');
if (recordStructure instanceof concepts_1.Structure)
recordStructure.addProperty(structureProperty);
else if (recordStructure instanceof concepts_1.TypeAnnotation)
recordStructure.properties.push(structureProperty);
const newJoinPartLogicItem = concepts_1.QueryJoinExpression.from(queryJoinExpression, callQueryComponent, 'joinParts');
from.addJoinPart(newJoinPartLogicItem);
callQueryComponent.saveStructure();
}
exports.joinEntity = joinEntity;
exports.default = genQueryAssignment;
function genEditQueryStructure(allEntities, nameGroup) {
allEntities = Array.from(new Set(allEntities));
const properties = allEntities.map((entity) => utils_1.NaslNode.StructureProperty({
name: utils.firstLowerCase(entity.name),
typeAnnotation: utils_1.NaslTypeAnnotation.Reference({
typeNamespace: entity.getNamespace(),
typeName: entity.name,
}),
}));
properties.push(utils_1.NaslNode.StructureProperty({
name: 'editing',
typeAnnotation: utils_1.NaslCoreTypeAnnotation.String,
}));
return utils_1.NaslNode.Structure({
name: nameGroup.structure,
properties,
});
}
exports.genEditQueryStructure = genEditQueryStructure;
//# sourceMappingURL=genQueryComponent.js.map