UNPKG

@lcap/nasl

Version:

NetEase Application Specific Language

345 lines 14.1 kB
"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