@milaboratories/pframes-rs-node 1.0.108 → 1.1.0

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/README.md +1 -1
  2. package/export/addon-def.ts +16 -5
  3. package/export/tests/pframes.test.ts +736 -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 +39 -0
  211. package/export_dist/{export/addon-def.d.ts → addon-def.d.ts} +8 -1
  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.d.ts.map +1 -0
  221. package/export_dist/export.js.map +1 -1
  222. package/export_dist/index.d.ts.map +1 -0
  223. package/export_dist/tests/pframes.test.d.ts.map +1 -1
  224. package/export_dist/tests/setup.d.ts.map +1 -1
  225. package/export_dist/wrapper.cjs +17 -0
  226. package/export_dist/wrapper.cjs.map +1 -1
  227. package/export_dist/{export/wrapper.d.ts → wrapper.d.ts} +8 -1
  228. package/export_dist/wrapper.d.ts.map +1 -0
  229. package/export_dist/wrapper.js +17 -0
  230. package/export_dist/wrapper.js.map +1 -1
  231. package/package.json +31 -26
  232. package/export_dist/export/addon-def.d.ts.map +0 -1
  233. package/export_dist/export/addon.d.ts.map +0 -1
  234. package/export_dist/export/dump.d.ts.map +0 -1
  235. package/export_dist/export/export.d.ts.map +0 -1
  236. package/export_dist/export/index.d.ts.map +0 -1
  237. package/export_dist/export/wrapper.d.ts.map +0 -1
  238. /package/export_dist/{export/addon.d.ts → addon.d.ts} +0 -0
  239. /package/export_dist/{export/dump.d.ts → dump.d.ts} +0 -0
  240. /package/export_dist/{export/export.d.ts → export.d.ts} +0 -0
  241. /package/export_dist/{export/index.d.ts → index.d.ts} +0 -0
