signalk-questdb 2.0.1 → 2.1.1

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 (91) hide show
  1. package/.coderabbit.yaml +4 -3
  2. package/README.md +151 -5
  3. package/dist/api-contract.d.ts +62 -0
  4. package/dist/config/schema.d.ts +1 -0
  5. package/dist/config/schema.js +5 -0
  6. package/dist/config/schema.js.map +1 -1
  7. package/dist/configpanel/responses.d.ts +33 -1
  8. package/dist/configpanel/responses.js +89 -0
  9. package/dist/configpanel/responses.js.map +1 -1
  10. package/dist/history-v1.js +12 -9
  11. package/dist/history-v1.js.map +1 -1
  12. package/dist/history-v2.d.ts +18 -6
  13. package/dist/history-v2.js +275 -41
  14. package/dist/history-v2.js.map +1 -1
  15. package/dist/ilp-writer.d.ts +22 -0
  16. package/dist/ilp-writer.js +76 -4
  17. package/dist/ilp-writer.js.map +1 -1
  18. package/dist/index.d.ts +1 -0
  19. package/dist/index.js +326 -58
  20. package/dist/index.js.map +1 -1
  21. package/dist/influx-detect.d.ts +19 -0
  22. package/dist/influx-detect.js +165 -0
  23. package/dist/influx-detect.js.map +1 -0
  24. package/dist/migration.d.ts +147 -0
  25. package/dist/migration.js +819 -0
  26. package/dist/migration.js.map +1 -0
  27. package/dist/query-client.d.ts +9 -0
  28. package/dist/query-client.js +11 -0
  29. package/dist/query-client.js.map +1 -1
  30. package/dist/restore.js +9 -0
  31. package/dist/restore.js.map +1 -1
  32. package/dist/schema-errors.d.ts +15 -0
  33. package/dist/schema-errors.js +38 -0
  34. package/dist/schema-errors.js.map +1 -0
  35. package/package.json +5 -4
  36. package/public/assets/PluginConfigurationPanel-CR4mD9IH.js +9 -0
  37. package/public/assets/{index-Z7eUk0W6.js → index-CyI4zKUm.js} +1 -1
  38. package/public/assets/{virtualExposes-CyrNon4j.js → virtualExposes-BBIkbTtD.js} +1 -1
  39. package/public/remoteEntry.js +1 -1
  40. package/dist/test/config.test.d.ts +0 -1
  41. package/dist/test/config.test.js +0 -161
  42. package/dist/test/config.test.js.map +0 -1
  43. package/dist/test/configpanel-responses.test.d.ts +0 -1
  44. package/dist/test/configpanel-responses.test.js +0 -108
  45. package/dist/test/configpanel-responses.test.js.map +0 -1
  46. package/dist/test/console-proxy.test.d.ts +0 -1
  47. package/dist/test/console-proxy.test.js +0 -664
  48. package/dist/test/console-proxy.test.js.map +0 -1
  49. package/dist/test/container-env.test.d.ts +0 -1
  50. package/dist/test/container-env.test.js +0 -70
  51. package/dist/test/container-env.test.js.map +0 -1
  52. package/dist/test/delta-routing.test.d.ts +0 -1
  53. package/dist/test/delta-routing.test.js +0 -258
  54. package/dist/test/delta-routing.test.js.map +0 -1
  55. package/dist/test/full-export-range.test.d.ts +0 -1
  56. package/dist/test/full-export-range.test.js +0 -78
  57. package/dist/test/full-export-range.test.js.map +0 -1
  58. package/dist/test/history-v1.test.d.ts +0 -1
  59. package/dist/test/history-v1.test.js +0 -676
  60. package/dist/test/history-v1.test.js.map +0 -1
  61. package/dist/test/history-v2.test.d.ts +0 -1
  62. package/dist/test/history-v2.test.js +0 -563
  63. package/dist/test/history-v2.test.js.map +0 -1
  64. package/dist/test/host-limits.test.d.ts +0 -1
  65. package/dist/test/host-limits.test.js +0 -81
  66. package/dist/test/host-limits.test.js.map +0 -1
  67. package/dist/test/ilp-writer.test.d.ts +0 -1
  68. package/dist/test/ilp-writer.test.js +0 -391
  69. package/dist/test/ilp-writer.test.js.map +0 -1
  70. package/dist/test/package-e2e.test.d.ts +0 -1
  71. package/dist/test/package-e2e.test.js +0 -306
  72. package/dist/test/package-e2e.test.js.map +0 -1
  73. package/dist/test/path-matcher.test.d.ts +0 -1
  74. package/dist/test/path-matcher.test.js +0 -224
  75. package/dist/test/path-matcher.test.js.map +0 -1
  76. package/dist/test/query-client.test.d.ts +0 -1
  77. package/dist/test/query-client.test.js +0 -299
  78. package/dist/test/query-client.test.js.map +0 -1
  79. package/dist/test/questdb-endpoint.test.d.ts +0 -1
  80. package/dist/test/questdb-endpoint.test.js +0 -297
  81. package/dist/test/questdb-endpoint.test.js.map +0 -1
  82. package/dist/test/restore.test.d.ts +0 -1
  83. package/dist/test/restore.test.js +0 -496
  84. package/dist/test/restore.test.js.map +0 -1
  85. package/dist/test/time-range.test.d.ts +0 -1
  86. package/dist/test/time-range.test.js +0 -53
  87. package/dist/test/time-range.test.js.map +0 -1
  88. package/dist/test/wal-monitor.test.d.ts +0 -1
  89. package/dist/test/wal-monitor.test.js +0 -405
  90. package/dist/test/wal-monitor.test.js.map +0 -1
  91. package/public/assets/PluginConfigurationPanel-CyS3A7gD.js +0 -9
