如何在Palantir中通过TypeScript函数合并两个ObjectSet并返回目标对象集
可行实现方案
以下是三种常用的实现方式,可根据你使用的ObjectSet所属框架能力选择:
- 方案1:框架内置跨ObjectSet关联聚合(性能最优,优先选择)
如果你的ObjectSet来自支持跨对象关联查询的框架(比如数据中台、低代码开发平台的对象模型),可以先给objecta和objectb配置关联关系,关联键为year/yr、截取第一位的code,之后直接关联两个ObjectSet生成联合集合,再在联合集合上执行分组聚合操作,聚合结果可以直接调用框架内置的asObjectSet()方法直接转为objectc类型的ObjectSet,代码示例如下:
public async test(p1: ObjectSet<objecta>,c1: ObjectSet<objectb>): Promise<ObjectSet<objectc>> { // 关联两个ObjectSet return p1 .join(c1, (a, b) => a.year.eq(b.yr) && a.code.byFixedWidth(1).eq(b.code.byFixedWidth(1))) // 联合集合上直接做聚合 .groupBy(joinRes => [joinRes.a.year.topValues(), joinRes.a.code.byFixedWidth(1).topValues()]) .sum(joinRes => ({ amt: joinRes.a.amt, fullAmt: joinRes.b.FullAmt })) // 直接转换为目标ObjectSet .asObjectSet<objectc>(); }
- 方案2:手动聚合后转换为ObjectSet
如果框架不支持跨ObjectSet关联,就用你当前的思路先分别聚合,做全外连接补全数据后,调用框架提供的数组转ObjectSet方法完成转换,需要注意你现有代码只做了左连接,会丢失仅在c1中存在的分组,优化后的代码示例如下:
public async test(p1: ObjectSet<objecta>,c1: ObjectSet<objectb>): Promise<ObjectSet<objectc>> { const [results1, results2]= await Promise.all([ p1 .groupBy(a1 => a1.year.topValues()) .segmentBy(a1 => a1.code.byFixedWidth(1)) .sum(a1=>a1.amt), c1 .groupBy(a1=>a1.yr.topValues()) .segmentBy(a1 => a1.code.byFixedWidth(1)) .sum(a1 => a1.FullAmt), ]); // 做全外连接补全所有分组,避免数据丢失 const groupMap = new Map<string, objectc>(); results1.forEach(item => { const groupKey = `${item.year}-${item.code}`; groupMap.set(groupKey, { year: item.year, code: item.code, amt: item.amt, fullAmt: 0 } as objectc); }); results2.forEach(item => { const groupKey = `${item.yr}-${item.code}`; if (groupMap.has(groupKey)) { groupMap.get(groupKey)!.fullAmt = item.FullAmt; } else { groupMap.set(groupKey, { year: item.yr, code: item.code, amt: 0, fullAmt: item.FullAmt } as objectc); } }); const mergedResult = Array.from(groupMap.values()); // 调用框架提供的数组转ObjectSet方法,不同框架方法名可能略有差异,常见为fromArray、wrapObjects等 return ObjectSet.createFromArray<objectc>(mergedResult, "objectc的类型唯一标识"); }
- 方案3:临时对象类型中转
如果需要频繁使用该透视表结果,可在所属平台的对象模型中创建和聚合结果字段完全匹配的objectc实体类型,将合并后的聚合结果批量写入该实体的存储中,之后直接查询该实体的ObjectSet即可,适合对查询性能要求高的场景。
注意:ObjectSet不是原生JS/TS的内置类型,是你所用框架提供的带查询能力的集合包装类,必须调用框架提供的对应转换方法才能将普通数组转为ObjectSet实例,具体方法名可以参考对应框架的API文档确认。
内容的提问来源于stack exchange,提问作者Monica Gaddipati
相关产品推荐
相关产品推荐