@@ -0,0 +1,736 @@
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
+ AxisId,
15
+ PColumnIdAndSpec,
16
+ PObjectId,
17
+ PTableSorting,
18
+ PTableVector,
19
+ QueryData,
20
+ UniqueValuesResponse
21
+ } from '@milaboratories/pl-model-common';
22
+ import { PFrameFactory } from '..';
23
+ import { ulid } from 'ulid';
24
+
25
+ // ============================================================================
26
+ // Test Utility Functions
27
+ // ============================================================================
28
+
29
+ /**
30
+ * Get the path to a test case directory
31
+ */
32
+ function getTestCaseDataPath(testCase: string): string {
33
+ const currentDirectoryPath = path.relative('.', __dirname);
34
+ const testDataPath = path.join(currentDirectoryPath, 'test_data');
35
+ return path.join(testDataPath, testCase);
36
+ }
37
+
38
+ /**
39
+ * Get the full path to a test file
40
+ */
41
+ function getTestFilePath(testCase: string, fileName: string): string {
42
+ return path.join(getTestCaseDataPath(testCase), fileName);
43
+ }
44
+
45
+ /**
46
+ * Read a test file as Buffer
47
+ */
48
+ function readTestFile(testCase: string, fileName: string): Buffer {
49
+ return fs.readFileSync(getTestFilePath(testCase, fileName));
50
+ }
51
+
52
+ /**
53
+ * Read and parse a JSON test file
54
+ */
55
+ function readJsonTestFile(testCase: string, fileName: string): any {
56
+ return JSON.parse(readTestFile(testCase, fileName).toString());
57
+ }
58
+
59
+ /**
60
+ * Create a standard data source for tests that reads from test files
61
+ */
62
+ function createTestDataSource(
63
+ testCase: string
64
+ ): PFrameInternal.PFrameDataSourceV2 {
65
+ return {
66
+ preloadBlob: function (
67
+ blobIds: PFrameInternal.PFrameBlobId[]
68
+ ): Promise<void> {
69
+ return new Promise((resolve) => {
70
+ if (new Set(blobIds).size !== blobIds.length) {
71
+ throw new Error('preload requires array of unique values');
72
+ }
73
+ resolve();
74
+ });
75
+ },
76
+ resolveBlobContent: function (
77
+ blobId: PFrameInternal.PFrameBlobId
78
+ ): Promise<Uint8Array> {
79
+ return new Promise((resolve) => {
80
+ resolve(readTestFile(testCase, blobId));
81
+ });
82
+ }
83
+ };
84
+ }
85
+
86
+ /**
87
+ * Create a failing data source for error testing
88
+ */
89
+ function createFailingDataSource(): PFrameInternal.PFrameDataSourceV2 {
90
+ return {
91
+ preloadBlob: (): Promise<void> => Promise.resolve(),
92
+ resolveBlobContent: (): Promise<Uint8Array> =>
93
+ Promise.reject(new Error('fail'))
94
+ };
95
+ }
96
+
97
+ /**
98
+ * Read a complete PFrame from test data directory
99
+ * Automatically loads all .spec files and their corresponding .datainfo files
100
+ */
101
+ async function readPFrame(testCase: string): Promise<PFrameInternal.PFrameV13> {
102
+ const dataSource = createTestDataSource(testCase);
103
+ const pframe = PFrameFactory.createPFrame({
104
+ frameId: ulid() as PFrameInternal.PFrameId,
105
+ spillPath: tmpdir() /*, logger: console.log */
106
+ });
107
+ pframe.setDataSource(dataSource);
108
+
109
+ const testCasePath = getTestCaseDataPath(testCase);
110
+ const files = fs.readdirSync(testCasePath);
111
+
112
+ for (const file of files) {
113
+ if (file.endsWith('.spec')) {
114
+ const columnId = file.replace('.spec', '') as PObjectId;
115
+ const columnSpec = readJsonTestFile(testCase, file);
116
+ pframe.addColumnSpec(columnId, columnSpec);
117
+
118
+ const dataInfoFile = file.replace('.spec', '.datainfo');
119
+ if (files.includes(dataInfoFile)) {
120
+ const dataInfo = readJsonTestFile(testCase, dataInfoFile);
121
+ await pframe.setColumnData(columnId, dataInfo);
122
+ }
123
+ }
124
+ }
125
+
126
+ return pframe;
127
+ }
128
+
129
+ // ============================================================================
130
+ // Test Suites
131
+ // ============================================================================
132
+
133
+ describe('PFrame Column Operations', () => {
134
+ test.concurrent('find_columns_request', async ({ expect }) => {
135
+ const testCase = 'find_columns_request';
136
+
137
+ const columnId = 'column1' as PObjectId;
138
+ const columnSpec = readJsonTestFile(testCase, 'column.spec');
139
+ const request = readJsonTestFile(testCase, 'request.json');
140
+ const expectedResponse = readJsonTestFile(testCase, 'response.json');
141
+
142
+ using pframe = PFrameFactory.createPFrame({
143
+ frameId: ulid() as PFrameInternal.PFrameId,
144
+ spillPath: tmpdir()
145
+ });
146
+ pframe.addColumnSpec(columnId, columnSpec);
147
+
148
+ const actualResponse = await pframe.findColumns(request);
149
+ expect(actualResponse).toEqual(expectedResponse);
150
+ });
151
+
152
+ test.concurrent('get_column_spec_request', async ({ expect }) => {
153
+ const testCase = 'get_column_spec_request';
154
+
155
+ const columnId = 'column1' as PObjectId;
156
+ const columnSpec = readJsonTestFile(testCase, 'column.spec');
157
+ const expectedResponse = readJsonTestFile(testCase, 'response.json');
158
+
159
+ using pframe = PFrameFactory.createPFrame({
160
+ frameId: ulid() as PFrameInternal.PFrameId,
161
+ spillPath: tmpdir()
162
+ });
163
+ pframe.addColumnSpec(columnId, columnSpec);
164
+
165
+ const actualResponse = await pframe.getColumnSpec(columnId);
166
+ expect(actualResponse).toEqual(expectedResponse);
167
+
168
+ const unknownColumnId = 'unknown_column1' as PObjectId;
169
+ const unknownColumnSpec = await pframe.getColumnSpec(unknownColumnId);
170
+ expect(unknownColumnSpec).toBeNull();
171
+
172
+ const columnList = await pframe.listColumns();
173
+ expect(columnList).toEqual([
174
+ { columnId: columnId, spec: columnSpec, hasData: false }
175
+ ]);
176
+ });
177
+
178
+ test.concurrent('delete_column_request', async ({ expect }) => {
179
+ const testCase = 'delete_column_request';
180
+
181
+ const request = readJsonTestFile(testCase, 'request.json');
182
+ const expectedResponse = readJsonTestFile(testCase, 'response.json');
183
+
184
+ using pframe = PFrameFactory.createPFrame({
185
+ frameId: ulid() as PFrameInternal.PFrameId,
186
+ spillPath: tmpdir()
187
+ });
188
+
189
+ const actualResponse = await pframe.deleteColumn(request);
190
+ expect(actualResponse).toEqual(expectedResponse);
191
+ });
192
+
193
+ test.concurrent('set_column_data_request', async ({ expect }) => {
194
+ const testCase = 'set_column_data_request';
195
+
196
+ const columnId = 'column1' as PObjectId;
197
+ const columnSpec = readJsonTestFile(testCase, 'column.spec');
198
+ const dataInfo = readJsonTestFile(testCase, 'column.datainfo');
199
+ const dataSource = createTestDataSource(testCase);
200
+
201
+ using pframe = PFrameFactory.createPFrame({
202
+ frameId: ulid() as PFrameInternal.PFrameId,
203
+ spillPath: tmpdir()
204
+ });
205
+ pframe.setDataSource(dataSource);
206
+
207
+ pframe.addColumnSpec(columnId, columnSpec);
208
+ await pframe.setColumnData(columnId, dataInfo);
209
+
210
+ const columnList = await pframe.listColumns();
211
+ expect(columnList).toEqual([
212
+ { columnId: columnId, spec: columnSpec, hasData: true }
213
+ ]);
214
+ });
215
+
216
+ test.concurrent('unique_values_request', async ({ expect }) => {
217
+ const testCase = 'unique_values_request';
218
+
219
+ const columnId = 'column' as PObjectId;
220
+ const columnSpec = readJsonTestFile(testCase, 'column.spec');
221
+ const dataInfo = readJsonTestFile(testCase, 'column.datainfo');
222
+ const dataSource = createTestDataSource(testCase);
223
+ const request = readJsonTestFile(testCase, 'request.json');
224
+
225
+ const expectedResponse: UniqueValuesResponse = {
226
+ values: {
227
+ type: 'Long',
228
+ data: new BigInt64Array([BigInt(10), BigInt(11), BigInt(12)]),
229
+ isNA: new Uint8Array(),
230
+ absent: new Uint8Array()
231
+ },
232
+ overflow: false
233
+ };
234
+
235
+ using pframe = PFrameFactory.createPFrame({
236
+ frameId: ulid() as PFrameInternal.PFrameId,
237
+ spillPath: tmpdir()
238
+ });
239
+ pframe.setDataSource(dataSource);
240
+
241
+ pframe.addColumnSpec(columnId, columnSpec);
242
+ await pframe.setColumnData(columnId, dataInfo);
243
+
244
+ const actualResponse = await pframe.getUniqueValues(request);
245
+ expect(actualResponse).toEqual(expectedResponse);
246
+ });
247
+ });
248
+
249
+ describe('PFrame Table Creation', () => {
250
+ // Expected responses for table creation tests
251
+ const createTableExpectedResponses = {
252
+ request1: [
253
+ {
254
+ type: 'Int' as const,
255
+ data: new Int32Array([10]),
256
+ isNA: new Uint8Array(),
257
+ absent: new Uint8Array()
258
+ },
259
+ {
260
+ type: 'Float' as const,
261
+ data: new Float32Array([10.0]),
262
+ isNA: new Uint8Array(),
263
+ absent: new Uint8Array()
264
+ }
265
+ ] as PTableVector[],
266
+ request2: [
267
+ {
268
+ type: 'Long' as const,
269
+ data: new BigInt64Array([BigInt(10)]),
270
+ isNA: new Uint8Array(),
271
+ absent: new Uint8Array()
272
+ },
273
+ {
274
+ type: 'Double' as const,
275
+ data: new Float64Array([10.0]),
276
+ isNA: new Uint8Array(),
277
+ absent: new Uint8Array()
278
+ }
279
+ ] as PTableVector[],
280
+ request3: [
281
+ {
282
+ type: 'String' as const,
283
+ data: ['10'],
284
+ isNA: new Uint8Array(),
285
+ absent: new Uint8Array()
286
+ },
287
+ {
288
+ type: 'Bytes' as const,
289
+ data: [new Uint8Array([49, 48])],
290
+ isNA: new Uint8Array(),
291
+ absent: new Uint8Array()
292
+ }
293
+ ] as PTableVector[],
294
+ request4: [
295
+ {
296
+ type: 'String' as const,
297
+ data: ['10'],
298
+ isNA: new Uint8Array(),
299
+ absent: new Uint8Array()
300
+ },
301
+ {
302
+ type: 'Float' as const,
303
+ data: new Float32Array([NaN]),
304
+ isNA: new Uint8Array([128]),
305
+ absent: new Uint8Array()
306
+ }
307
+ ] as PTableVector[]
308
+ };
309
+
310
+ test.concurrent('create_table_request_1', async ({ expect }) => {
311
+ const testCase = 'create_table_request_1';
312
+ const request = readJsonTestFile(testCase, 'request.json');
313
+ const expectedResponse = createTableExpectedResponses.request1;
314
+
315
+ using pframe = await readPFrame(testCase);
316
+ using table = pframe.createTable(
317
+ ulid() as PFrameInternal.PTableId,
318
+ request
319
+ );
320
+
321
+ const columnIndices = Array.from(
322
+ { length: table.getSpec().length },
323
+ (_, i) => i
324
+ );
325
+ const actualResponse = await table.getData(columnIndices);
326
+ expect(actualResponse).toEqual(expectedResponse);
327
+ });
328
+
329
+ test.concurrent('create_table_request_2', async ({ expect }) => {
330
+ const testCase = 'create_table_request_2';
331
+ const request = readJsonTestFile(testCase, 'request.json');
332
+ const expectedResponse = createTableExpectedResponses.request2;
333
+
334
+ using pframe = await readPFrame(testCase);
335
+ using table = pframe.createTable(
336
+ ulid() as PFrameInternal.PTableId,
337
+ request
338
+ );
339
+
340
+ const columnIndices = Array.from(
341
+ { length: table.getSpec().length },
342
+ (_, i) => i
343
+ );
344
+ const actualResponse = await table.getData(columnIndices);
345
+ expect(actualResponse).toEqual(expectedResponse);
346
+ });
347
+
348
+ test.concurrent('create_table_request_3', async ({ expect }) => {
349
+ const testCase = 'create_table_request_3';
350
+ const request = readJsonTestFile(testCase, 'request.json');
351
+ const expectedResponse = createTableExpectedResponses.request3;
352
+
353
+ using pframe = await readPFrame(testCase);
354
+ using table = pframe.createTable(
355
+ ulid() as PFrameInternal.PTableId,
356
+ request
357
+ );
358
+
359
+ const columnIndices = Array.from(
360
+ { length: table.getSpec().length },
361
+ (_, i) => i
362
+ );
363
+ const actualResponse = await table.getData(columnIndices);
364
+ expect(actualResponse).toEqual(expectedResponse);
365
+ });
366
+
367
+ test.concurrent('create_table_request_4', async ({ expect }) => {
368
+ const testCase = 'create_table_request_4';
369
+ const request = readJsonTestFile(testCase, 'request.json');
370
+ const expectedResponse = createTableExpectedResponses.request4;
371
+
372
+ using pframe = await readPFrame(testCase);
373
+ using table = pframe.createTable(
374
+ ulid() as PFrameInternal.PTableId,
375
+ request
376
+ );
377
+
378
+ const columnIndices = Array.from(
379
+ { length: table.getSpec().length },
380
+ (_, i) => i
381
+ );
382
+ const actualResponse = await table.getData(columnIndices);
383
+ expect(actualResponse).toEqual(expectedResponse);
384
+ });
385
+
386
+ test.concurrent('create_table_request_fail', async ({ expect }) => {
387
+ const testCase = 'create_table_request_fail';
388
+
389
+ const columnId = 'column' as PObjectId;
390
+ const columnSpec = readJsonTestFile(testCase, 'column.spec');
391
+ const dataInfo = readJsonTestFile(testCase, 'column.datainfo');
392
+ const dataSource = createFailingDataSource();
393
+ const request = readJsonTestFile(testCase, 'request.json');
394
+
395
+ using pframe = PFrameFactory.createPFrame({
396
+ frameId: ulid() as PFrameInternal.PFrameId,
397
+ spillPath: tmpdir()
398
+ });
399
+ pframe.setDataSource(dataSource);
400
+
401
+ pframe.addColumnSpec(columnId, columnSpec);
402
+ await pframe.setColumnData(columnId, dataInfo);
403
+
404
+ using table = pframe.createTable(
405
+ ulid() as PFrameInternal.PTableId,
406
+ request
407
+ );
408
+
409
+ await expect(table.getShape()).rejects.toThrow();
410
+ });
411
+
412
+ // QueryData requests for createTableByDataQuery tests
413
+ const createTableByDataQueryRequests = {
414
+ request1: {
415
+ tableSpec: {
416
+ axes: [{ name: 'axis', type: 'Int' }] as AxisId[],
417
+ columns: [
418
+ {
419
+ columnId: 'column',
420
+ spec: {
421
+ kind: 'PColumn',
422
+ axesSpec: [{ name: 'axis', type: 'Int' }],
423
+ name: 'column',
424
+ valueType: 'Float'
425
+ }
426
+ }
427
+ ] as PColumnIdAndSpec[]
428
+ },
429
+ dataQuery: { type: 'column', columnId: 'column' } as QueryData
430
+ },
431
+ request2: {
432
+ tableSpec: {
433
+ axes: [{ name: 'axis', type: 'Long' }] as AxisId[],
434
+ columns: [
435
+ {
436
+ columnId: 'column',
437
+ spec: {
438
+ kind: 'PColumn',
439
+ axesSpec: [{ name: 'axis', type: 'Long' }],
440
+ name: 'column',
441
+ valueType: 'Double'
442
+ }
443
+ }
444
+ ] as PColumnIdAndSpec[]
445
+ },
446
+ dataQuery: { type: 'column', columnId: 'column' } as QueryData
447
+ },
448
+ request3: {
449
+ tableSpec: {
450
+ axes: [{ name: 'axis', type: 'String' }] as AxisId[],
451
+ columns: [
452
+ {
453
+ columnId: 'column',
454
+ spec: {
455
+ kind: 'PColumn',
456
+ axesSpec: [{ name: 'axis', type: 'String' }],
457
+ name: 'column',
458
+ valueType: 'Bytes'
459
+ }
460
+ }
461
+ ] as PColumnIdAndSpec[]
462
+ },
463
+ dataQuery: { type: 'column', columnId: 'column' } as QueryData
464
+ },
465
+ request4: {
466
+ tableSpec: {
467
+ axes: [{ name: 'axis', type: 'String' }] as AxisId[],
468
+ columns: [
469
+ {
470
+ columnId: 'column',
471
+ spec: {
472
+ kind: 'PColumn',
473
+ axesSpec: [{ name: 'axis', type: 'String' }],
474
+ name: 'column',
475
+ valueType: 'Float'
476
+ }
477
+ }
478
+ ] as PColumnIdAndSpec[]
479
+ },
480
+ dataQuery: { type: 'column', columnId: 'column' } as QueryData
481
+ }
482
+ };
483
+
484
+ test.concurrent('create_table_by_data_query_1', async ({ expect }) => {
485
+ const testCase = 'create_table_request_1';
486
+ const expectedResponse = createTableExpectedResponses.request1;
487
+ const queryDataRequest = createTableByDataQueryRequests.request1;
488
+
489
+ using pframe = await readPFrame(testCase);
490
+ using table = pframe.createTableByDataQuery(
491
+ ulid() as PFrameInternal.PTableId,
492
+ queryDataRequest
493
+ );
494
+
495
+ const columnIndices = Array.from(
496
+ { length: table.getSpec().length },
497
+ (_, i) => i
498
+ );
499
+ const actualResponse = await table.getData(columnIndices);
500
+ expect(actualResponse).toEqual(expectedResponse);
501
+ });
502
+
503
+ test.concurrent('create_table_by_data_query_2', async ({ expect }) => {
504
+ const testCase = 'create_table_request_2';
505
+ const expectedResponse = createTableExpectedResponses.request2;
506
+ const queryDataRequest = createTableByDataQueryRequests.request2;
507
+
508
+ using pframe = await readPFrame(testCase);
509
+ using table = pframe.createTableByDataQuery(
510
+ ulid() as PFrameInternal.PTableId,
511
+ queryDataRequest
512
+ );
513
+
514
+ const columnIndices = Array.from(
515
+ { length: table.getSpec().length },
516
+ (_, i) => i
517
+ );
518
+ const actualResponse = await table.getData(columnIndices);
519
+ expect(actualResponse).toEqual(expectedResponse);
520
+ });
521
+
522
+ test.concurrent('create_table_by_data_query_3', async ({ expect }) => {
523
+ const testCase = 'create_table_request_3';
524
+ const expectedResponse = createTableExpectedResponses.request3;
525
+ const queryDataRequest = createTableByDataQueryRequests.request3;
526
+
527
+ using pframe = await readPFrame(testCase);
528
+ using table = pframe.createTableByDataQuery(
529
+ ulid() as PFrameInternal.PTableId,
530
+ queryDataRequest
531
+ );
532
+
533
+ const columnIndices = Array.from(
534
+ { length: table.getSpec().length },
535
+ (_, i) => i
536
+ );
537
+ const actualResponse = await table.getData(columnIndices);
538
+ expect(actualResponse).toEqual(expectedResponse);
539
+ });
540
+
541
+ test.concurrent('create_table_by_data_query_4', async ({ expect }) => {
542
+ const testCase = 'create_table_request_4';
543
+ const expectedResponse = createTableExpectedResponses.request4;
544
+ const queryDataRequest = createTableByDataQueryRequests.request4;
545
+
546
+ using pframe = await readPFrame(testCase);
547
+ using table = pframe.createTableByDataQuery(
548
+ ulid() as PFrameInternal.PTableId,
549
+ queryDataRequest
550
+ );
551
+
552
+ const columnIndices = Array.from(
553
+ { length: table.getSpec().length },
554
+ (_, i) => i
555
+ );
556
+ const actualResponse = await table.getData(columnIndices);
557
+ expect(actualResponse).toEqual(expectedResponse);
558
+ });
559
+
560
+ test.concurrent('create_table_by_data_query_fail', async ({ expect }) => {
561
+ const testCase = 'create_table_request_fail';
562
+
563
+ const columnId = 'column' as PObjectId;
564
+ const columnSpec = readJsonTestFile(testCase, 'column.spec');
565
+ const dataInfo = readJsonTestFile(testCase, 'column.datainfo');
566
+ const dataSource = createFailingDataSource();
567
+
568
+ using pframe = PFrameFactory.createPFrame({
569
+ frameId: ulid() as PFrameInternal.PFrameId,
570
+ spillPath: tmpdir()
571
+ });
572
+ pframe.setDataSource(dataSource);
573
+
574
+ pframe.addColumnSpec(columnId, columnSpec);
575
+ await pframe.setColumnData(columnId, dataInfo);
576
+
577
+ // Construct QueryData request for the failing column
578
+ const queryDataRequest = {
579
+ tableSpec: {
580
+ axes: [{ name: 'axis', type: 'Long' }] as AxisId[],
581
+ columns: [
582
+ {
583
+ columnId: 'column',
584
+ spec: {
585
+ kind: 'PColumn',
586
+ axesSpec: [{ name: 'axis', type: 'Long' }],
587
+ name: 'column',
588
+ valueType: 'Long'
589
+ }
590
+ }
591
+ ] as PColumnIdAndSpec[]
592
+ },
593
+ dataQuery: {
594
+ type: 'column',
595
+ columnId: 'column'
596
+ }
597
+ };
598
+
599
+ // Cast to access the method which may not be on the interface yet
600
+ using table = pframe.createTableByDataQuery(
601
+ ulid() as PFrameInternal.PTableId,
602
+ queryDataRequest as any
603
+ );
604
+
605
+ await expect(table.getShape()).rejects.toThrow();
606
+ });
607
+ });
608
+
609
+ describe('PFrame Table Operations', () => {
610
+ test.concurrent('sort_table_request', async ({ expect }) => {
611
+ const testCase = 'sort_table_request';
612
+
613
+ const request = readJsonTestFile(testCase, 'request.json');
614
+ const sorting: PTableSorting[] = readJsonTestFile(testCase, 'sorting.json');
615
+
616
+ // Expected response for full sorted data
617
+ let expectedFullResponse: PTableVector[] = [
618
+ {
619
+ type: 'Long', // Axis A1 - all values present
620
+ data: new BigInt64Array([BigInt(0), BigInt(0), BigInt(1), BigInt(2)]),
621
+ isNA: new Uint8Array(),
622
+ absent: new Uint8Array()
623
+ },
624
+ {
625
+ type: 'String', // Axis A2 - positions 2,3 absent (no record in column2 for A1=1,2)
626
+ data: ['FloatOne', 'FloatTwo', null, null],
627
+ isNA: new Uint8Array([48]),
628
+ absent: new Uint8Array()
629
+ },
630
+ {
631
+ type: 'String', // Column column1 - positions 0,1 are NA (no data for A1=0)
632
+ data: [null, null, 'IntOne', 'IntTwo'],
633
+ isNA: new Uint8Array([192]),
634
+ absent: new Uint8Array()
635
+ },
636
+ {
637
+ type: 'Float', // Column column2 - positions 2,3 are NA (no data for A1=1,2)
638
+ data: new Float32Array([1.0, 2.0, NaN, NaN]),
639
+ isNA: new Uint8Array([48]),
640
+ absent: new Uint8Array()
641
+ }
642
+ ];
643
+
644
+ // Expected response for range query (rows 1-2, reordered columns)
645
+ const expectedRangeResponse: PTableVector[] = [
646
+ {
647
+ type: 'Float', // Column column2 - position 1 is NA
648
+ data: new Float32Array([2.0, NaN]),
649
+ isNA: new Uint8Array([64]),
650
+ absent: new Uint8Array()
651
+ },
652
+ {
653
+ type: 'String', // Column column1 - position 0 is NA
654
+ data: [null, 'IntOne'],
655
+ isNA: new Uint8Array([128]),
656
+ absent: new Uint8Array()
657
+ },
658
+ {
659
+ type: 'String', // Axis A2 - position 1 is absent
660
+ data: ['FloatTwo', null],
661
+ isNA: new Uint8Array([64]),
662
+ absent: new Uint8Array()
663
+ },
664
+ {
665
+ type: 'Long', // Axis A1 - all present
666
+ data: new BigInt64Array([BigInt(0), BigInt(1)]),
667
+ isNA: new Uint8Array(),
668
+ absent: new Uint8Array()
669
+ }
670
+ ];
671
+
672
+ using pframe = await readPFrame(testCase);
673
+ using table = pframe.createTable(
674
+ ulid() as PFrameInternal.PTableId,
675
+ request
676
+ );
677
+
678
+ using sortedTable = table.sort(ulid() as PFrameInternal.PTableId, sorting);
679
+ const footprint = await sortedTable.getFootprint();
680
+ expect(footprint).toBeGreaterThan(0);
681
+
682
+ // Test full sorted data
683
+ const columnIndices = sortedTable.getColumnIndices(
684
+ Array.from(sorting, (entry) => entry.column)
685
+ );
686
+ let actualResponse = await sortedTable.getData(columnIndices);
687
+ expect(actualResponse).toEqual(expectedFullResponse);
688
+
689
+ // Test range query with reordered columns
690
+ actualResponse = await sortedTable.getData(
691
+ [columnIndices[3], columnIndices[2], columnIndices[1], columnIndices[0]],
692
+ { range: { offset: 1, length: 2 } }
693
+ );
694
+ expect(actualResponse).toEqual(expectedRangeResponse);
695
+ });
696
+ });
697
+
698
+ describe('PFrame Complex Operations', () => {
699
+ test.concurrent('complex_join', async ({ expect }) => {
700
+ const testCase = 'complex_join';
701
+ using pframe = await readPFrame(testCase);
702
+
703
+ const request = readJsonTestFile(testCase, 'request.json');
704
+ using table = pframe.createTable(
705
+ ulid() as PFrameInternal.PTableId,
706
+ request
707
+ );
708
+
709
+ const shape = await table.getShape();
710
+ expect(shape).toEqual({
711
+ columns: 6,
712
+ rows: 7124
713
+ });
714
+
715
+ // Test profiling functionality (platform-dependent)
716
+ if (process.platform === 'win32') {
717
+ expect(PFrameFactory.pprofDump()).rejects.toThrow();
718
+ } else {
719
+ const profile = await PFrameFactory.pprofDump();
720
+ const profilePath = path.join(tmpdir(), `profile_${Date.now()}.pb.gz`);
721
+ fs.writeFileSync(profilePath, profile);
722
+ console.log(`Profile saved to ${profilePath}`);
723
+ }
724
+
725
+ // Test out of bounds range
726
+ const result = await table.getData([0], {
727
+ range: { offset: 10000, length: 20000 }
728
+ });
729
+ expect(result).toMatchObject([{ data: [] }]);
730
+
731
+ const result2 = await table.getData([0], {
732
+ range: { offset: 7123, length: 2 }
733
+ });
734
+ expect(result2[0].data.length).toBe(1);
735
+ });
736
+ });