@milaboratories/pframes-rs-node 1.0.106 → 1.0.109
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/export/addon-def.ts +6 -9
- package/export/export.ts +3 -3
- package/export/tests/pframes.test.ts +537 -0
- package/export/tests/setup.ts +38 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.2LVJN6O24SEU2T6ZZRA3ZNIA.jdata +82 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.2MO4YNOSI4C2L7GHVIZ6YSYT.jdata +139 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.2R6YWG3EVKXULZJIZYSZYASV.jdata +151 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.2RFBXQYLZVPIYLITVUUU3GR6.jdata +136 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.2ZCJ73VD223TO7UVCF4DLSKS.jdata +166 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.2ZCOKJLMPCZTTSJQEYCYM2D6.jdata +18 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.32L5DZ6D632DGLU3OIBB3HGX.jdata +76 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.34LTVMPK2UDCR34EHCSEYX3W.jdata +19 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.3K6KCP5JDGW4X7DXT5RF6ZAF.jdata +121 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.5BJ4G7MKY3KGJAZMAYHRDDTI.jdata +106 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.5QIRD6GYS57CH4FPJLYCUDUN.jdata +81 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.6465KFARE44HTYJ4DLVE2POI.jdata +124 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.7EN5RO34NCDPWAWCIBM4UDIA.jdata +62 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.7HQRZGQAFAUVMAXUSH4QK35W.jdata +172 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.7IFCRZFNQ62AIPBKYYWNJKLP.jdata +166 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.7PPYAJDDR7DGHLI5YSFBGIX4.jdata +68 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.A7LBATMSQCBKAPGIUKAFX7ZQ.jdata +13 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.AQUOPWRX3Q2QNR2IWWMMGRCF.jdata +88 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.AY2WCVRGDI4KDBSNN4VWISRV.jdata +19 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.AZHBA2KSN2ZSGCQF32V3AZGH.jdata +18 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.B2X77CFBR4AHVC4UE3YWHRSE.jdata +1 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.BDGKT2HBP4KRZYQW7IOL3MXX.jdata +104 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.BUPSWPETJ4HHWZOY6M3X2AUV.jdata +48 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.CHH6NIYBJUBIWROO4LXF3AK2.jdata +28 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.CHI3Y6POL64COZMAEHK7RKOO.jdata +167 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.D4DU6MUFJX5C572GM25IWLFV.jdata +79 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.DFO4BLLJ4GVHRBYGLAJ7QUN2.jdata +59 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.DFQDMMGE23YQY5MCLNKOMZJM.jdata +118 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.DXWTOE3QM2D4XAICJLVAUOYH.jdata +173 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.E7DBFSJQQOZIWEZ4UIABFVTP.jdata +20 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.FILU5VIR2FDT3SRDYE322USR.jdata +181 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.GF24HO7CQHY55O6JKWEDKHNF.jdata +78 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.HBT3EGHORD2TZRM7XG5PO5II.jdata +136 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.HXBZGAQ724Y567AKGQOAAF2J.jdata +74 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.IBB3SCZSTCEZQFO4S7L6GVUH.jdata +149 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.ICOC34NWMBSXEFXQOO2BNY4H.jdata +59 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.IQPTOXVWTTENLD2E4VKNU56D.jdata +102 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.JP3IIRDA6QZDW4EZLKRII7KS.jdata +86 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.JZE5QCNYF4YHZYRGUZ6XRJHQ.jdata +84 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.K6A7V2JOVSAX7RHIZ2RPXYBP.jdata +1 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.KL7USBR5ZQUIN7K7MF3U7P73.jdata +64 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.KMZNMPE7IWFLWKPMN7OABWXZ.jdata +59 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.KZPHVIUPQIAFL2HTOAJR7VGJ.jdata +1 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.KZSRESLOPXQ4WH6ALAJP7U5H.jdata +196 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.LGBPQ5XC2BUGG4TJWYHTFZGE.jdata +89 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.LMLLDWOFTAPH3QVSOM7MHQ22.jdata +73 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.LVVUZMJT5MREBDWME5RSK7KI.jdata +146 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.LXBE5P62YKG5UDJGJRL6MSQC.jdata +68 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.MLOU6WK4ZV7K6HIWPE3LRWI2.jdata +98 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.NAL3QCUSLD44QGSRCQ5TZOAH.jdata +69 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.NWX7DKTFXRVH4ZYUTZULRDWT.jdata +80 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.O6M53LCMV7A3II22GUPKCJGP.jdata +98 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.PMARMGPM4IBPA3VCS3CYH5WM.jdata +32 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.PMJ37ZMFMTFORL4UYUDVNDZG.jdata +126 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.QPWLPWRWPFGRVQI5OS2RGXBW.jdata +26 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.QQ4RGTF2PBGNUPTLCO3Z3T2C.jdata +22 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.QWXPZSGYDRGIUZS6VDHGVLTF.jdata +72 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.QXQWSMICPPJGLPUQ33IQJK7F.jdata +90 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.RBX3IONPE5K2HMS4MAT4MKQY.jdata +146 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.RHKAHOLA74IHPBG75KQN4NAV.jdata +59 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.RWI3IGNEUOAJR7ZWU7NSPF72.jdata +67 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.SOVBQDZPBYCVZTRZF3CXHWOW.jdata +91 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.SWLOWAB2PTM5R2XN765A3ICZ.jdata +104 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.T3WRQEFUPCZICFXMJ5F6DQX3.jdata +131 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.TETZ2IEF3L2GYDJLNU3BVKMX.jdata +76 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.UXO4UE2Q7HO42SNSO4DULKJJ.jdata +118 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.VAUTIV2ROH62WNMZZCIGRBDC.jdata +132 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.VBP7Z5WQ2IOHMQIA5UV4DOH3.jdata +71 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.VCKGU2COVX6O3RUXNRC7FRCJ.jdata +151 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.VOCGDDBWN5H64YJZP3EPSZNU.jdata +158 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.VPEMTWGQVZ6ZSNF426GPHUXI.jdata +93 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.WAS2QNFHHPD2UIZ44F2IKRQ6.jdata +101 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.WYCWV4434DAMKRUU7F7LGZGR.jdata +142 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.XGWYF7VR6EIU3OWPXAWHP2PE.jdata +156 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.XJQYA42VX2WKHPAJWAUBHAXN.jdata +119 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.XLTFOXR4VH54UCW6BVEND6GI.jdata +85 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.YMTPJWXHLMW4IPBQABT3326F.jdata +109 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.YOIX3HY7SWPCY7AOBSDA3GLC.jdata +1 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.YSEQPSWWTXZTW52G5ZZU46RT.jdata +93 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.ZZ54PNLFYZ6GSOR2AESKXRL4.jdata +89 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.datainfo +86 -0
- package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.spec +42 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.2LVJN6O24SEU2T6ZZRA3ZNIA.jdata +82 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.2MO4YNOSI4C2L7GHVIZ6YSYT.jdata +139 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.2R6YWG3EVKXULZJIZYSZYASV.jdata +151 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.2RFBXQYLZVPIYLITVUUU3GR6.jdata +136 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.2ZCJ73VD223TO7UVCF4DLSKS.jdata +166 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.2ZCOKJLMPCZTTSJQEYCYM2D6.jdata +18 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.32L5DZ6D632DGLU3OIBB3HGX.jdata +76 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.34LTVMPK2UDCR34EHCSEYX3W.jdata +19 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.3K6KCP5JDGW4X7DXT5RF6ZAF.jdata +121 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.5BJ4G7MKY3KGJAZMAYHRDDTI.jdata +106 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.5QIRD6GYS57CH4FPJLYCUDUN.jdata +81 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.6465KFARE44HTYJ4DLVE2POI.jdata +124 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.7EN5RO34NCDPWAWCIBM4UDIA.jdata +62 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.7HQRZGQAFAUVMAXUSH4QK35W.jdata +172 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.7IFCRZFNQ62AIPBKYYWNJKLP.jdata +166 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.7PPYAJDDR7DGHLI5YSFBGIX4.jdata +68 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.A7LBATMSQCBKAPGIUKAFX7ZQ.jdata +13 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.AQUOPWRX3Q2QNR2IWWMMGRCF.jdata +88 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.AY2WCVRGDI4KDBSNN4VWISRV.jdata +19 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.AZHBA2KSN2ZSGCQF32V3AZGH.jdata +18 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.B2X77CFBR4AHVC4UE3YWHRSE.jdata +1 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.BDGKT2HBP4KRZYQW7IOL3MXX.jdata +104 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.BUPSWPETJ4HHWZOY6M3X2AUV.jdata +48 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.CHH6NIYBJUBIWROO4LXF3AK2.jdata +28 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.CHI3Y6POL64COZMAEHK7RKOO.jdata +167 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.D4DU6MUFJX5C572GM25IWLFV.jdata +79 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.DFO4BLLJ4GVHRBYGLAJ7QUN2.jdata +59 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.DFQDMMGE23YQY5MCLNKOMZJM.jdata +118 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.DXWTOE3QM2D4XAICJLVAUOYH.jdata +173 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.E7DBFSJQQOZIWEZ4UIABFVTP.jdata +20 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.FILU5VIR2FDT3SRDYE322USR.jdata +181 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.GF24HO7CQHY55O6JKWEDKHNF.jdata +78 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.HBT3EGHORD2TZRM7XG5PO5II.jdata +136 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.HXBZGAQ724Y567AKGQOAAF2J.jdata +74 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.IBB3SCZSTCEZQFO4S7L6GVUH.jdata +149 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.ICOC34NWMBSXEFXQOO2BNY4H.jdata +59 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.IQPTOXVWTTENLD2E4VKNU56D.jdata +102 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.JP3IIRDA6QZDW4EZLKRII7KS.jdata +86 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.JZE5QCNYF4YHZYRGUZ6XRJHQ.jdata +84 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.K6A7V2JOVSAX7RHIZ2RPXYBP.jdata +1 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.KL7USBR5ZQUIN7K7MF3U7P73.jdata +64 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.KMZNMPE7IWFLWKPMN7OABWXZ.jdata +59 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.KZPHVIUPQIAFL2HTOAJR7VGJ.jdata +1 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.KZSRESLOPXQ4WH6ALAJP7U5H.jdata +196 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.LGBPQ5XC2BUGG4TJWYHTFZGE.jdata +89 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.LMLLDWOFTAPH3QVSOM7MHQ22.jdata +73 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.LVVUZMJT5MREBDWME5RSK7KI.jdata +146 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.LXBE5P62YKG5UDJGJRL6MSQC.jdata +68 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.MLOU6WK4ZV7K6HIWPE3LRWI2.jdata +98 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.NAL3QCUSLD44QGSRCQ5TZOAH.jdata +69 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.NWX7DKTFXRVH4ZYUTZULRDWT.jdata +80 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.O6M53LCMV7A3II22GUPKCJGP.jdata +98 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.PMARMGPM4IBPA3VCS3CYH5WM.jdata +32 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.PMJ37ZMFMTFORL4UYUDVNDZG.jdata +126 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.QPWLPWRWPFGRVQI5OS2RGXBW.jdata +26 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.QQ4RGTF2PBGNUPTLCO3Z3T2C.jdata +22 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.QWXPZSGYDRGIUZS6VDHGVLTF.jdata +72 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.QXQWSMICPPJGLPUQ33IQJK7F.jdata +90 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.RBX3IONPE5K2HMS4MAT4MKQY.jdata +146 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.RHKAHOLA74IHPBG75KQN4NAV.jdata +59 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.RWI3IGNEUOAJR7ZWU7NSPF72.jdata +67 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.SOVBQDZPBYCVZTRZF3CXHWOW.jdata +91 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.SWLOWAB2PTM5R2XN765A3ICZ.jdata +104 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.T3WRQEFUPCZICFXMJ5F6DQX3.jdata +131 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.TETZ2IEF3L2GYDJLNU3BVKMX.jdata +76 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.UXO4UE2Q7HO42SNSO4DULKJJ.jdata +118 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.VAUTIV2ROH62WNMZZCIGRBDC.jdata +132 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.VBP7Z5WQ2IOHMQIA5UV4DOH3.jdata +71 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.VCKGU2COVX6O3RUXNRC7FRCJ.jdata +151 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.VOCGDDBWN5H64YJZP3EPSZNU.jdata +158 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.VPEMTWGQVZ6ZSNF426GPHUXI.jdata +93 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.WAS2QNFHHPD2UIZ44F2IKRQ6.jdata +101 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.WYCWV4434DAMKRUU7F7LGZGR.jdata +142 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.XGWYF7VR6EIU3OWPXAWHP2PE.jdata +156 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.XJQYA42VX2WKHPAJWAUBHAXN.jdata +119 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.XLTFOXR4VH54UCW6BVEND6GI.jdata +85 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.YMTPJWXHLMW4IPBQABT3326F.jdata +109 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.YOIX3HY7SWPCY7AOBSDA3GLC.jdata +1 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.YSEQPSWWTXZTW52G5ZZU46RT.jdata +93 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.ZZ54PNLFYZ6GSOR2AESKXRL4.jdata +89 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.datainfo +86 -0
- package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.spec +37 -0
- package/export/tests/test_data/complex_join/metadata.7ZNW7LBUDMBSQJ26KYSSTBPJ.datainfo +5 -0
- package/export/tests/test_data/complex_join/metadata.7ZNW7LBUDMBSQJ26KYSSTBPJ.jdata +82 -0
- package/export/tests/test_data/complex_join/metadata.7ZNW7LBUDMBSQJ26KYSSTBPJ.spec +14 -0
- package/export/tests/test_data/complex_join/request.json +43 -0
- package/export/tests/test_data/create_table_request_1/column.datainfo +7 -0
- package/export/tests/test_data/create_table_request_1/column.spec +11 -0
- package/export/tests/test_data/create_table_request_1/request.json +8 -0
- package/export/tests/test_data/create_table_request_2/column.datainfo +7 -0
- package/export/tests/test_data/create_table_request_2/column.spec +11 -0
- package/export/tests/test_data/create_table_request_2/request.json +8 -0
- package/export/tests/test_data/create_table_request_3/column.datainfo +7 -0
- package/export/tests/test_data/create_table_request_3/column.spec +11 -0
- package/export/tests/test_data/create_table_request_3/request.json +8 -0
- package/export/tests/test_data/create_table_request_4/column.datainfo +7 -0
- package/export/tests/test_data/create_table_request_4/column.spec +11 -0
- package/export/tests/test_data/create_table_request_4/request.json +8 -0
- package/export/tests/test_data/create_table_request_fail/column.datainfo +5 -0
- package/export/tests/test_data/create_table_request_fail/column.spec +11 -0
- package/export/tests/test_data/create_table_request_fail/request.json +8 -0
- package/export/tests/test_data/delete_column_request/request.json +27 -0
- package/export/tests/test_data/delete_column_request/response.json +13 -0
- package/export/tests/test_data/find_columns_request/column.spec +11 -0
- package/export/tests/test_data/find_columns_request/request.json +5 -0
- package/export/tests/test_data/find_columns_request/response.json +21 -0
- package/export/tests/test_data/get_column_spec_request/column.spec +11 -0
- package/export/tests/test_data/get_column_spec_request/response.json +11 -0
- package/export/tests/test_data/set_column_data_request/column.datainfo +5 -0
- package/export/tests/test_data/set_column_data_request/column.jdata +24 -0
- package/export/tests/test_data/set_column_data_request/column.spec +14 -0
- package/export/tests/test_data/sort_table_request/column1.datainfo +5 -0
- package/export/tests/test_data/sort_table_request/column1.jdata +4 -0
- package/export/tests/test_data/sort_table_request/column1.spec +11 -0
- package/export/tests/test_data/sort_table_request/column2.datainfo +5 -0
- package/export/tests/test_data/sort_table_request/column2.jdata +4 -0
- package/export/tests/test_data/sort_table_request/column2.spec +15 -0
- package/export/tests/test_data/sort_table_request/request.json +18 -0
- package/export/tests/test_data/sort_table_request/sorting.json +40 -0
- package/export/tests/test_data/unique_values_request/column.datainfo +5 -0
- package/export/tests/test_data/unique_values_request/column.jdata +5 -0
- package/export/tests/test_data/unique_values_request/column.spec +11 -0
- package/export/tests/test_data/unique_values_request/request.json +5 -0
- package/export/wrapper.ts +79 -42
- package/export_dist/{export/addon-def.d.ts → addon-def.d.ts} +6 -12
- package/export_dist/addon-def.d.ts.map +1 -0
- package/export_dist/addon.cjs.map +1 -1
- package/export_dist/addon.d.ts.map +1 -0
- package/export_dist/addon.js.map +1 -1
- package/export_dist/dump.cjs.map +1 -1
- package/export_dist/dump.d.ts.map +1 -0
- package/export_dist/dump.js.map +1 -1
- package/export_dist/export.cjs.map +1 -1
- package/export_dist/{export/export.d.ts → export.d.ts} +1 -1
- package/export_dist/export.d.ts.map +1 -0
- package/export_dist/export.js.map +1 -1
- package/export_dist/index.d.ts.map +1 -0
- package/export_dist/tests/pframes.test.d.ts.map +1 -1
- package/export_dist/tests/setup.d.ts.map +1 -1
- package/export_dist/wrapper.cjs +65 -27
- package/export_dist/wrapper.cjs.map +1 -1
- package/export_dist/{export/wrapper.d.ts → wrapper.d.ts} +9 -9
- package/export_dist/wrapper.d.ts.map +1 -0
- package/export_dist/wrapper.js +65 -27
- package/export_dist/wrapper.js.map +1 -1
- package/package.json +8 -8
- package/export_dist/export/addon-def.d.ts.map +0 -1
- package/export_dist/export/addon.d.ts.map +0 -1
- package/export_dist/export/dump.d.ts.map +0 -1
- package/export_dist/export/export.d.ts.map +0 -1
- package/export_dist/export/index.d.ts.map +0 -1
- package/export_dist/export/wrapper.d.ts.map +0 -1
- /package/export_dist/{export/addon.d.ts → addon.d.ts} +0 -0
- /package/export_dist/{export/dump.d.ts → dump.d.ts} +0 -0
- /package/export_dist/{export/index.d.ts → index.d.ts} +0 -0
package/export/addon-def.ts
CHANGED
|
@@ -14,9 +14,6 @@ import type {
|
|
|
14
14
|
} from '@milaboratories/pl-model-common';
|
|
15
15
|
import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
|
|
16
16
|
|
|
17
|
-
export type FrameId = string & { __brand: 'FrameId' };
|
|
18
|
-
export type TableId = string & { __brand: 'TableId' };
|
|
19
|
-
|
|
20
17
|
export interface NodeFrameSymbol extends Symbol {}
|
|
21
18
|
|
|
22
19
|
export interface NodeTableSymbol extends Symbol {}
|
|
@@ -57,16 +54,16 @@ interface NodeFrame {
|
|
|
57
54
|
pFrameGetColumnSpec: (
|
|
58
55
|
pFrame: NodeFrameSymbol,
|
|
59
56
|
columnId: PObjectId
|
|
60
|
-
) => Promise<PColumnSpec>;
|
|
57
|
+
) => Promise<PColumnSpec | null>;
|
|
61
58
|
pFrameListColumns: (pFrame: NodeFrameSymbol) => Promise<PColumnInfo[]>;
|
|
62
59
|
pFrameCreateTable: (
|
|
63
60
|
pFrame: NodeFrameSymbol,
|
|
64
|
-
id:
|
|
61
|
+
id: PFrameInternal.PTableId,
|
|
65
62
|
request: PFrameInternal.CreateTableRequestV4
|
|
66
63
|
) => NodeTableSymbol;
|
|
67
64
|
pFrameGetUniqueValues: (
|
|
68
65
|
pFrame: NodeFrameSymbol,
|
|
69
|
-
id:
|
|
66
|
+
id: PFrameInternal.PTableId,
|
|
70
67
|
request: UniqueValuesRequest,
|
|
71
68
|
signal: AbortSignal | undefined
|
|
72
69
|
) => Promise<UniqueValuesResponse>;
|
|
@@ -88,19 +85,19 @@ interface NodeTable {
|
|
|
88
85
|
) => Promise<PTableShape>;
|
|
89
86
|
pTableGetData: (
|
|
90
87
|
boxed: NodeTableSymbol,
|
|
91
|
-
id:
|
|
88
|
+
id: PFrameInternal.PTableId,
|
|
92
89
|
columnIndices: number[],
|
|
93
90
|
range: TableRange | undefined,
|
|
94
91
|
signal: AbortSignal | undefined
|
|
95
92
|
) => Promise<PTableVector[]>;
|
|
96
93
|
pTableFilter: (
|
|
97
94
|
boxed: NodeTableSymbol,
|
|
98
|
-
id:
|
|
95
|
+
id: PFrameInternal.PTableId,
|
|
99
96
|
request: PTableRecordFilter[]
|
|
100
97
|
) => NodeTableSymbol;
|
|
101
98
|
pTableSort: (
|
|
102
99
|
boxed: NodeTableSymbol,
|
|
103
|
-
id:
|
|
100
|
+
id: PFrameInternal.PTableId,
|
|
104
101
|
request: PTableSorting[]
|
|
105
102
|
) => NodeTableSymbol;
|
|
106
103
|
pTableDispose: (boxed: NodeTableSymbol) => void;
|
package/export/export.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
|
|
2
2
|
import { PFrame, pprofDump } from './wrapper';
|
|
3
3
|
|
|
4
|
-
export const PFrameFactory: PFrameInternal.
|
|
4
|
+
export const PFrameFactory: PFrameInternal.PFrameFactoryV4 = {
|
|
5
5
|
createPFrame: (
|
|
6
|
-
options: PFrameInternal.
|
|
7
|
-
): PFrameInternal.
|
|
6
|
+
options: PFrameInternal.PFrameOptionsV2
|
|
7
|
+
): PFrameInternal.PFrameV13 => {
|
|
8
8
|
return new PFrame(options);
|
|
9
9
|
},
|
|
10
10
|
pprofDump: async (): Promise<Uint8Array> => {
|
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
// Node.js core modules
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import process from 'node:process';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import type { Buffer } from 'node:buffer';
|
|
7
|
+
|
|
8
|
+
// Testing framework
|
|
9
|
+
import { describe, test } from 'vitest';
|
|
10
|
+
|
|
11
|
+
// Project types and modules
|
|
12
|
+
import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
|
|
13
|
+
import type {
|
|
14
|
+
PObjectId,
|
|
15
|
+
PTableSorting,
|
|
16
|
+
PTableVector,
|
|
17
|
+
UniqueValuesResponse
|
|
18
|
+
} from '@milaboratories/pl-model-common';
|
|
19
|
+
import { PFrameFactory } from '..';
|
|
20
|
+
import { ulid } from 'ulid';
|
|
21
|
+
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Test Utility Functions
|
|
24
|
+
// ============================================================================
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Get the path to a test case directory
|
|
28
|
+
*/
|
|
29
|
+
function getTestCaseDataPath(testCase: string): string {
|
|
30
|
+
const currentDirectoryPath = path.relative('.', __dirname);
|
|
31
|
+
const testDataPath = path.join(currentDirectoryPath, 'test_data');
|
|
32
|
+
return path.join(testDataPath, testCase);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Get the full path to a test file
|
|
37
|
+
*/
|
|
38
|
+
function getTestFilePath(testCase: string, fileName: string): string {
|
|
39
|
+
return path.join(getTestCaseDataPath(testCase), fileName);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Read a test file as Buffer
|
|
44
|
+
*/
|
|
45
|
+
function readTestFile(testCase: string, fileName: string): Buffer {
|
|
46
|
+
return fs.readFileSync(getTestFilePath(testCase, fileName));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Read and parse a JSON test file
|
|
51
|
+
*/
|
|
52
|
+
function readJsonTestFile(testCase: string, fileName: string): any {
|
|
53
|
+
return JSON.parse(readTestFile(testCase, fileName).toString());
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Create a standard data source for tests that reads from test files
|
|
58
|
+
*/
|
|
59
|
+
function createTestDataSource(
|
|
60
|
+
testCase: string
|
|
61
|
+
): PFrameInternal.PFrameDataSourceV2 {
|
|
62
|
+
return {
|
|
63
|
+
preloadBlob: function (
|
|
64
|
+
blobIds: PFrameInternal.PFrameBlobId[]
|
|
65
|
+
): Promise<void> {
|
|
66
|
+
return new Promise((resolve) => {
|
|
67
|
+
if (new Set(blobIds).size !== blobIds.length) {
|
|
68
|
+
throw new Error('preload requires array of unique values');
|
|
69
|
+
}
|
|
70
|
+
resolve();
|
|
71
|
+
});
|
|
72
|
+
},
|
|
73
|
+
resolveBlobContent: function (
|
|
74
|
+
blobId: PFrameInternal.PFrameBlobId
|
|
75
|
+
): Promise<Uint8Array> {
|
|
76
|
+
return new Promise((resolve) => {
|
|
77
|
+
resolve(readTestFile(testCase, blobId));
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Create a failing data source for error testing
|
|
85
|
+
*/
|
|
86
|
+
function createFailingDataSource(): PFrameInternal.PFrameDataSourceV2 {
|
|
87
|
+
return {
|
|
88
|
+
preloadBlob: (): Promise<void> => Promise.resolve(),
|
|
89
|
+
resolveBlobContent: (): Promise<Uint8Array> =>
|
|
90
|
+
Promise.reject(new Error('fail'))
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Read a complete PFrame from test data directory
|
|
96
|
+
* Automatically loads all .spec files and their corresponding .datainfo files
|
|
97
|
+
*/
|
|
98
|
+
async function readPFrame(testCase: string): Promise<PFrameInternal.PFrameV13> {
|
|
99
|
+
const dataSource = createTestDataSource(testCase);
|
|
100
|
+
const pframe = PFrameFactory.createPFrame({
|
|
101
|
+
frameId: ulid() as PFrameInternal.PFrameId,
|
|
102
|
+
spillPath: tmpdir() /*, logger: console.log */
|
|
103
|
+
});
|
|
104
|
+
pframe.setDataSource(dataSource);
|
|
105
|
+
|
|
106
|
+
const testCasePath = getTestCaseDataPath(testCase);
|
|
107
|
+
const files = fs.readdirSync(testCasePath);
|
|
108
|
+
|
|
109
|
+
for (const file of files) {
|
|
110
|
+
if (file.endsWith('.spec')) {
|
|
111
|
+
const columnId = file.replace('.spec', '') as PObjectId;
|
|
112
|
+
const columnSpec = readJsonTestFile(testCase, file);
|
|
113
|
+
pframe.addColumnSpec(columnId, columnSpec);
|
|
114
|
+
|
|
115
|
+
const dataInfoFile = file.replace('.spec', '.datainfo');
|
|
116
|
+
if (files.includes(dataInfoFile)) {
|
|
117
|
+
const dataInfo = readJsonTestFile(testCase, dataInfoFile);
|
|
118
|
+
await pframe.setColumnData(columnId, dataInfo);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return pframe;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// ============================================================================
|
|
127
|
+
// Test Suites
|
|
128
|
+
// ============================================================================
|
|
129
|
+
|
|
130
|
+
describe('PFrame Column Operations', () => {
|
|
131
|
+
test.concurrent('find_columns_request', async ({ expect }) => {
|
|
132
|
+
const testCase = 'find_columns_request';
|
|
133
|
+
|
|
134
|
+
const columnId = 'column1' as PObjectId;
|
|
135
|
+
const columnSpec = readJsonTestFile(testCase, 'column.spec');
|
|
136
|
+
const request = readJsonTestFile(testCase, 'request.json');
|
|
137
|
+
const expectedResponse = readJsonTestFile(testCase, 'response.json');
|
|
138
|
+
|
|
139
|
+
using pframe = PFrameFactory.createPFrame({
|
|
140
|
+
frameId: ulid() as PFrameInternal.PFrameId,
|
|
141
|
+
spillPath: tmpdir()
|
|
142
|
+
});
|
|
143
|
+
pframe.addColumnSpec(columnId, columnSpec);
|
|
144
|
+
|
|
145
|
+
const actualResponse = await pframe.findColumns(request);
|
|
146
|
+
expect(actualResponse).toEqual(expectedResponse);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
test.concurrent('get_column_spec_request', async ({ expect }) => {
|
|
150
|
+
const testCase = 'get_column_spec_request';
|
|
151
|
+
|
|
152
|
+
const columnId = 'column1' as PObjectId;
|
|
153
|
+
const columnSpec = readJsonTestFile(testCase, 'column.spec');
|
|
154
|
+
const expectedResponse = readJsonTestFile(testCase, 'response.json');
|
|
155
|
+
|
|
156
|
+
using pframe = PFrameFactory.createPFrame({
|
|
157
|
+
frameId: ulid() as PFrameInternal.PFrameId,
|
|
158
|
+
spillPath: tmpdir()
|
|
159
|
+
});
|
|
160
|
+
pframe.addColumnSpec(columnId, columnSpec);
|
|
161
|
+
|
|
162
|
+
const actualResponse = await pframe.getColumnSpec(columnId);
|
|
163
|
+
expect(actualResponse).toEqual(expectedResponse);
|
|
164
|
+
|
|
165
|
+
const unknownColumnId = 'unknown_column1' as PObjectId;
|
|
166
|
+
const unknownColumnSpec = await pframe.getColumnSpec(unknownColumnId);
|
|
167
|
+
expect(unknownColumnSpec).toBeNull();
|
|
168
|
+
|
|
169
|
+
const columnList = await pframe.listColumns();
|
|
170
|
+
expect(columnList).toEqual([
|
|
171
|
+
{ columnId: columnId, spec: columnSpec, hasData: false }
|
|
172
|
+
]);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
test.concurrent('delete_column_request', async ({ expect }) => {
|
|
176
|
+
const testCase = 'delete_column_request';
|
|
177
|
+
|
|
178
|
+
const request = readJsonTestFile(testCase, 'request.json');
|
|
179
|
+
const expectedResponse = readJsonTestFile(testCase, 'response.json');
|
|
180
|
+
|
|
181
|
+
using pframe = PFrameFactory.createPFrame({
|
|
182
|
+
frameId: ulid() as PFrameInternal.PFrameId,
|
|
183
|
+
spillPath: tmpdir()
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
const actualResponse = await pframe.deleteColumn(request);
|
|
187
|
+
expect(actualResponse).toEqual(expectedResponse);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test.concurrent('set_column_data_request', async ({ expect }) => {
|
|
191
|
+
const testCase = 'set_column_data_request';
|
|
192
|
+
|
|
193
|
+
const columnId = 'column1' as PObjectId;
|
|
194
|
+
const columnSpec = readJsonTestFile(testCase, 'column.spec');
|
|
195
|
+
const dataInfo = readJsonTestFile(testCase, 'column.datainfo');
|
|
196
|
+
const dataSource = createTestDataSource(testCase);
|
|
197
|
+
|
|
198
|
+
using pframe = PFrameFactory.createPFrame({
|
|
199
|
+
frameId: ulid() as PFrameInternal.PFrameId,
|
|
200
|
+
spillPath: tmpdir()
|
|
201
|
+
});
|
|
202
|
+
pframe.setDataSource(dataSource);
|
|
203
|
+
|
|
204
|
+
pframe.addColumnSpec(columnId, columnSpec);
|
|
205
|
+
await pframe.setColumnData(columnId, dataInfo);
|
|
206
|
+
|
|
207
|
+
const columnList = await pframe.listColumns();
|
|
208
|
+
expect(columnList).toEqual([
|
|
209
|
+
{ columnId: columnId, spec: columnSpec, hasData: true }
|
|
210
|
+
]);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test.concurrent('unique_values_request', async ({ expect }) => {
|
|
214
|
+
const testCase = 'unique_values_request';
|
|
215
|
+
|
|
216
|
+
const columnId = 'column' as PObjectId;
|
|
217
|
+
const columnSpec = readJsonTestFile(testCase, 'column.spec');
|
|
218
|
+
const dataInfo = readJsonTestFile(testCase, 'column.datainfo');
|
|
219
|
+
const dataSource = createTestDataSource(testCase);
|
|
220
|
+
const request = readJsonTestFile(testCase, 'request.json');
|
|
221
|
+
|
|
222
|
+
const expectedResponse: UniqueValuesResponse = {
|
|
223
|
+
values: {
|
|
224
|
+
type: 'Long',
|
|
225
|
+
data: new BigInt64Array([BigInt(10), BigInt(11), BigInt(12)]),
|
|
226
|
+
isNA: new Uint8Array(),
|
|
227
|
+
absent: new Uint8Array()
|
|
228
|
+
},
|
|
229
|
+
overflow: false
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
using pframe = PFrameFactory.createPFrame({
|
|
233
|
+
frameId: ulid() as PFrameInternal.PFrameId,
|
|
234
|
+
spillPath: tmpdir()
|
|
235
|
+
});
|
|
236
|
+
pframe.setDataSource(dataSource);
|
|
237
|
+
|
|
238
|
+
pframe.addColumnSpec(columnId, columnSpec);
|
|
239
|
+
await pframe.setColumnData(columnId, dataInfo);
|
|
240
|
+
|
|
241
|
+
const actualResponse = await pframe.getUniqueValues(request);
|
|
242
|
+
expect(actualResponse).toEqual(expectedResponse);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
describe('PFrame Table Creation', () => {
|
|
247
|
+
// Expected responses for table creation tests
|
|
248
|
+
const createTableExpectedResponses = {
|
|
249
|
+
request1: [
|
|
250
|
+
{
|
|
251
|
+
type: 'Int' as const,
|
|
252
|
+
data: new Int32Array([10]),
|
|
253
|
+
isNA: new Uint8Array(),
|
|
254
|
+
absent: new Uint8Array()
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
type: 'Float' as const,
|
|
258
|
+
data: new Float32Array([10.0]),
|
|
259
|
+
isNA: new Uint8Array(),
|
|
260
|
+
absent: new Uint8Array()
|
|
261
|
+
}
|
|
262
|
+
] as PTableVector[],
|
|
263
|
+
request2: [
|
|
264
|
+
{
|
|
265
|
+
type: 'Long' as const,
|
|
266
|
+
data: new BigInt64Array([BigInt(10)]),
|
|
267
|
+
isNA: new Uint8Array(),
|
|
268
|
+
absent: new Uint8Array()
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
type: 'Double' as const,
|
|
272
|
+
data: new Float64Array([10.0]),
|
|
273
|
+
isNA: new Uint8Array(),
|
|
274
|
+
absent: new Uint8Array()
|
|
275
|
+
}
|
|
276
|
+
] as PTableVector[],
|
|
277
|
+
request3: [
|
|
278
|
+
{
|
|
279
|
+
type: 'String' as const,
|
|
280
|
+
data: ['10'],
|
|
281
|
+
isNA: new Uint8Array(),
|
|
282
|
+
absent: new Uint8Array()
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
type: 'Bytes' as const,
|
|
286
|
+
data: [new Uint8Array([49, 48])],
|
|
287
|
+
isNA: new Uint8Array(),
|
|
288
|
+
absent: new Uint8Array()
|
|
289
|
+
}
|
|
290
|
+
] as PTableVector[],
|
|
291
|
+
request4: [
|
|
292
|
+
{
|
|
293
|
+
type: 'String' as const,
|
|
294
|
+
data: ['10'],
|
|
295
|
+
isNA: new Uint8Array(),
|
|
296
|
+
absent: new Uint8Array()
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
type: 'Float' as const,
|
|
300
|
+
data: new Float32Array([NaN]),
|
|
301
|
+
isNA: new Uint8Array([128]),
|
|
302
|
+
absent: new Uint8Array()
|
|
303
|
+
}
|
|
304
|
+
] as PTableVector[]
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
test.concurrent('create_table_request_1', async ({ expect }) => {
|
|
308
|
+
const testCase = 'create_table_request_1';
|
|
309
|
+
const request = readJsonTestFile(testCase, 'request.json');
|
|
310
|
+
const expectedResponse = createTableExpectedResponses.request1;
|
|
311
|
+
|
|
312
|
+
using pframe = await readPFrame(testCase);
|
|
313
|
+
using table = pframe.createTable(
|
|
314
|
+
ulid() as PFrameInternal.PTableId,
|
|
315
|
+
request
|
|
316
|
+
);
|
|
317
|
+
|
|
318
|
+
const columnIndices = Array.from(
|
|
319
|
+
{ length: table.getSpec().length },
|
|
320
|
+
(_, i) => i
|
|
321
|
+
);
|
|
322
|
+
const actualResponse = await table.getData(columnIndices);
|
|
323
|
+
expect(actualResponse).toEqual(expectedResponse);
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
test.concurrent('create_table_request_2', async ({ expect }) => {
|
|
327
|
+
const testCase = 'create_table_request_2';
|
|
328
|
+
const request = readJsonTestFile(testCase, 'request.json');
|
|
329
|
+
const expectedResponse = createTableExpectedResponses.request2;
|
|
330
|
+
|
|
331
|
+
using pframe = await readPFrame(testCase);
|
|
332
|
+
using table = pframe.createTable(
|
|
333
|
+
ulid() as PFrameInternal.PTableId,
|
|
334
|
+
request
|
|
335
|
+
);
|
|
336
|
+
|
|
337
|
+
const columnIndices = Array.from(
|
|
338
|
+
{ length: table.getSpec().length },
|
|
339
|
+
(_, i) => i
|
|
340
|
+
);
|
|
341
|
+
const actualResponse = await table.getData(columnIndices);
|
|
342
|
+
expect(actualResponse).toEqual(expectedResponse);
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
test.concurrent('create_table_request_3', async ({ expect }) => {
|
|
346
|
+
const testCase = 'create_table_request_3';
|
|
347
|
+
const request = readJsonTestFile(testCase, 'request.json');
|
|
348
|
+
const expectedResponse = createTableExpectedResponses.request3;
|
|
349
|
+
|
|
350
|
+
using pframe = await readPFrame(testCase);
|
|
351
|
+
using table = pframe.createTable(
|
|
352
|
+
ulid() as PFrameInternal.PTableId,
|
|
353
|
+
request
|
|
354
|
+
);
|
|
355
|
+
|
|
356
|
+
const columnIndices = Array.from(
|
|
357
|
+
{ length: table.getSpec().length },
|
|
358
|
+
(_, i) => i
|
|
359
|
+
);
|
|
360
|
+
const actualResponse = await table.getData(columnIndices);
|
|
361
|
+
expect(actualResponse).toEqual(expectedResponse);
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
test.concurrent('create_table_request_4', async ({ expect }) => {
|
|
365
|
+
const testCase = 'create_table_request_4';
|
|
366
|
+
const request = readJsonTestFile(testCase, 'request.json');
|
|
367
|
+
const expectedResponse = createTableExpectedResponses.request4;
|
|
368
|
+
|
|
369
|
+
using pframe = await readPFrame(testCase);
|
|
370
|
+
using table = pframe.createTable(
|
|
371
|
+
ulid() as PFrameInternal.PTableId,
|
|
372
|
+
request
|
|
373
|
+
);
|
|
374
|
+
|
|
375
|
+
const columnIndices = Array.from(
|
|
376
|
+
{ length: table.getSpec().length },
|
|
377
|
+
(_, i) => i
|
|
378
|
+
);
|
|
379
|
+
const actualResponse = await table.getData(columnIndices);
|
|
380
|
+
expect(actualResponse).toEqual(expectedResponse);
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
test.concurrent('create_table_request_fail', async ({ expect }) => {
|
|
384
|
+
const testCase = 'create_table_request_fail';
|
|
385
|
+
|
|
386
|
+
const columnId = 'column' as PObjectId;
|
|
387
|
+
const columnSpec = readJsonTestFile(testCase, 'column.spec');
|
|
388
|
+
const dataInfo = readJsonTestFile(testCase, 'column.datainfo');
|
|
389
|
+
const dataSource = createFailingDataSource();
|
|
390
|
+
const request = readJsonTestFile(testCase, 'request.json');
|
|
391
|
+
|
|
392
|
+
using pframe = PFrameFactory.createPFrame({
|
|
393
|
+
frameId: ulid() as PFrameInternal.PFrameId,
|
|
394
|
+
spillPath: tmpdir()
|
|
395
|
+
});
|
|
396
|
+
pframe.setDataSource(dataSource);
|
|
397
|
+
|
|
398
|
+
pframe.addColumnSpec(columnId, columnSpec);
|
|
399
|
+
await pframe.setColumnData(columnId, dataInfo);
|
|
400
|
+
|
|
401
|
+
using table = pframe.createTable(
|
|
402
|
+
ulid() as PFrameInternal.PTableId,
|
|
403
|
+
request
|
|
404
|
+
);
|
|
405
|
+
|
|
406
|
+
await expect(table.getShape()).rejects.toThrow();
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
describe('PFrame Table Operations', () => {
|
|
411
|
+
test.concurrent('sort_table_request', async ({ expect }) => {
|
|
412
|
+
const testCase = 'sort_table_request';
|
|
413
|
+
|
|
414
|
+
const request = readJsonTestFile(testCase, 'request.json');
|
|
415
|
+
const sorting: PTableSorting[] = readJsonTestFile(testCase, 'sorting.json');
|
|
416
|
+
|
|
417
|
+
// Expected response for full sorted data
|
|
418
|
+
let expectedFullResponse: PTableVector[] = [
|
|
419
|
+
{
|
|
420
|
+
type: 'Long',
|
|
421
|
+
data: new BigInt64Array([BigInt(0), BigInt(0), BigInt(1), BigInt(2)]),
|
|
422
|
+
isNA: new Uint8Array(),
|
|
423
|
+
absent: new Uint8Array()
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
type: 'String',
|
|
427
|
+
data: ['FloatOne', 'FloatTwo', null, null],
|
|
428
|
+
isNA: new Uint8Array(),
|
|
429
|
+
absent: new Uint8Array([48])
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
type: 'String',
|
|
433
|
+
data: [null, null, 'IntOne', 'IntTwo'],
|
|
434
|
+
isNA: new Uint8Array(),
|
|
435
|
+
absent: new Uint8Array([192])
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
type: 'Float',
|
|
439
|
+
data: new Float32Array([1.0, 2.0, NaN, NaN]),
|
|
440
|
+
isNA: new Uint8Array(),
|
|
441
|
+
absent: new Uint8Array([48])
|
|
442
|
+
}
|
|
443
|
+
];
|
|
444
|
+
|
|
445
|
+
// Expected response for range query
|
|
446
|
+
const expectedRangeResponse: PTableVector[] = [
|
|
447
|
+
{
|
|
448
|
+
type: 'Float',
|
|
449
|
+
data: new Float32Array([2.0, NaN]),
|
|
450
|
+
isNA: new Uint8Array(),
|
|
451
|
+
absent: new Uint8Array([64])
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
type: 'String',
|
|
455
|
+
data: [null, 'IntOne'],
|
|
456
|
+
isNA: new Uint8Array(),
|
|
457
|
+
absent: new Uint8Array([128])
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
type: 'String',
|
|
461
|
+
data: ['FloatTwo', null],
|
|
462
|
+
isNA: new Uint8Array(),
|
|
463
|
+
absent: new Uint8Array([64])
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
type: 'Long',
|
|
467
|
+
data: new BigInt64Array([BigInt(0), BigInt(1)]),
|
|
468
|
+
isNA: new Uint8Array(),
|
|
469
|
+
absent: new Uint8Array()
|
|
470
|
+
}
|
|
471
|
+
];
|
|
472
|
+
|
|
473
|
+
using pframe = await readPFrame(testCase);
|
|
474
|
+
using table = pframe.createTable(
|
|
475
|
+
ulid() as PFrameInternal.PTableId,
|
|
476
|
+
request
|
|
477
|
+
);
|
|
478
|
+
|
|
479
|
+
using sortedTable = table.sort(ulid() as PFrameInternal.PTableId, sorting);
|
|
480
|
+
const footprint = await sortedTable.getFootprint();
|
|
481
|
+
expect(footprint).toBeGreaterThan(0);
|
|
482
|
+
|
|
483
|
+
// Test full sorted data
|
|
484
|
+
const columnIndices = sortedTable.getColumnIndices(
|
|
485
|
+
Array.from(sorting, (entry) => entry.column)
|
|
486
|
+
);
|
|
487
|
+
let actualResponse = await sortedTable.getData(columnIndices);
|
|
488
|
+
expect(actualResponse).toEqual(expectedFullResponse);
|
|
489
|
+
|
|
490
|
+
// Test range query with reordered columns
|
|
491
|
+
actualResponse = await sortedTable.getData(
|
|
492
|
+
[columnIndices[3], columnIndices[2], columnIndices[1], columnIndices[0]],
|
|
493
|
+
{ range: { offset: 1, length: 2 } }
|
|
494
|
+
);
|
|
495
|
+
expect(actualResponse).toEqual(expectedRangeResponse);
|
|
496
|
+
});
|
|
497
|
+
});
|
|
498
|
+
|
|
499
|
+
describe('PFrame Complex Operations', () => {
|
|
500
|
+
test.concurrent('complex_join', async ({ expect }) => {
|
|
501
|
+
const testCase = 'complex_join';
|
|
502
|
+
using pframe = await readPFrame(testCase);
|
|
503
|
+
|
|
504
|
+
const request = readJsonTestFile(testCase, 'request.json');
|
|
505
|
+
using table = pframe.createTable(
|
|
506
|
+
ulid() as PFrameInternal.PTableId,
|
|
507
|
+
request
|
|
508
|
+
);
|
|
509
|
+
|
|
510
|
+
const shape = await table.getShape();
|
|
511
|
+
expect(shape).toEqual({
|
|
512
|
+
columns: 6,
|
|
513
|
+
rows: 7124
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
// Test profiling functionality (platform-dependent)
|
|
517
|
+
if (process.platform === 'win32') {
|
|
518
|
+
expect(PFrameFactory.pprofDump()).rejects.toThrow();
|
|
519
|
+
} else {
|
|
520
|
+
const profile = await PFrameFactory.pprofDump();
|
|
521
|
+
const profilePath = path.join(tmpdir(), `profile_${Date.now()}.pb.gz`);
|
|
522
|
+
fs.writeFileSync(profilePath, profile);
|
|
523
|
+
console.log(`Profile saved to ${profilePath}`);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// Test out of bounds range
|
|
527
|
+
const result = await table.getData([0], {
|
|
528
|
+
range: { offset: 10000, length: 20000 }
|
|
529
|
+
});
|
|
530
|
+
expect(result).toMatchObject([{ data: [] }]);
|
|
531
|
+
|
|
532
|
+
const result2 = await table.getData([0], {
|
|
533
|
+
range: { offset: 7123, length: 2 }
|
|
534
|
+
});
|
|
535
|
+
expect(result2[0].data.length).toBe(1);
|
|
536
|
+
});
|
|
537
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { expect } from 'vitest';
|
|
2
|
+
import { Tester, TesterContext } from '@vitest/expect';
|
|
3
|
+
|
|
4
|
+
function areTypedArraysEqual(
|
|
5
|
+
this: TesterContext,
|
|
6
|
+
lhs: unknown,
|
|
7
|
+
rhs: unknown,
|
|
8
|
+
customTesters: Array<Tester>
|
|
9
|
+
): boolean | undefined {
|
|
10
|
+
const isTypedArray = (value: unknown): value is Object & unknown[] =>
|
|
11
|
+
ArrayBuffer.isView(value);
|
|
12
|
+
|
|
13
|
+
const lhsIsTypedArray = isTypedArray(lhs);
|
|
14
|
+
const rhsIsTypedArray = isTypedArray(rhs);
|
|
15
|
+
|
|
16
|
+
if (lhsIsTypedArray && rhsIsTypedArray) {
|
|
17
|
+
if (!this.equals(lhs.constructor.name, rhs.constructor.name, customTesters))
|
|
18
|
+
return false;
|
|
19
|
+
if (
|
|
20
|
+
!this.equals(
|
|
21
|
+
lhs.constructor.length,
|
|
22
|
+
rhs.constructor.length,
|
|
23
|
+
customTesters
|
|
24
|
+
)
|
|
25
|
+
)
|
|
26
|
+
return false;
|
|
27
|
+
for (let j = 0; j < lhs.constructor.length; ++j) {
|
|
28
|
+
if (!this.equals(lhs[j], rhs[j], customTesters)) return false;
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
} else if (lhsIsTypedArray === rhsIsTypedArray) {
|
|
32
|
+
return undefined;
|
|
33
|
+
} else {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
expect.addEqualityTesters([areTypedArraysEqual]);
|