@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.
Files changed (241) hide show
  1. package/export/addon-def.ts +6 -9
  2. package/export/export.ts +3 -3
  3. package/export/tests/pframes.test.ts +537 -0
  4. package/export/tests/setup.ts +38 -0
  5. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.2LVJN6O24SEU2T6ZZRA3ZNIA.jdata +82 -0
  6. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.2MO4YNOSI4C2L7GHVIZ6YSYT.jdata +139 -0
  7. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.2R6YWG3EVKXULZJIZYSZYASV.jdata +151 -0
  8. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.2RFBXQYLZVPIYLITVUUU3GR6.jdata +136 -0
  9. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.2ZCJ73VD223TO7UVCF4DLSKS.jdata +166 -0
  10. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.2ZCOKJLMPCZTTSJQEYCYM2D6.jdata +18 -0
  11. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.32L5DZ6D632DGLU3OIBB3HGX.jdata +76 -0
  12. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.34LTVMPK2UDCR34EHCSEYX3W.jdata +19 -0
  13. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.3K6KCP5JDGW4X7DXT5RF6ZAF.jdata +121 -0
  14. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.5BJ4G7MKY3KGJAZMAYHRDDTI.jdata +106 -0
  15. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.5QIRD6GYS57CH4FPJLYCUDUN.jdata +81 -0
  16. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.6465KFARE44HTYJ4DLVE2POI.jdata +124 -0
  17. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.7EN5RO34NCDPWAWCIBM4UDIA.jdata +62 -0
  18. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.7HQRZGQAFAUVMAXUSH4QK35W.jdata +172 -0
  19. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.7IFCRZFNQ62AIPBKYYWNJKLP.jdata +166 -0
  20. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.7PPYAJDDR7DGHLI5YSFBGIX4.jdata +68 -0
  21. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.A7LBATMSQCBKAPGIUKAFX7ZQ.jdata +13 -0
  22. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.AQUOPWRX3Q2QNR2IWWMMGRCF.jdata +88 -0
  23. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.AY2WCVRGDI4KDBSNN4VWISRV.jdata +19 -0
  24. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.AZHBA2KSN2ZSGCQF32V3AZGH.jdata +18 -0
  25. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.B2X77CFBR4AHVC4UE3YWHRSE.jdata +1 -0
  26. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.BDGKT2HBP4KRZYQW7IOL3MXX.jdata +104 -0
  27. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.BUPSWPETJ4HHWZOY6M3X2AUV.jdata +48 -0
  28. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.CHH6NIYBJUBIWROO4LXF3AK2.jdata +28 -0
  29. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.CHI3Y6POL64COZMAEHK7RKOO.jdata +167 -0
  30. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.D4DU6MUFJX5C572GM25IWLFV.jdata +79 -0
  31. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.DFO4BLLJ4GVHRBYGLAJ7QUN2.jdata +59 -0
  32. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.DFQDMMGE23YQY5MCLNKOMZJM.jdata +118 -0
  33. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.DXWTOE3QM2D4XAICJLVAUOYH.jdata +173 -0
  34. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.E7DBFSJQQOZIWEZ4UIABFVTP.jdata +20 -0
  35. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.FILU5VIR2FDT3SRDYE322USR.jdata +181 -0
  36. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.GF24HO7CQHY55O6JKWEDKHNF.jdata +78 -0
  37. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.HBT3EGHORD2TZRM7XG5PO5II.jdata +136 -0
  38. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.HXBZGAQ724Y567AKGQOAAF2J.jdata +74 -0
  39. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.IBB3SCZSTCEZQFO4S7L6GVUH.jdata +149 -0
  40. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.ICOC34NWMBSXEFXQOO2BNY4H.jdata +59 -0
  41. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.IQPTOXVWTTENLD2E4VKNU56D.jdata +102 -0
  42. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.JP3IIRDA6QZDW4EZLKRII7KS.jdata +86 -0
  43. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.JZE5QCNYF4YHZYRGUZ6XRJHQ.jdata +84 -0
  44. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.K6A7V2JOVSAX7RHIZ2RPXYBP.jdata +1 -0
  45. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.KL7USBR5ZQUIN7K7MF3U7P73.jdata +64 -0
  46. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.KMZNMPE7IWFLWKPMN7OABWXZ.jdata +59 -0
  47. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.KZPHVIUPQIAFL2HTOAJR7VGJ.jdata +1 -0
  48. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.KZSRESLOPXQ4WH6ALAJP7U5H.jdata +196 -0
  49. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.LGBPQ5XC2BUGG4TJWYHTFZGE.jdata +89 -0
  50. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.LMLLDWOFTAPH3QVSOM7MHQ22.jdata +73 -0
  51. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.LVVUZMJT5MREBDWME5RSK7KI.jdata +146 -0
  52. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.LXBE5P62YKG5UDJGJRL6MSQC.jdata +68 -0
  53. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.MLOU6WK4ZV7K6HIWPE3LRWI2.jdata +98 -0
  54. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.NAL3QCUSLD44QGSRCQ5TZOAH.jdata +69 -0
  55. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.NWX7DKTFXRVH4ZYUTZULRDWT.jdata +80 -0
  56. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.O6M53LCMV7A3II22GUPKCJGP.jdata +98 -0
  57. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.PMARMGPM4IBPA3VCS3CYH5WM.jdata +32 -0
  58. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.PMJ37ZMFMTFORL4UYUDVNDZG.jdata +126 -0
  59. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.QPWLPWRWPFGRVQI5OS2RGXBW.jdata +26 -0
  60. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.QQ4RGTF2PBGNUPTLCO3Z3T2C.jdata +22 -0
  61. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.QWXPZSGYDRGIUZS6VDHGVLTF.jdata +72 -0
  62. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.QXQWSMICPPJGLPUQ33IQJK7F.jdata +90 -0
  63. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.RBX3IONPE5K2HMS4MAT4MKQY.jdata +146 -0
  64. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.RHKAHOLA74IHPBG75KQN4NAV.jdata +59 -0
  65. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.RWI3IGNEUOAJR7ZWU7NSPF72.jdata +67 -0
  66. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.SOVBQDZPBYCVZTRZF3CXHWOW.jdata +91 -0
  67. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.SWLOWAB2PTM5R2XN765A3ICZ.jdata +104 -0
  68. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.T3WRQEFUPCZICFXMJ5F6DQX3.jdata +131 -0
  69. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.TETZ2IEF3L2GYDJLNU3BVKMX.jdata +76 -0
  70. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.UXO4UE2Q7HO42SNSO4DULKJJ.jdata +118 -0
  71. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.VAUTIV2ROH62WNMZZCIGRBDC.jdata +132 -0
  72. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.VBP7Z5WQ2IOHMQIA5UV4DOH3.jdata +71 -0
  73. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.VCKGU2COVX6O3RUXNRC7FRCJ.jdata +151 -0
  74. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.VOCGDDBWN5H64YJZP3EPSZNU.jdata +158 -0
  75. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.VPEMTWGQVZ6ZSNF426GPHUXI.jdata +93 -0
  76. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.WAS2QNFHHPD2UIZ44F2IKRQ6.jdata +101 -0
  77. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.WYCWV4434DAMKRUU7F7LGZGR.jdata +142 -0
  78. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.XGWYF7VR6EIU3OWPXAWHP2PE.jdata +156 -0
  79. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.XJQYA42VX2WKHPAJWAUBHAXN.jdata +119 -0
  80. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.XLTFOXR4VH54UCW6BVEND6GI.jdata +85 -0
  81. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.YMTPJWXHLMW4IPBQABT3326F.jdata +109 -0
  82. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.YOIX3HY7SWPCY7AOBSDA3GLC.jdata +1 -0
  83. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.YSEQPSWWTXZTW52G5ZZU46RT.jdata +93 -0
  84. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.ZZ54PNLFYZ6GSOR2AESKXRL4.jdata +89 -0
  85. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.datainfo +86 -0
  86. package/export/tests/test_data/complex_join/export.cloneset.CDR3_length_aa.spec +42 -0
  87. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.2LVJN6O24SEU2T6ZZRA3ZNIA.jdata +82 -0
  88. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.2MO4YNOSI4C2L7GHVIZ6YSYT.jdata +139 -0
  89. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.2R6YWG3EVKXULZJIZYSZYASV.jdata +151 -0
  90. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.2RFBXQYLZVPIYLITVUUU3GR6.jdata +136 -0
  91. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.2ZCJ73VD223TO7UVCF4DLSKS.jdata +166 -0
  92. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.2ZCOKJLMPCZTTSJQEYCYM2D6.jdata +18 -0
  93. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.32L5DZ6D632DGLU3OIBB3HGX.jdata +76 -0
  94. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.34LTVMPK2UDCR34EHCSEYX3W.jdata +19 -0
  95. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.3K6KCP5JDGW4X7DXT5RF6ZAF.jdata +121 -0
  96. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.5BJ4G7MKY3KGJAZMAYHRDDTI.jdata +106 -0
  97. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.5QIRD6GYS57CH4FPJLYCUDUN.jdata +81 -0
  98. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.6465KFARE44HTYJ4DLVE2POI.jdata +124 -0
  99. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.7EN5RO34NCDPWAWCIBM4UDIA.jdata +62 -0
  100. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.7HQRZGQAFAUVMAXUSH4QK35W.jdata +172 -0
  101. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.7IFCRZFNQ62AIPBKYYWNJKLP.jdata +166 -0
  102. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.7PPYAJDDR7DGHLI5YSFBGIX4.jdata +68 -0
  103. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.A7LBATMSQCBKAPGIUKAFX7ZQ.jdata +13 -0
  104. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.AQUOPWRX3Q2QNR2IWWMMGRCF.jdata +88 -0
  105. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.AY2WCVRGDI4KDBSNN4VWISRV.jdata +19 -0
  106. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.AZHBA2KSN2ZSGCQF32V3AZGH.jdata +18 -0
  107. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.B2X77CFBR4AHVC4UE3YWHRSE.jdata +1 -0
  108. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.BDGKT2HBP4KRZYQW7IOL3MXX.jdata +104 -0
  109. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.BUPSWPETJ4HHWZOY6M3X2AUV.jdata +48 -0
  110. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.CHH6NIYBJUBIWROO4LXF3AK2.jdata +28 -0
  111. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.CHI3Y6POL64COZMAEHK7RKOO.jdata +167 -0
  112. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.D4DU6MUFJX5C572GM25IWLFV.jdata +79 -0
  113. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.DFO4BLLJ4GVHRBYGLAJ7QUN2.jdata +59 -0
  114. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.DFQDMMGE23YQY5MCLNKOMZJM.jdata +118 -0
  115. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.DXWTOE3QM2D4XAICJLVAUOYH.jdata +173 -0
  116. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.E7DBFSJQQOZIWEZ4UIABFVTP.jdata +20 -0
  117. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.FILU5VIR2FDT3SRDYE322USR.jdata +181 -0
  118. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.GF24HO7CQHY55O6JKWEDKHNF.jdata +78 -0
  119. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.HBT3EGHORD2TZRM7XG5PO5II.jdata +136 -0
  120. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.HXBZGAQ724Y567AKGQOAAF2J.jdata +74 -0
  121. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.IBB3SCZSTCEZQFO4S7L6GVUH.jdata +149 -0
  122. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.ICOC34NWMBSXEFXQOO2BNY4H.jdata +59 -0
  123. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.IQPTOXVWTTENLD2E4VKNU56D.jdata +102 -0
  124. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.JP3IIRDA6QZDW4EZLKRII7KS.jdata +86 -0
  125. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.JZE5QCNYF4YHZYRGUZ6XRJHQ.jdata +84 -0
  126. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.K6A7V2JOVSAX7RHIZ2RPXYBP.jdata +1 -0
  127. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.KL7USBR5ZQUIN7K7MF3U7P73.jdata +64 -0
  128. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.KMZNMPE7IWFLWKPMN7OABWXZ.jdata +59 -0
  129. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.KZPHVIUPQIAFL2HTOAJR7VGJ.jdata +1 -0
  130. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.KZSRESLOPXQ4WH6ALAJP7U5H.jdata +196 -0
  131. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.LGBPQ5XC2BUGG4TJWYHTFZGE.jdata +89 -0
  132. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.LMLLDWOFTAPH3QVSOM7MHQ22.jdata +73 -0
  133. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.LVVUZMJT5MREBDWME5RSK7KI.jdata +146 -0
  134. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.LXBE5P62YKG5UDJGJRL6MSQC.jdata +68 -0
  135. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.MLOU6WK4ZV7K6HIWPE3LRWI2.jdata +98 -0
  136. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.NAL3QCUSLD44QGSRCQ5TZOAH.jdata +69 -0
  137. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.NWX7DKTFXRVH4ZYUTZULRDWT.jdata +80 -0
  138. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.O6M53LCMV7A3II22GUPKCJGP.jdata +98 -0
  139. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.PMARMGPM4IBPA3VCS3CYH5WM.jdata +32 -0
  140. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.PMJ37ZMFMTFORL4UYUDVNDZG.jdata +126 -0
  141. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.QPWLPWRWPFGRVQI5OS2RGXBW.jdata +26 -0
  142. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.QQ4RGTF2PBGNUPTLCO3Z3T2C.jdata +22 -0
  143. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.QWXPZSGYDRGIUZS6VDHGVLTF.jdata +72 -0
  144. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.QXQWSMICPPJGLPUQ33IQJK7F.jdata +90 -0
  145. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.RBX3IONPE5K2HMS4MAT4MKQY.jdata +146 -0
  146. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.RHKAHOLA74IHPBG75KQN4NAV.jdata +59 -0
  147. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.RWI3IGNEUOAJR7ZWU7NSPF72.jdata +67 -0
  148. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.SOVBQDZPBYCVZTRZF3CXHWOW.jdata +91 -0
  149. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.SWLOWAB2PTM5R2XN765A3ICZ.jdata +104 -0
  150. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.T3WRQEFUPCZICFXMJ5F6DQX3.jdata +131 -0
  151. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.TETZ2IEF3L2GYDJLNU3BVKMX.jdata +76 -0
  152. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.UXO4UE2Q7HO42SNSO4DULKJJ.jdata +118 -0
  153. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.VAUTIV2ROH62WNMZZCIGRBDC.jdata +132 -0
  154. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.VBP7Z5WQ2IOHMQIA5UV4DOH3.jdata +71 -0
  155. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.VCKGU2COVX6O3RUXNRC7FRCJ.jdata +151 -0
  156. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.VOCGDDBWN5H64YJZP3EPSZNU.jdata +158 -0
  157. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.VPEMTWGQVZ6ZSNF426GPHUXI.jdata +93 -0
  158. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.WAS2QNFHHPD2UIZ44F2IKRQ6.jdata +101 -0
  159. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.WYCWV4434DAMKRUU7F7LGZGR.jdata +142 -0
  160. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.XGWYF7VR6EIU3OWPXAWHP2PE.jdata +156 -0
  161. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.XJQYA42VX2WKHPAJWAUBHAXN.jdata +119 -0
  162. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.XLTFOXR4VH54UCW6BVEND6GI.jdata +85 -0
  163. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.YMTPJWXHLMW4IPBQABT3326F.jdata +109 -0
  164. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.YOIX3HY7SWPCY7AOBSDA3GLC.jdata +1 -0
  165. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.YSEQPSWWTXZTW52G5ZZU46RT.jdata +93 -0
  166. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.ZZ54PNLFYZ6GSOR2AESKXRL4.jdata +89 -0
  167. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.datainfo +86 -0
  168. package/export/tests/test_data/complex_join/export.cloneset.ReadsCount.spec +37 -0
  169. package/export/tests/test_data/complex_join/metadata.7ZNW7LBUDMBSQJ26KYSSTBPJ.datainfo +5 -0
  170. package/export/tests/test_data/complex_join/metadata.7ZNW7LBUDMBSQJ26KYSSTBPJ.jdata +82 -0
  171. package/export/tests/test_data/complex_join/metadata.7ZNW7LBUDMBSQJ26KYSSTBPJ.spec +14 -0
  172. package/export/tests/test_data/complex_join/request.json +43 -0
  173. package/export/tests/test_data/create_table_request_1/column.datainfo +7 -0
  174. package/export/tests/test_data/create_table_request_1/column.spec +11 -0
  175. package/export/tests/test_data/create_table_request_1/request.json +8 -0
  176. package/export/tests/test_data/create_table_request_2/column.datainfo +7 -0
  177. package/export/tests/test_data/create_table_request_2/column.spec +11 -0
  178. package/export/tests/test_data/create_table_request_2/request.json +8 -0
  179. package/export/tests/test_data/create_table_request_3/column.datainfo +7 -0
  180. package/export/tests/test_data/create_table_request_3/column.spec +11 -0
  181. package/export/tests/test_data/create_table_request_3/request.json +8 -0
  182. package/export/tests/test_data/create_table_request_4/column.datainfo +7 -0
  183. package/export/tests/test_data/create_table_request_4/column.spec +11 -0
  184. package/export/tests/test_data/create_table_request_4/request.json +8 -0
  185. package/export/tests/test_data/create_table_request_fail/column.datainfo +5 -0
  186. package/export/tests/test_data/create_table_request_fail/column.spec +11 -0
  187. package/export/tests/test_data/create_table_request_fail/request.json +8 -0
  188. package/export/tests/test_data/delete_column_request/request.json +27 -0
  189. package/export/tests/test_data/delete_column_request/response.json +13 -0
  190. package/export/tests/test_data/find_columns_request/column.spec +11 -0
  191. package/export/tests/test_data/find_columns_request/request.json +5 -0
  192. package/export/tests/test_data/find_columns_request/response.json +21 -0
  193. package/export/tests/test_data/get_column_spec_request/column.spec +11 -0
  194. package/export/tests/test_data/get_column_spec_request/response.json +11 -0
  195. package/export/tests/test_data/set_column_data_request/column.datainfo +5 -0
  196. package/export/tests/test_data/set_column_data_request/column.jdata +24 -0
  197. package/export/tests/test_data/set_column_data_request/column.spec +14 -0
  198. package/export/tests/test_data/sort_table_request/column1.datainfo +5 -0
  199. package/export/tests/test_data/sort_table_request/column1.jdata +4 -0
  200. package/export/tests/test_data/sort_table_request/column1.spec +11 -0
  201. package/export/tests/test_data/sort_table_request/column2.datainfo +5 -0
  202. package/export/tests/test_data/sort_table_request/column2.jdata +4 -0
  203. package/export/tests/test_data/sort_table_request/column2.spec +15 -0
  204. package/export/tests/test_data/sort_table_request/request.json +18 -0
  205. package/export/tests/test_data/sort_table_request/sorting.json +40 -0
  206. package/export/tests/test_data/unique_values_request/column.datainfo +5 -0
  207. package/export/tests/test_data/unique_values_request/column.jdata +5 -0
  208. package/export/tests/test_data/unique_values_request/column.spec +11 -0
  209. package/export/tests/test_data/unique_values_request/request.json +5 -0
  210. package/export/wrapper.ts +79 -42
  211. package/export_dist/{export/addon-def.d.ts → addon-def.d.ts} +6 -12
  212. package/export_dist/addon-def.d.ts.map +1 -0
  213. package/export_dist/addon.cjs.map +1 -1
  214. package/export_dist/addon.d.ts.map +1 -0
  215. package/export_dist/addon.js.map +1 -1
  216. package/export_dist/dump.cjs.map +1 -1
  217. package/export_dist/dump.d.ts.map +1 -0
  218. package/export_dist/dump.js.map +1 -1
  219. package/export_dist/export.cjs.map +1 -1
  220. package/export_dist/{export/export.d.ts → export.d.ts} +1 -1
  221. package/export_dist/export.d.ts.map +1 -0
  222. package/export_dist/export.js.map +1 -1
  223. package/export_dist/index.d.ts.map +1 -0
  224. package/export_dist/tests/pframes.test.d.ts.map +1 -1
  225. package/export_dist/tests/setup.d.ts.map +1 -1
  226. package/export_dist/wrapper.cjs +65 -27
  227. package/export_dist/wrapper.cjs.map +1 -1
  228. package/export_dist/{export/wrapper.d.ts → wrapper.d.ts} +9 -9
  229. package/export_dist/wrapper.d.ts.map +1 -0
  230. package/export_dist/wrapper.js +65 -27
  231. package/export_dist/wrapper.js.map +1 -1
  232. package/package.json +8 -8
  233. package/export_dist/export/addon-def.d.ts.map +0 -1
  234. package/export_dist/export/addon.d.ts.map +0 -1
  235. package/export_dist/export/dump.d.ts.map +0 -1
  236. package/export_dist/export/export.d.ts.map +0 -1
  237. package/export_dist/export/index.d.ts.map +0 -1
  238. package/export_dist/export/wrapper.d.ts.map +0 -1
  239. /package/export_dist/{export/addon.d.ts → addon.d.ts} +0 -0
  240. /package/export_dist/{export/dump.d.ts → dump.d.ts} +0 -0
  241. /package/export_dist/{export/index.d.ts → index.d.ts} +0 -0
@@ -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: TableId,
61
+ id: PFrameInternal.PTableId,
65
62
  request: PFrameInternal.CreateTableRequestV4
66
63
  ) => NodeTableSymbol;
67
64
  pFrameGetUniqueValues: (
68
65
  pFrame: NodeFrameSymbol,
69
- id: TableId,
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: TableId,
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: TableId,
95
+ id: PFrameInternal.PTableId,
99
96
  request: PTableRecordFilter[]
100
97
  ) => NodeTableSymbol;
101
98
  pTableSort: (
102
99
  boxed: NodeTableSymbol,
103
- id: TableId,
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.PFrameFactoryV3 = {
4
+ export const PFrameFactory: PFrameInternal.PFrameFactoryV4 = {
5
5
  createPFrame: (
6
- options: PFrameInternal.PFrameOptions
7
- ): PFrameInternal.PFrameV12 => {
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]);