catalyst-relay 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -373,7 +373,7 @@ function requireConfig(extension) {
373
373
  return [config, null];
374
374
  }
375
375
 
376
- // src/core/adt/read.ts
376
+ // src/core/adt/craud/read.ts
377
377
  async function readObject(client, object) {
378
378
  const [config, configErr] = requireConfig(object.extension);
379
379
  if (configErr) return err(configErr);
@@ -397,7 +397,7 @@ async function readObject(client, object) {
397
397
  return ok(result);
398
398
  }
399
399
 
400
- // src/core/adt/lock.ts
400
+ // src/core/adt/craud/lock.ts
401
401
  async function lockObject(client, object) {
402
402
  const [config, configErr] = requireConfig(object.extension);
403
403
  if (configErr) return err(configErr);
@@ -445,7 +445,7 @@ async function unlockObject(client, object, lockHandle) {
445
445
  return ok(void 0);
446
446
  }
447
447
 
448
- // src/core/adt/create.ts
448
+ // src/core/adt/craud/create.ts
449
449
  async function createObject(client, object, packageName, transport, username) {
450
450
  const [config, configErr] = requireConfig(object.extension);
451
451
  if (configErr) return err(configErr);
@@ -482,7 +482,7 @@ async function createObject(client, object, packageName, transport, username) {
482
482
  return ok(void 0);
483
483
  }
484
484
 
485
- // src/core/adt/update.ts
485
+ // src/core/adt/craud/update.ts
486
486
  async function updateObject(client, object, lockHandle, transport) {
487
487
  const [config, configErr] = requireConfig(object.extension);
488
488
  if (configErr) return err(configErr);
@@ -510,7 +510,7 @@ async function updateObject(client, object, lockHandle, transport) {
510
510
  return ok(void 0);
511
511
  }
512
512
 
513
- // src/core/adt/delete.ts
513
+ // src/core/adt/craud/delete.ts
514
514
  async function deleteObject(client, object, lockHandle, transport) {
515
515
  const [config, configErr] = requireConfig(object.extension);
516
516
  if (configErr) return err(configErr);
@@ -535,7 +535,7 @@ async function deleteObject(client, object, lockHandle, transport) {
535
535
  return ok(void 0);
536
536
  }
537
537
 
538
- // src/core/adt/activation.ts
538
+ // src/core/adt/craud/activation.ts
539
539
  async function activateObjects(client, objects) {
540
540
  if (objects.length === 0) {
541
541
  return ok([]);
@@ -645,7 +645,7 @@ function extractActivationErrors(objects, xml, _extension) {
645
645
  return ok(results);
646
646
  }
647
647
 
648
- // src/core/adt/tree.ts
648
+ // src/core/adt/discovery/tree.ts
649
649
  async function getTree(client, query) {
650
650
  const internalQuery = {};
651
651
  if (query.package) {
@@ -762,7 +762,7 @@ function parseTreeResponse(xml) {
762
762
  return ok({ nodes, packages });
763
763
  }
764
764
 
765
- // src/core/adt/packages.ts
765
+ // src/core/adt/discovery/packages.ts
766
766
  async function getPackages(client) {
767
767
  const [treeResult, treeErr] = await getTreeInternal(client, {}, "*");
768
768
  if (treeErr) {
@@ -771,7 +771,7 @@ async function getPackages(client) {
771
771
  return ok(treeResult.packages);
772
772
  }
773
773
 
774
- // src/core/adt/transports.ts
774
+ // src/core/adt/transports/transports.ts
775
775
  async function getTransports(client, packageName) {
776
776
  const contentType = "application/vnd.sap.as+xml; charset=UTF-8; dataname=com.sap.adt.transport.service.checkData";
777
777
  const body = `<?xml version="1.0" encoding="UTF-8"?>
@@ -840,7 +840,7 @@ function extractTransports(xml) {
840
840
  return ok(transports);
841
841
  }
842
842
 
843
- // src/core/adt/previewParser.ts
843
+ // src/core/adt/data_extraction/previewParser.ts
844
844
  function parseDataPreview(xml, maxRows, isTable) {
845
845
  const [doc, parseErr] = safeParseXml(xml);
846
846
  if (parseErr) {
@@ -899,7 +899,7 @@ function parseDataPreview(xml, maxRows, isTable) {
899
899
  return ok(dataFrame);
900
900
  }
901
901
 
902
- // src/core/adt/dataPreview.ts
902
+ // src/core/adt/data_extraction/dataPreview.ts
903
903
  async function previewData(client, query) {
904
904
  const extension = query.objectType === "table" ? "astabldt" : "asddls";
905
905
  const config = getConfigByExtension(extension);
@@ -939,11 +939,83 @@ async function previewData(client, query) {
939
939
  return ok(dataFrame);
940
940
  }
941
941
 
942
- // src/core/adt/distinct.ts
942
+ // src/core/adt/data_extraction/queryBuilder.ts
943
+ function quoteString(value) {
944
+ return typeof value == "string" ? "'" + value + "'" : "" + value;
945
+ }
946
+ function basicFilterToWhere(filter) {
947
+ return `${filter.field} ${filter.operator} ${quoteString(filter.value)}`;
948
+ }
949
+ function betweenFilterToWhere(filter) {
950
+ return `${filter.field} between ${quoteString(filter.minimum)} and ${quoteString(filter.maximum)}`;
951
+ }
952
+ function listFilterToWhere(filter) {
953
+ return `${filter.field} ${filter.include ? "" : "not "}in ( ${filter.values.map(quoteString).join(", ")} )`;
954
+ }
955
+ function queryFilterToWhere(filter) {
956
+ if (filter.type === "list") return listFilterToWhere(filter);
957
+ if (filter.type === "between") return betweenFilterToWhere(filter);
958
+ return basicFilterToWhere(filter);
959
+ }
960
+ function queryFiltersToWhere(filters) {
961
+ if (filters.length === 0) return "";
962
+ return `
963
+ where ${filters.map(queryFilterToWhere).join(" and ")}`;
964
+ }
965
+ function sortingsToOrderBy(sortings) {
966
+ if (sortings.length === 0) return "";
967
+ return `
968
+ order by ${sortings.map((s) => `${s.field} ${s.direction}`).join(", ")}`;
969
+ }
970
+ function fieldsToGroupbyClause(fields) {
971
+ if (fields.length === 0) return "";
972
+ return `
973
+ group by ${fields.join(", ")}`;
974
+ }
975
+ function aggregationToFieldDefinition(aggregation) {
976
+ if (aggregation.function === "count") {
977
+ return `count( distinct main~${aggregation.field} ) as ${aggregation.field}`;
978
+ }
979
+ return `${aggregation.function}( main~${aggregation.field} ) as ${aggregation.field}`;
980
+ }
981
+ function parametersToSQLParams(params) {
982
+ if (params.length === 0) return "";
983
+ return `( ${params.map((p) => `${p.name} = ${quoteString(p.value)}`).join(", ")})`;
984
+ }
985
+ function buildSQLQuery(query) {
986
+ const [parameters, filters, sortings, aggregations] = [query.parameters ?? [], query.filters ?? [], query.sortings ?? [], query.aggregations ?? []];
987
+ const groupingFields = query.fields.filter((f) => !aggregations.find((a) => a.field === f));
988
+ if (sortings.filter((s) => !query.fields.includes(s.field)).length > 0) {
989
+ return err(new Error("Sorting fields must be included in the selected fields."));
990
+ }
991
+ let selectClause = "select\n";
992
+ const fieldSelections = [];
993
+ for (const field of query.fields) {
994
+ const aggregation = aggregations.find((a) => a.field === field);
995
+ if (aggregation) {
996
+ fieldSelections.push(` ${aggregationToFieldDefinition(aggregation)}`);
997
+ continue;
998
+ }
999
+ fieldSelections.push(` main~${field}`);
1000
+ }
1001
+ selectClause += fieldSelections.join(",\n") + `
1002
+ from ${query.objectName}${parametersToSQLParams(parameters)} as main
1003
+ `;
1004
+ const [whereClause, groupbyClause, orderbyClause] = [queryFiltersToWhere(filters), aggregations.length ? fieldsToGroupbyClause(groupingFields) : "", sortingsToOrderBy(sortings)];
1005
+ const result = {
1006
+ objectName: query.objectName,
1007
+ objectType: query.objectType,
1008
+ sqlQuery: `${selectClause}${whereClause}${groupbyClause}${orderbyClause}`
1009
+ };
1010
+ if (query.limit !== void 0) result.limit = query.limit;
1011
+ return ok(result);
1012
+ }
1013
+
1014
+ // src/core/adt/data_extraction/distinct.ts
943
1015
  var MAX_ROW_COUNT = 5e4;
944
- async function getDistinctValues(client, objectName, column, objectType = "view") {
1016
+ async function getDistinctValues(client, objectName, parameters, column, objectType = "view") {
945
1017
  const columnName = column.toUpperCase();
946
- const sqlQuery = `SELECT ${columnName} AS value, COUNT(*) AS count FROM ${objectName} GROUP BY ${columnName}`;
1018
+ const sqlQuery = `SELECT ${columnName} AS value, COUNT(*) AS ValueCount FROM ${objectName}${parametersToSQLParams(parameters)} GROUP BY ${columnName} ORDER BY ValueCount DESCENDING`;
947
1019
  const [dataFrame, error] = await previewData(client, {
948
1020
  objectName,
949
1021
  objectType,
@@ -960,7 +1032,7 @@ async function getDistinctValues(client, objectName, column, objectType = "view"
960
1032
  return ok({ column, values });
961
1033
  }
962
1034
 
963
- // src/core/adt/count.ts
1035
+ // src/core/adt/data_extraction/count.ts
964
1036
  async function countRows(client, objectName, objectType) {
965
1037
  const sqlQuery = `SELECT COUNT(*) AS count FROM ${objectName}`;
966
1038
  const [dataFrame, error] = await previewData(client, {
@@ -983,7 +1055,7 @@ async function countRows(client, objectName, objectType) {
983
1055
  return ok(count);
984
1056
  }
985
1057
 
986
- // src/core/adt/searchObjects.ts
1058
+ // src/core/adt/discovery/searchObjects.ts
987
1059
  async function searchObjects(client, query, types) {
988
1060
  const searchPattern = query || "*";
989
1061
  const objectTypes = types && types.length > 0 ? types : getAllTypes();
@@ -1050,7 +1122,7 @@ function parseSearchResults(xml) {
1050
1122
  return ok(results);
1051
1123
  }
1052
1124
 
1053
- // src/core/adt/whereUsed.ts
1125
+ // src/core/adt/discovery/whereUsed.ts
1054
1126
  async function findWhereUsed(client, object) {
1055
1127
  const config = getConfigByExtension(object.extension);
1056
1128
  if (!config) {
@@ -1124,7 +1196,7 @@ function parseWhereUsed(xml) {
1124
1196
  return ok(dependencies);
1125
1197
  }
1126
1198
 
1127
- // src/core/adt/createTransport.ts
1199
+ // src/core/adt/transports/createTransport.ts
1128
1200
  async function createTransport(client, config) {
1129
1201
  const body = dictToAbapXml({
1130
1202
  DEVCLASS: config.package,
@@ -1155,7 +1227,7 @@ async function createTransport(client, config) {
1155
1227
  return ok(transportId);
1156
1228
  }
1157
1229
 
1158
- // src/core/adt/gitDiff.ts
1230
+ // src/core/adt/craud/gitDiff.ts
1159
1231
  import { diffArrays } from "diff";
1160
1232
  function computeDiff(serverLines, localLines) {
1161
1233
  const changes = diffArrays(serverLines, localLines);
@@ -2103,9 +2175,9 @@ var ADTClientImpl = class {
2103
2175
  if (!this.state.session) return err(new Error("Not logged in"));
2104
2176
  return previewData(this.requestor, query);
2105
2177
  }
2106
- async getDistinctValues(objectName, column, objectType = "view") {
2178
+ async getDistinctValues(objectName, parameters, column, objectType = "view") {
2107
2179
  if (!this.state.session) return err(new Error("Not logged in"));
2108
- return getDistinctValues(this.requestor, objectName, column, objectType);
2180
+ return getDistinctValues(this.requestor, objectName, parameters, column, objectType);
2109
2181
  }
2110
2182
  async countRows(objectName, objectType) {
2111
2183
  if (!this.state.session) return err(new Error("Not logged in"));
@@ -2150,19 +2222,8 @@ function createClient(config) {
2150
2222
  }
2151
2223
  return ok(new ADTClientImpl(config));
2152
2224
  }
2153
-
2154
- // src/core/config.ts
2155
- import { readFileSync } from "fs";
2156
- import { z as z2 } from "zod";
2157
- var systemConfigSchema = z2.record(
2158
- z2.string(),
2159
- z2.object({
2160
- adt: z2.string().url().optional(),
2161
- odata: z2.string().url().optional(),
2162
- instance_num: z2.string().optional()
2163
- })
2164
- );
2165
2225
  export {
2226
+ buildSQLQuery,
2166
2227
  createClient,
2167
2228
  err,
2168
2229
  ok