@@ -1 +0,0 @@
1
- {"version":3,"file":"history-v1.test.js","sourceRoot":"","sources":["../../src/test/history-v1.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAW3D,4EAA4E;AAC5E,+DAA+D;AAC/D,SAAS,UAAU,CAAC,QAAoB,EAAE,OAAoB;IAC5D,OAAO;QACL,IAAI,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;YAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACvE,CAAC;QACD,SAAS,EAAE,CAAC,MAAgC,EAAE,EAAE,CAC9C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC3B,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;YACV,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YACZ,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YACf,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;YACjB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;SACb,CAAC,CAAC;KACsB,CAAC;AAChC,CAAC;AAED,MAAM,IAAI,GAAG,oCAAoC,CAAC;AAClD,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;AAEtB,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,qEAAqE;QACrE,mDAAmD;QACnD,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,uBAAuB,CACtC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC3B,IAAI,EACJ,IAAI,CACL,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE,CACpD,QAAQ,CAAC,UAAU,CACjB,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,EAChE,OAAO,CACR,CACF,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,kBAAkB,CAAC,EAAE,CAAC;YACnE,MAAM,CAAC,EAAE,CACP,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,KAAK,GAAG,CAAC,EAC1C,YAAY,KAAK,uBAAuB,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE5E,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE,CACpD,QAAQ,CAAC,UAAU,CACjB,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,EAChE,OAAO,CACR,CACF,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,4DAA4D;IAC5D,MAAM,IAAI,GAAgB;QACxB;YACE,6BAA6B;YAC7B,4BAA4B;YAC5B,MAAM;YACN,KAAK;YACL,QAAQ;SACT;QACD;YACE,6BAA6B;YAC7B,kBAAkB;YAClB,MAAM;YACN,UAAU;YACV,QAAQ;SACT;QACD;YACE,6BAA6B;YAC7B,qCAAqC;YACrC,MAAM;YACN,MAAM;YACN,SAAS;SACV;QACD,wEAAwE;QACxE,sBAAsB;QACtB,CAAC,6BAA6B,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC;QACvE;YACE,6BAA6B;YAC7B,qBAAqB;YACrB,MAAM;YACN,eAAe;YACf,UAAU;SACX;KACF,CAAC;IAEF,SAAS,MAAM,CAAC,OAAoB;QAClC,MAAM,QAAQ,GAAG,uBAAuB,CACtC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,EACvB,IAAI,EACJ,IAAI,CACL,CAAC;QACF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;gBACnE,MAAM,MAAM,GAA4B,EAAE,CAAC;gBAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;wBACnC,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM;4BAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;oBACpE,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,EAAE,GAAG,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,4BAA4B,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,qCAAqC,CAAC,EAAE,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CACV,OAAO,MAAM,CAAC,qCAAqC,CAAC,EACpD,SAAS,CACV,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,uEAAuE;QACvE,kEAAkE;QAClE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;YAC1B,CAAC,6BAA6B,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC;SACrE,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE;YAC9C,QAAQ,EAAE,CAAC,KAAK;YAChB,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,qEAAqE;QACrE,iEAAiE;QACjE,wEAAwE;QACxE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;YAC1B;gBACE,6BAA6B;gBAC7B,MAAM;gBACN,oCAAoC;gBACpC,YAAY;gBACZ,UAAU;aACX;SACF,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,wEAAwE;QACxE,kEAAkE;QAClE,qDAAqD;QACrD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;YAC1B;gBACE,6BAA6B;gBAC7B,MAAM;gBACN,MAAM;gBACN,iBAAiB;gBACjB,QAAQ;aACT;SACF,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;YAC1B;gBACE,6BAA6B;gBAC7B,UAAU;gBACV,MAAM;gBACN,cAAc;gBACd,QAAQ;aACT;YACD;gBACE,6BAA6B;gBAC7B,qBAAqB;gBACrB,MAAM;gBACN,KAAK;gBACL,UAAU;aACX;SACF,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,2EAA2E;IAC3E,yEAAyE;IACzE,uEAAuE;IACvE,yDAAyD;IACzD,SAAS,iBAAiB,CAAC,QAAoB;QAC7C,OAAO;YACL,IAAI,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;gBAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;gBACvB,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC/B,MAAM,IAAI,KAAK,CACb,wDAAwD,CACzD,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACL,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE;wBACP;4BACE,6BAA6B;4BAC7B,kBAAkB;4BAClB,MAAM;4BACN,IAAI;4BACJ,IAAI;yBACL;qBACF;oBACD,KAAK,EAAE,CAAC;oBACR,SAAS,EAAE,CAAC;iBACb,CAAC;YACJ,CAAC;YACD,SAAS,EAAE,CAAC,MAAgC,EAAE,EAAE,CAC9C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC3B,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;gBACV,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;gBACZ,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBACf,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;gBACjB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;aACb,CAAC,CAAC;SACsB,CAAC;IAChC,CAAC;IAED,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,uBAAuB,CACtC,iBAAiB,CAAC,QAAQ,CAAC,EAC3B,IAAI,EACJ,IAAI,CACL,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAC9B,CAAC,OAAO,EAAE,EAAE,CACV,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CACnE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CACnE,CACJ,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,wCAAwC,CAAC,CAAC;QAC3E,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,qEAAqE;QACrE,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,CAAC;YACD,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE;SACQ,CAAC;QAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAC3D,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CACf,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,EAAE,CACtD,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CACnE,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7B,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,yEAAyE;QACzE,gEAAgE;QAChE,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,uBAAuB,CACtC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,EACxB,IAAI,EACJ,IAAI,CACL,CAAC;QAEF,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAC7D,OAAO,EAAE,CACV,CACF,CAAC;QAEF,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC5B,MAAM,CAAC,KAAK,CACV,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EACtC,CAAC,EACD,0CAA0C,GAAG,EAAE,CAChD,CAAC;QACF,wEAAwE;QACxE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjD,kEAAkE;QAClE,wEAAwE;QACxE,gEAAgE;QAChE,MAAM,CAAC,EAAE,CACP,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC1B,2CAA2C,GAAG,EAAE,CACjD,CAAC;QACF,MAAM,CAAC,EAAE,CACP,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAC1B,6CAA6C,CAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,wEAAwE;IACxE,yEAAyE;IACzE,2DAA2D;IAC3D,SAAS,UAAU,CAAC,QAAuB,EAAE,YAAY,GAAG,CAAC;QAC3D,mEAAmE;QACnE,uEAAuE;QACvE,kEAAkE;QAClE,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;gBAC1B,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC9B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;gBAC9D,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBAChE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;YACvE,CAAC;YACD,SAAS,EAAE,CAAC,MAAgC,EAAE,EAAE,CAC9C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC3B,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;gBACV,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;gBACZ,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBACf,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;gBACjB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;aACb,CAAC,CAAC;SACsB,CAAC;QAC9B,MAAM,OAAO,GAAc,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CACjC,EAAE,KAAK,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,EACxD,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,YAAY,EAAE,EAC7D,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE5E,2EAA2E;IAC3E,2EAA2E;IAC3E,2BAA2B;IAC3B,KAAK,UAAU,cAAc,CAC3B,OAAiB,EACjB,CAAS,EACT,SAAS,GAAG,IAAI;QAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YACnD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,CAAC,EAAE,CACP,OAAO,CAAC,MAAM,IAAI,CAAC,EACnB,qBAAqB,CAAC,eAAe,OAAO,CAAC,MAAM,EAAE,CACtD,CAAC;IACJ,CAAC;IAED,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,qEAAqE;QACrE,sEAAsE;QACtE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAClD,GAAG,CACD,CAAC,KAAK,IAAI;YACR,CAAC,CAAC,6BAA6B;YAC/B,CAAC,CAAC,6BAA6B,EACjC,IAAI,CAAC,EAAE,CACR,CACF,CAAC;QACF,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACjD,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACjC,IAAI,EAAE,CAAC;QACP,MAAM,CAAC,EAAE,CACP,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAC9C,mDAAmD,OAAO,CAAC,CAAC,CAAC,EAAE,CAChE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,uEAAuE;QACvE,sEAAsE;QACtE,wEAAwE;QACxE,0DAA0D;QAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAClD,GAAG,CAAC,6BAA6B,EAAE,IAAI,CAAC,EAAE,CAAC,CAC5C,CAAC;QACF,oEAAoE;QACpE,iDAAiD;QACjD,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,6BAA6B,EAAE,SAAS,CAAC,CAAC;QACxD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACjD,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACjC,IAAI,EAAE,CAAC;QAEP,MAAM,CAAC,EAAE,CACP,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAC9C,oDAAoD,OAAO,CAAC,CAAC,CAAC,EAAE,CACjE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,mEAAmE;QACnE,2DAA2D;QAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACpD,GAAG,CAAC,6BAA6B,EAAE,IAAI,CAAC,EAAE,CAAC,CAC5C,CAAC;QACF,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACjC,IAAI,EAAE,CAAC;QAEP,MAAM,CAAC,EAAE,CACP,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAC9C,mCAAmC,OAAO,CAAC,CAAC,CAAC,EAAE,CAChD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,wEAAwE;QACxE,wEAAwE;QACxE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,UAAU,CAClC,CAAC,CAAC,GAAG,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAC/C,IAAI,CACL,CAAC;QACF,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACjC,IAAI,EAAE,CAAC;QACP,MAAM,CAAC,EAAE,CACP,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAC9C,sCAAsC,OAAO,CAAC,CAAC,CAAC,EAAE,CACnD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,wEAAwE;IACxE,yEAAyE;IACzE,yEAAyE;IACzE,qEAAqE;IACrE,MAAM,MAAM,GAAG,oCAAoC,CAAC;IAOpD,SAAS,eAAe,CACtB,cAA6B,EAC7B,KAA0B;QAE1B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;gBAC1B,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC9B,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACtB,IAAI,KAAK,YAAY,KAAK;wBAAE,MAAM,KAAK,CAAC;oBACxC,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,EAAE;wBACX,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,KAAK,CAAC,MAAM;wBACnB,SAAS,EAAE,CAAC;qBACb,CAAC;gBACJ,CAAC;gBACD,MAAM,OAAO,GACX,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC9D,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;YACvE,CAAC;YACD,SAAS,EAAE,CAAC,MAAwD,EAAE,EAAE,CACtE,MAAM,CAAC,OAAO;gBACZ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC3B,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;oBACf,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;iBAClB,CAAC,CAAC;gBACL,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC3B,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;oBACV,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;oBACZ,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;oBACf,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;oBACjB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;iBACb,CAAC,CAAC;SACkB,CAAC;QAC9B,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CACjC,EAAE,KAAK,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,EACxE,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,EAChE,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,UAAU,cAAc,CAC3B,OAAuB,EACvB,CAAS,EACT,SAAS,GAAG,IAAI;QAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YACnD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,CAAC,EAAE,CACP,OAAO,CAAC,MAAM,IAAI,CAAC,EACnB,qBAAqB,CAAC,wBAAwB,OAAO,CAAC,MAAM,EAAE,CAC/D,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,OAAe,EAAE,EAAE,CAAC;QAC/C,EAAE;QACF,4BAA4B;QAC5B,OAAO;QACP,KAAK;QACL,QAAQ;KACT,CAAC;IAEF,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,eAAe,CACpD;YACE;gBACE,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC;gBAC9C,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC;aAC/C;YACD,EAAE;SACH,EACD,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CACzB,CAAC;QACF,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAEjC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;gBAC7C,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE;aAC5C,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACtC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAC3D,CAAC;YACF,MAAM,CAAC,KAAK,CACV,UAAU,CAAC,MAAM,EACjB,CAAC,EACD,yCAAyC,CAC1C,CAAC;YACF,qEAAqE;YACrE,qEAAqE;YACrE,qDAAqD;YACrD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,EAAE,CACP,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EACrD,qCAAqC,WAAW,CAAC,CAAC,CAAC,EAAE,CACtD,CAAC;YACF,MAAM,CAAC,EAAE,CACP,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAClD,sCAAsC,WAAW,CAAC,CAAC,CAAC,EAAE,CACvD,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,eAAe,CACvC,CAAC,CAAC,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EACtD,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAC5B,CAAC;QACF,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAEjC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACvC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;gBAChD,IAAI,EAAE,EAAE;gBACR,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;aACjC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,eAAe,CACvC,CAAC,CAAC,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EACtD,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAC9C,CAAC;QACF,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAEjC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACzC,MAAM,CAAC,EAAE,CACP,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAClB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAC7D,EACD,mDAAmD,CACpD,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACrE,2EAA2E;IAC3E,uEAAuE;IACvE,2EAA2E;IAC3E,4EAA4E;IAC5E,wEAAwE;IACxE,0EAA0E;IAC1E,oBAAoB;IACpB,EAAE;IACF,0EAA0E;IAC1E,qEAAqE;IACrE,2EAA2E;IAC3E,0EAA0E;IAC1E,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;KAmBd,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;YAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;gBACpD,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC3B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,EAAE,KAAK,CAAC,CAAC;YACV,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,YAAY,CAAC,IAAI,CAAC,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;QAErC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,2CAA2C,CAAC,CAAC;QACvE,MAAM,CAAC,EAAE,CACP,OAAO,GAAG,KAAK,EACf,gCAAgC,OAAO,4CAA4C,CACpF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,qEAAqE;IACrE,8CAA8C;IAC9C,SAAS,gBAAgB,CACvB,QAAoB,EACpB,SAAuC;QAEvC,OAAO;YACL,IAAI,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;gBAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;gBACvB,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;gBAC/B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;YACvE,CAAC;YACD,SAAS,EAAE,CAAC,MAAgC,EAAE,EAAE,CAC9C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC3B,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;gBACV,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;gBACZ,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBACf,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBACd,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;gBACjB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;aACb,CAAC,CAAC;SACsB,CAAC;IAChC,CAAC;IAED,MAAM,gBAAgB,GAAG,CACvB,SAAuC,EACvC,WAAuB,EAAE,EACzB,EAAE;QACF,MAAM,QAAQ,GAAG,uBAAuB,CACtC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,EACrC,IAAI,EACJ,IAAI,CACL,CAAC;QACF,OAAO,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,EAAE,CACpC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CACnE,CAAC;IACJ,CAAC,CAAC;IAEF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,kEAAkE;QAClE,qEAAqE;QACrE,uEAAuE;QACvE,MAAM,EAAE,GAAG,6BAA6B,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC;YAC1C,CAAC,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC;YACxE;gBACE,EAAE;gBACF,qBAAqB;gBACrB,MAAM;gBACN,YAAY;gBACZ,WAAW;gBACX,UAAU;aACX;YACD,CAAC,EAAE,EAAE,6BAA6B,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC;SACnE,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CACpE,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YACzC;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;aAC3C;SACF,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;YAC3C;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;aAC3C;SACF,CAAC,CAAC;QACH,wEAAwE;QACxE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YACxC,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,EAAE,GAAG,EAAE;SACpD,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACjC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAChD,wCAAwC,MAAM,EAAE,CACjD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,CAAC,GAAG,EAAE,EAAE;YAC5C,IAAI,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO;gBACL;oBACE,6BAA6B;oBAC7B,6BAA6B;oBAC7B,MAAM;oBACN,IAAI;oBACJ,KAAK;oBACL,QAAQ;iBACT;aACF,CAAC;QACJ,CAAC,EAAE,QAAQ,CAAC,CAAC;QAEb,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,EAAE,CACP,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EACvD,2CAA2C,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAC7D,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,oEAAoE;QACpE,yEAAyE;QACzE,sEAAsE;QACtE,gEAAgE;QAChE,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;gBAC1B,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC9B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;gBAC9D,CAAC;gBACD,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACtB,IAAI,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;oBAC3C,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAC5C,CAAC;gBACD,MAAM,OAAO,GAAG;oBACd;wBACE,6BAA6B;wBAC7B,6BAA6B;wBAC7B,MAAM;wBACN,IAAI;wBACJ,KAAK;wBACL,QAAQ;qBACT;iBACF,CAAC;gBACF,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;YACvE,CAAC;YACD,SAAS,EAAE,CAAC,MAAgC,EAAE,EAAE,CAC9C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC3B,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;gBACV,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;gBACZ,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBACf,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBACd,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;gBACjB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;aACb,CAAC,CAAC;SACsB,CAAC;QAE9B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CACjC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,EACjC,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,EACnE,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACnC,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YACvD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,EAAE,CAAC;QACP,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE,OAAO,WAAW,CAAC,MAAM,QAAQ,CAAC,CAAC;QAEtE,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACtC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CACrC,CAAC;QACF,MAAM,CAAC,KAAK,CACV,MAAM,CAAC,MAAM,EACb,CAAC,EACD,6DAA6D,CAC9D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,+DAA+D;QAC/D,uEAAuE;QACvE,iEAAiE;QACjE,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,CAAC,GAAG,EAAE,EAAE;YAC5C,IAAI,GAAG,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO;gBACL;oBACE,6BAA6B;oBAC7B,6BAA6B;oBAC7B,MAAM;oBACN,IAAI;oBACJ,KAAK;oBACL,QAAQ;iBACT;aACF,CAAC;QACJ,CAAC,EAAE,QAAQ,CAAC,CAAC;QAEb,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,EAAE,CACP,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YACrD,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,iDAAiD,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CACnE,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,563 +0,0 @@
1
- import { describe, it } from "node:test";
2
- import assert from "node:assert/strict";
3
- import { createHistoryProviderV2 } from "../history-v2.js";
4
- function makeMockClient(captured) {
5
- return {
6
- exec: async (sql) => {
7
- captured.push({ sql });
8
- return { columns: [], dataset: [], count: 0, timestamp: 0 };
9
- },
10
- };
11
- }
12
- const SELF_CONTEXT = "vessels.urn:mrn:imo:mmsi:123456789";
13
- describe("history-v2 context normalization", () => {
14
- it("translates vessels.self to stored 'self'", async () => {
15
- const captured = [];
16
- const provider = createHistoryProviderV2(makeMockClient(captured), SELF_CONTEXT);
17
- await provider.getValues({
18
- from: { toString: () => "2024-01-01T00:00:00Z" },
19
- to: { toString: () => "2024-01-01T01:00:00Z" },
20
- context: "vessels.self",
21
- pathSpecs: [
22
- {
23
- path: "navigation.speedOverGround",
24
- aggregate: "average",
25
- parameter: [],
26
- },
27
- ],
28
- });
29
- assert.ok(captured[0].sql.includes("context = 'self'"), `Expected query to use stored context 'self', got: ${captured[0].sql}`);
30
- });
31
- it("translates fully-qualified self context to stored 'self'", async () => {
32
- const captured = [];
33
- const provider = createHistoryProviderV2(makeMockClient(captured), SELF_CONTEXT);
34
- await provider.getValues({
35
- from: { toString: () => "2024-01-01T00:00:00Z" },
36
- to: { toString: () => "2024-01-01T01:00:00Z" },
37
- context: SELF_CONTEXT,
38
- pathSpecs: [
39
- {
40
- path: "navigation.speedOverGround",
41
- aggregate: "average",
42
- parameter: [],
43
- },
44
- ],
45
- });
46
- assert.ok(captured[0].sql.includes("context = 'self'"), `Expected query to use stored context 'self', got: ${captured[0].sql}`);
47
- });
48
- it("passes through 'self' context unchanged", async () => {
49
- const captured = [];
50
- const provider = createHistoryProviderV2(makeMockClient(captured), SELF_CONTEXT);
51
- await provider.getValues({
52
- from: { toString: () => "2024-01-01T00:00:00Z" },
53
- to: { toString: () => "2024-01-01T01:00:00Z" },
54
- context: "self",
55
- pathSpecs: [
56
- {
57
- path: "navigation.speedOverGround",
58
- aggregate: "average",
59
- parameter: [],
60
- },
61
- ],
62
- });
63
- assert.ok(captured[0].sql.includes("context = 'self'"));
64
- });
65
- it("passes through other vessel contexts unchanged", async () => {
66
- const captured = [];
67
- const provider = createHistoryProviderV2(makeMockClient(captured), SELF_CONTEXT);
68
- const otherVessel = "vessels.urn:mrn:imo:mmsi:987654321";
69
- await provider.getValues({
70
- from: { toString: () => "2024-01-01T00:00:00Z" },
71
- to: { toString: () => "2024-01-01T01:00:00Z" },
72
- context: otherVessel,
73
- pathSpecs: [
74
- {
75
- path: "navigation.speedOverGround",
76
- aggregate: "average",
77
- parameter: [],
78
- },
79
- ],
80
- });
81
- assert.ok(captured[0].sql.includes(`context = '${otherVessel}'`), `Expected query to use other vessel context, got: ${captured[0].sql}`);
82
- });
83
- it("defaults to vessels.self in response when context omitted", async () => {
84
- const captured = [];
85
- const provider = createHistoryProviderV2(makeMockClient(captured), SELF_CONTEXT);
86
- const result = await provider.getValues({
87
- from: { toString: () => "2024-01-01T00:00:00Z" },
88
- to: { toString: () => "2024-01-01T01:00:00Z" },
89
- pathSpecs: [
90
- {
91
- path: "navigation.speedOverGround",
92
- aggregate: "average",
93
- parameter: [],
94
- },
95
- ],
96
- });
97
- assert.equal(result.context, "vessels.self");
98
- assert.ok(captured[0].sql.includes("context = 'self'"));
99
- });
100
- });
101
- describe("history-v2 navigation.position aggregate", () => {
102
- async function capturePositionSql(aggregate) {
103
- const captured = [];
104
- const provider = createHistoryProviderV2(makeMockClient(captured), SELF_CONTEXT);
105
- await provider.getValues({
106
- from: { toString: () => "2024-01-01T00:00:00Z" },
107
- to: { toString: () => "2024-01-01T01:00:00Z" },
108
- resolution: 60,
109
- pathSpecs: [{ path: "navigation.position", aggregate, parameter: [] }],
110
- });
111
- return captured[0].sql;
112
- }
113
- it("uses first(lat)/first(lon) for aggregate 'first'", async () => {
114
- const sql = await capturePositionSql("first");
115
- assert.ok(sql.includes("first(lat)") && sql.includes("first(lon)"), `Expected first(lat)/first(lon), got: ${sql}`);
116
- });
117
- it("honors aggregate 'last' with last(lat)/last(lon)", async () => {
118
- const sql = await capturePositionSql("last");
119
- assert.ok(sql.includes("last(lat)") && sql.includes("last(lon)"), `Expected last(lat)/last(lon), got: ${sql}`);
120
- });
121
- it("falls back to first for non-pair-preserving aggregates", async () => {
122
- for (const aggregate of ["average", "min", "max", "mid", "middle_index"]) {
123
- const sql = await capturePositionSql(aggregate);
124
- assert.ok(sql.includes("first(lat)") && sql.includes("first(lon)"), `Expected first(lat)/first(lon) for '${aggregate}', got: ${sql}`);
125
- }
126
- });
127
- });
128
- describe("history-v2 sample bucket guard", () => {
129
- it("rejects a resolution that would fabricate millions of FILL(NULL) rows", async () => {
130
- const captured = [];
131
- const provider = createHistoryProviderV2(makeMockClient(captured), SELF_CONTEXT);
132
- // 60 days at 1s resolution = 5.18M buckets — over the 1M cap.
133
- await assert.rejects(provider.getValues({
134
- from: { toString: () => "2024-01-01T00:00:00Z" },
135
- to: { toString: () => "2024-03-01T00:00:00Z" },
136
- resolution: 1,
137
- pathSpecs: [
138
- { path: "navigation.position", aggregate: "first", parameter: [] },
139
- ],
140
- }), /sample buckets/);
141
- // The guard must fire before any SQL reaches QuestDB.
142
- assert.equal(captured.length, 0);
143
- });
144
- it("allows the same range at a sane resolution", async () => {
145
- const captured = [];
146
- const provider = createHistoryProviderV2(makeMockClient(captured), SELF_CONTEXT);
147
- await provider.getValues({
148
- from: { toString: () => "2024-01-01T00:00:00Z" },
149
- to: { toString: () => "2024-03-01T00:00:00Z" },
150
- resolution: 2600, // ~2000 buckets, the well-behaved-client budget
151
- pathSpecs: [
152
- { path: "navigation.position", aggregate: "first", parameter: [] },
153
- ],
154
- });
155
- assert.equal(captured.length, 1);
156
- assert.ok(captured[0].sql.includes("SAMPLE BY 2600s"));
157
- });
158
- it("clamps fractional resolutions to 1s instead of SAMPLE BY 0s", async () => {
159
- const captured = [];
160
- const provider = createHistoryProviderV2(makeMockClient(captured), SELF_CONTEXT);
161
- await provider.getValues({
162
- from: { toString: () => "2024-01-01T00:00:00Z" },
163
- to: { toString: () => "2024-01-01T01:00:00Z" },
164
- resolution: 0.5,
165
- pathSpecs: [
166
- {
167
- path: "navigation.speedOverGround",
168
- aggregate: "average",
169
- parameter: [],
170
- },
171
- ],
172
- });
173
- // The mock returns no rows, so the string-table fallback also runs; both
174
- // queries must carry the clamped period, never `SAMPLE BY 0s`. Assert the
175
- // fallback actually fired, so this cannot pass by silently skipping it.
176
- const stringQuery = captured.find(({ sql }) => sql.includes("signalk_str"));
177
- assert.ok(stringQuery, "expected a string-table fallback query");
178
- for (const { sql } of captured) {
179
- assert.ok(sql.includes("SAMPLE BY 1s"), `expected SAMPLE BY 1s, got: ${sql}`);
180
- }
181
- });
182
- it("caps the fabricated total across multiple sampled paths", async () => {
183
- const captured = [];
184
- const provider = createHistoryProviderV2(makeMockClient(captured), SELF_CONTEXT);
185
- // 7 days at 1s = ~605K buckets per series: one series passes the 1M cap,
186
- // two series must not slip past it (1.21M fabricated rows total).
187
- await assert.rejects(provider.getValues({
188
- from: { toString: () => "2024-01-01T00:00:00Z" },
189
- to: { toString: () => "2024-01-08T00:00:00Z" },
190
- resolution: 1,
191
- pathSpecs: [
192
- { path: "navigation.position", aggregate: "first", parameter: [] },
193
- {
194
- path: "navigation.speedOverGround",
195
- aggregate: "average",
196
- parameter: [],
197
- },
198
- ],
199
- }), /sample buckets/);
200
- assert.equal(captured.length, 0);
201
- });
202
- it("budgets the string-table fallback's second SAMPLE BY", async () => {
203
- // A non-numeric path costs two SAMPLE BY queries (numeric miss, then the
204
- // signalk_str fallback). Counting only the first would let a request of
205
- // boolean/string paths run at ~2x the cap this guard exists to enforce.
206
- // 7 days at 1s = ~605k buckets: one query fits under 1M, two do not.
207
- const captured = [];
208
- const provider = createHistoryProviderV2(makeMockClient(captured), SELF_CONTEXT);
209
- await assert.rejects(provider.getValues({
210
- from: { toString: () => "2024-01-01T00:00:00Z" },
211
- to: { toString: () => "2024-01-08T00:00:00Z" },
212
- resolution: 1,
213
- pathSpecs: [
214
- {
215
- path: "electrical.switches.bilgePump.state",
216
- aggregate: "first",
217
- parameter: [],
218
- },
219
- ],
220
- }), /sample buckets/);
221
- assert.equal(captured.length, 0, "must reject before querying QuestDB");
222
- });
223
- it("does not double-count navigation.position, which never falls back", async () => {
224
- // Position is served by its own table, so it costs exactly one query —
225
- // budgeting it as two would reject requests that are actually fine.
226
- const captured = [];
227
- const provider = createHistoryProviderV2(makeMockClient(captured), SELF_CONTEXT);
228
- await provider.getValues({
229
- from: { toString: () => "2024-01-01T00:00:00Z" },
230
- to: { toString: () => "2024-01-08T00:00:00Z" },
231
- resolution: 1,
232
- pathSpecs: [
233
- { path: "navigation.position", aggregate: "first", parameter: [] },
234
- ],
235
- });
236
- assert.ok(captured.length >= 1, "expected the position query to run");
237
- });
238
- it("does not reject client-side aggregates, which never SAMPLE BY", async () => {
239
- // 60 days at 1s would be 5.18M buckets — but every client-side aggregate
240
- // reads raw rows under a LIMIT, so the cap must not apply to any of them.
241
- const cases = [
242
- ["sma", ["5"]],
243
- ["ema", ["0.2"]],
244
- ["middle_index", []],
245
- ];
246
- for (const [aggregate, parameter] of cases) {
247
- const captured = [];
248
- const provider = createHistoryProviderV2(makeMockClient(captured), SELF_CONTEXT);
249
- await provider.getValues({
250
- from: { toString: () => "2024-01-01T00:00:00Z" },
251
- to: { toString: () => "2024-03-01T00:00:00Z" },
252
- resolution: 1,
253
- pathSpecs: [
254
- { path: "navigation.speedOverGround", aggregate, parameter },
255
- ],
256
- });
257
- assert.equal(captured.length, 1, `no query captured for '${aggregate}'`);
258
- assert.ok(captured[0].sql.includes("LIMIT 50000") &&
259
- !captured[0].sql.includes("SAMPLE BY"), `expected raw-row LIMIT query for '${aggregate}', got: ${captured[0].sql}`);
260
- }
261
- });
262
- });
263
- describe("history-v2 string-table fallback", () => {
264
- // Values live in `signalk` (numeric) or `signalk_str` (strings, and
265
- // booleans stored as "true"/"false" since #79). getValues only ever queried
266
- // the numeric table, so every non-numeric path was listed by getPaths but
267
- // returned no data at all.
268
- function mockClient(captured, responder) {
269
- return {
270
- exec: async (sql) => {
271
- captured.push({ sql });
272
- const dataset = responder(sql);
273
- return { columns: [], dataset, count: dataset.length, timestamp: 0 };
274
- },
275
- };
276
- }
277
- const query = (path, extra = {}) => {
278
- const { aggregate = "first", ...rest } = extra;
279
- return {
280
- from: { toString: () => "2024-01-01T00:00:00Z" },
281
- to: { toString: () => "2024-01-01T01:00:00Z" },
282
- context: "self",
283
- pathSpecs: [{ path, aggregate, parameter: [] }],
284
- ...rest,
285
- };
286
- };
287
- it("serves a boolean path from signalk_str", async () => {
288
- const captured = [];
289
- const provider = createHistoryProviderV2(mockClient(captured, (sql) => sql.includes("signalk_str")
290
- ? [["2024-01-01T00:00:01.000000Z", "true"]]
291
- : []), SELF_CONTEXT);
292
- const result = await provider.getValues(query("watermaker.brineomatic.high_pressure_pump_on"));
293
- assert.deepEqual(result.data, [["2024-01-01T00:00:01.000000Z", "true"]]);
294
- assert.ok(captured.some((c) => c.sql.includes("signalk_str")));
295
- });
296
- it("does not query the string table when numeric data exists", async () => {
297
- const captured = [];
298
- const provider = createHistoryProviderV2(mockClient(captured, () => [["2024-01-01T00:00:01.000000Z", 4.2]]), SELF_CONTEXT);
299
- const result = await provider.getValues(query("environment.depth.belowKeel"));
300
- assert.deepEqual(result.data, [["2024-01-01T00:00:01.000000Z", 4.2]]);
301
- assert.ok(!captured.some((c) => c.sql.includes("signalk_str")), "numeric paths must not pay for a second query");
302
- });
303
- it("falls back when SAMPLE BY fabricated only FILL(NULL) rows", async () => {
304
- // A downsampled numeric query returns a row per bucket even with no data,
305
- // so emptiness has to be judged on values, not row count.
306
- const captured = [];
307
- const provider = createHistoryProviderV2(mockClient(captured, (sql) => sql.includes("signalk_str")
308
- ? [["2024-01-01T00:00:00.000000Z", "false"]]
309
- : [
310
- ["2024-01-01T00:00:00.000000Z", null],
311
- ["2024-01-01T00:10:00.000000Z", null],
312
- ]), SELF_CONTEXT);
313
- const result = await provider.getValues(query("electrical.switches.bilgePump.state", { resolution: 600 }));
314
- assert.deepEqual(result.data, [["2024-01-01T00:00:00.000000Z", "false"]]);
315
- });
316
- it("reports last() as the method actually applied when downsampling", async () => {
317
- // The response's `method` labels the series for consumers like Grafana;
318
- // echoing the requested "average" would name an aggregate that never ran.
319
- const captured = [];
320
- const provider = createHistoryProviderV2(mockClient(captured, (sql) => sql.includes("signalk_str")
321
- ? [["2024-01-01T00:00:00.000000Z", "on"]]
322
- : []), SELF_CONTEXT);
323
- const result = await provider.getValues(query("navigation.state", { resolution: 600, aggregate: "average" }));
324
- assert.equal(result.values[0].method, "last");
325
- });
326
- it("keeps the requested method for raw (non-downsampled) string reads", async () => {
327
- // Without a resolution no aggregate is applied at all, so nothing is
328
- // being misreported and the caller's choice stands.
329
- const provider = createHistoryProviderV2(mockClient([], (sql) => sql.includes("signalk_str")
330
- ? [["2024-01-01T00:00:00.000000Z", "on"]]
331
- : []), SELF_CONTEXT);
332
- const result = await provider.getValues(query("navigation.state"));
333
- assert.equal(result.values[0].method, "first");
334
- });
335
- it("replays a tagged boolean as a boolean, matching v1", async () => {
336
- // The same path must not read `true` through v1 and `"true"` through v2.
337
- const provider = createHistoryProviderV2(mockClient([], (sql) => sql.includes("signalk_str")
338
- ? [["2024-01-01T00:00:00.000000Z", "true", "boolean"]]
339
- : []), SELF_CONTEXT);
340
- const result = await provider.getValues(query("electrical.switches.bilgePump.state"));
341
- assert.equal(result.data[0][1], true);
342
- });
343
- it('leaves an untagged "true" as text', async () => {
344
- // A path whose value genuinely is the word "true" carries no tag, as do
345
- // all rows written before value_kind existed.
346
- const provider = createHistoryProviderV2(mockClient([], (sql) => sql.includes("signalk_str")
347
- ? [["2024-01-01T00:00:00.000000Z", "true", null]]
348
- : []), SELF_CONTEXT);
349
- const result = await provider.getValues(query("navigation.state"));
350
- assert.equal(result.data[0][1], "true");
351
- });
352
- it("degrades to text when value_kind is not migrated yet", async () => {
353
- // A read racing ensureTables(), or an external QuestDB, must not lose the
354
- // whole response to "Invalid column: value_kind".
355
- const captured = [];
356
- const provider = createHistoryProviderV2(mockClient(captured, (sql) => {
357
- if (sql.includes("value_kind") && !sql.includes("NULL as value_kind")) {
358
- throw new Error("QuestDB query failed (400): Invalid column: value_kind");
359
- }
360
- return sql.includes("signalk_str")
361
- ? [["2024-01-01T00:00:00.000000Z", "true", null]]
362
- : [];
363
- }), SELF_CONTEXT);
364
- const result = await provider.getValues(query("some.path"));
365
- assert.equal(result.data[0][1], "true");
366
- });
367
- it("aggregates a downsampled string path with last(), not avg()", async () => {
368
- const captured = [];
369
- const provider = createHistoryProviderV2(mockClient(captured, (sql) => sql.includes("signalk_str")
370
- ? [["2024-01-01T00:00:00.000000Z", "on"]]
371
- : []), SELF_CONTEXT);
372
- await provider.getValues(query("navigation.state", { resolution: 600 }));
373
- const strSql = captured.find((c) => c.sql.includes("signalk_str")).sql;
374
- assert.ok(strSql.includes("last(value_str)"), `expected last(value_str), got: ${strSql}`);
375
- assert.ok(!strSql.includes("avg("));
376
- });
377
- });
378
- describe("history-v2 path and context discovery", () => {
379
- function captureClient(captured) {
380
- return {
381
- exec: async (sql) => {
382
- captured.push({ sql });
383
- return { columns: [], dataset: [], count: 0, timestamp: 0 };
384
- },
385
- };
386
- }
387
- const range = {
388
- from: { toString: () => "2024-01-01T00:00:00Z", add: () => undefined },
389
- to: { toString: () => "2024-01-01T01:00:00Z" },
390
- };
391
- it("advertises navigation.position in getPaths", async () => {
392
- // The track table has no `path` column, so it was omitted entirely:
393
- // getValues served the position series while getPaths never listed it,
394
- // leaving clients unable to discover the one series they most want.
395
- const captured = [];
396
- const provider = createHistoryProviderV2(captureClient(captured), SELF_CONTEXT);
397
- await provider.getPaths(range);
398
- assert.ok(captured[0].sql.includes("signalk_position"), `getPaths must consult the track table, got: ${captured[0].sql}`);
399
- assert.ok(captured[0].sql.includes("'navigation.position'"));
400
- });
401
- it("includes the track table in getContexts", async () => {
402
- // A vessel can be position-only (an AIS target whose other paths are
403
- // filtered out), and would otherwise be invisible.
404
- const captured = [];
405
- const provider = createHistoryProviderV2(captureClient(captured), SELF_CONTEXT);
406
- await provider.getContexts(range);
407
- assert.ok(captured[0].sql.includes("signalk_position"), `getContexts must consult the track table, got: ${captured[0].sql}`);
408
- });
409
- });
410
- describe("history-v2 sourceRef filtering", () => {
411
- // The server delivers `paths=<path>|<sourceRef>` (signalk-server #2737) as
412
- // PathSpec.sourceRef. Filtering happens in SQL — the rows carry a `source`
413
- // column since the same-named migration — and the spec's sourceRef is
414
- // echoed in the response metadata so a caller can tell the columns apart.
415
- function mockClient(captured, responder) {
416
- return {
417
- exec: async (sql) => {
418
- captured.push({ sql });
419
- const dataset = responder(sql);
420
- return { columns: [], dataset, count: dataset.length, timestamp: 0 };
421
- },
422
- };
423
- }
424
- const range = {
425
- from: { toString: () => "2024-01-01T00:00:00Z" },
426
- to: { toString: () => "2024-01-01T01:00:00Z" },
427
- context: "self",
428
- };
429
- it("adds a source clause when the spec carries a sourceRef", async () => {
430
- const captured = [];
431
- const provider = createHistoryProviderV2(mockClient(captured, () => [["2024-01-01T00:00:01.000000Z", 4.2]]), SELF_CONTEXT);
432
- await provider.getValues({
433
- ...range,
434
- pathSpecs: [
435
- {
436
- path: "navigation.speedOverGround",
437
- aggregate: "average",
438
- parameter: [],
439
- sourceRef: "n2k-on-ve.can0.115",
440
- },
441
- ],
442
- });
443
- assert.ok(captured[0].sql.includes("AND source = 'n2k-on-ve.can0.115'"), `expected a source filter, got: ${captured[0].sql}`);
444
- });
445
- it("omits the source clause when no sourceRef is given", async () => {
446
- const captured = [];
447
- const provider = createHistoryProviderV2(mockClient(captured, () => [["2024-01-01T00:00:01.000000Z", 4.2]]), SELF_CONTEXT);
448
- await provider.getValues({
449
- ...range,
450
- pathSpecs: [
451
- {
452
- path: "navigation.speedOverGround",
453
- aggregate: "average",
454
- parameter: [],
455
- },
456
- ],
457
- });
458
- assert.ok(!captured[0].sql.includes("source ="), `expected no source filter, got: ${captured[0].sql}`);
459
- });
460
- it("filters the position table by source too", async () => {
461
- const captured = [];
462
- const provider = createHistoryProviderV2(mockClient(captured, () => [["2024-01-01T00:00:01.000000Z", 60.1, 24.9]]), SELF_CONTEXT);
463
- await provider.getValues({
464
- ...range,
465
- pathSpecs: [
466
- {
467
- path: "navigation.position",
468
- aggregate: "first",
469
- parameter: [],
470
- sourceRef: "gps.main",
471
- },
472
- ],
473
- });
474
- assert.ok(captured[0].sql.includes("signalk_position") &&
475
- captured[0].sql.includes("AND source = 'gps.main'"), `expected a source-filtered position query, got: ${captured[0].sql}`);
476
- });
477
- it("keeps the source clause on the string-table fallback", async () => {
478
- const captured = [];
479
- const provider = createHistoryProviderV2(mockClient(captured, (sql) => sql.includes("signalk_str")
480
- ? [["2024-01-01T00:00:01.000000Z", "true"]]
481
- : []), SELF_CONTEXT);
482
- await provider.getValues({
483
- ...range,
484
- pathSpecs: [
485
- {
486
- path: "switches.bilge.state",
487
- aggregate: "first",
488
- parameter: [],
489
- sourceRef: "n2k-on-ve.can0.42",
490
- },
491
- ],
492
- });
493
- const fallback = captured.find((c) => c.sql.includes("signalk_str"));
494
- assert.ok(fallback, "expected the string-table fallback to run");
495
- assert.ok(fallback.sql.includes("AND source = 'n2k-on-ve.can0.42'"), `fallback must keep the source filter, got: ${fallback.sql}`);
496
- });
497
- it("echoes the sourceRef in the values metadata", async () => {
498
- const provider = createHistoryProviderV2(mockClient([], () => [["2024-01-01T00:00:01.000000Z", 4.2]]), SELF_CONTEXT);
499
- const result = await provider.getValues({
500
- ...range,
501
- pathSpecs: [
502
- {
503
- path: "navigation.speedOverGround",
504
- aggregate: "average",
505
- parameter: [],
506
- sourceRef: "gps.main",
507
- },
508
- {
509
- path: "navigation.speedOverGround",
510
- aggregate: "average",
511
- parameter: [],
512
- },
513
- ],
514
- });
515
- assert.equal(result.values[0].sourceRef, "gps.main");
516
- assert.ok(!("sourceRef" in result.values[1]), "an unfiltered spec must not grow a sourceRef");
517
- });
518
- it("serves the same path from two sources as two distinct columns", async () => {
519
- // sourceRef filtering is what makes the same path twice in one request
520
- // meaningful; keyed by path the second spec's rows would overwrite the
521
- // first's and both columns would show the same series.
522
- const provider = createHistoryProviderV2(mockClient([], (sql) => {
523
- if (sql.includes("source = 'gps.main'"))
524
- return [["2024-01-01T00:00:01.000000Z", 1.1]];
525
- if (sql.includes("source = 'gps.backup'"))
526
- return [["2024-01-01T00:00:01.000000Z", 2.2]];
527
- return [];
528
- }), SELF_CONTEXT);
529
- const result = await provider.getValues({
530
- ...range,
531
- pathSpecs: [
532
- {
533
- path: "navigation.speedOverGround",
534
- aggregate: "average",
535
- parameter: [],
536
- sourceRef: "gps.main",
537
- },
538
- {
539
- path: "navigation.speedOverGround",
540
- aggregate: "average",
541
- parameter: [],
542
- sourceRef: "gps.backup",
543
- },
544
- ],
545
- });
546
- assert.deepEqual(result.data, [["2024-01-01T00:00:01.000000Z", 1.1, 2.2]]);
547
- });
548
- it("rejects a sourceRef that is not a safe identifier", async () => {
549
- const provider = createHistoryProviderV2(mockClient([], () => []), SELF_CONTEXT);
550
- await assert.rejects(() => provider.getValues({
551
- ...range,
552
- pathSpecs: [
553
- {
554
- path: "navigation.speedOverGround",
555
- aggregate: "average",
556
- parameter: [],
557
- sourceRef: "x'; DROP TABLE signalk",
558
- },
559
- ],
560
- }));
561
- });
562
- });
563
- //# sourceMappingURL=history-v2.test.js.map