MCPcopy Create free account
hub / github.com/apitable/apitable / expressionTransform

Function expressionTransform

packages/core/src/formula_parser/evaluate.ts:212–295  ·  view source on GitHub ↗
(
  expression: string,
  { fieldMap, fieldPermissionMap }: { fieldMap: IFieldMap; fieldPermissionMap?: IFieldPermissionMap },
  to: 'id' | 'name',
)

Source from the content-addressed store, hash-verified

210
211// Convert an expression with fieldName as variable name to an expression with fieldId as variable name
212export function expressionTransform(
213 expression: string,
214 { fieldMap, fieldPermissionMap }: { fieldMap: IFieldMap; fieldPermissionMap?: IFieldPermissionMap },
215 to: 'id' | 'name',
216): string {
217 if (!expression) {
218 return expression;
219 }
220
221 const lexer = new FormulaExprLexer(expression);
222 if (!lexer) {
223 return '';
224 }
225
226 // Convert fieldMap and use name as key
227 let revertFieldMap = fieldMap;
228 if (to === 'id') {
229 revertFieldMap = {};
230 for (const key in fieldMap) {
231 const field = fieldMap[key]!;
232 revertFieldMap[field.name] = field;
233 }
234 }
235
236 return lexer.fullMatches.reduce<string>((str, token) => {
237 let tokenValue = token.value;
238
239 function getPureTokenValue() {
240 const pureTokenValue = token.value.replace(/\\(.)/g, '$1');
241 const field = revertFieldMap[pureTokenValue];
242 // Convert the variable name according to the to parameter
243 if (!field) {
244 return tokenValue;
245 }
246 if (to === 'id') {
247 return field.id;
248 }
249
250 const name = field.name.replace(/[{}\\]/g, '\\$&');
251 // When name contains illegal parameters, {} wrapping is required
252 if (/[/+\-|=*/><()()!&%'"“”‘’^`~,,\s]/.test(name)) {
253 return `{${name}}`;
254 }
255 console.log(
256 t(Strings.not_found_field_the_name_as, {
257 value: pureTokenValue,
258 }),
259 );
260 return name;
261 }
262
263 function getTokenValue() {
264 const pureTokenValue = tokenValue.slice(1, -1).replace(/\\(.)/g, '$1');
265 const field = revertFieldMap[pureTokenValue];
266 const fieldRole = getFieldRoleByFieldId(fieldPermissionMap, pureTokenValue);
267
268 if (fieldRole === ConfigConstant.Role.None) {
269 return `{${t(Strings.crypto_field)}}`;

Callers 6

evaluate.test.tsFile · 0.90
validateExpressionMethod · 0.90
FormatButtonFunction · 0.90
FormulaModalFunction · 0.90
onConfirmFunction · 0.90
FormatFormulaFunction · 0.90

Calls 2

getPureTokenValueFunction · 0.85
getTokenValueFunction · 0.85

Tested by

no test coverage detected