@dbcube/schema-builder 1.0.18 → 1.0.19

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.cjs CHANGED
@@ -757,7 +757,6 @@ var DependencyResolver = class {
757
757
  }
758
758
  }
759
759
  if (result.length !== dependencies.length) {
760
- console.warn("\u26A0\uFE0F Circular dependencies detected in tables. Some tables may not execute in optimal order.");
761
760
  for (const dep of dependencies) {
762
761
  if (!result.includes(dep.tableName)) {
763
762
  result.push(dep.tableName);
@@ -778,7 +777,6 @@ var DependencyResolver = class {
778
777
  import_fs3.default.mkdirSync(dbcubeDir, { recursive: true });
779
778
  }
780
779
  import_fs3.default.writeFileSync(orderFile, JSON.stringify(order, null, 2), "utf8");
781
- console.log(`\u{1F4C4} Execution order saved to: ${import_path2.default.relative(projectRoot, orderFile)}`);
782
780
  } catch (error) {
783
781
  console.error("\u274C Failed to save execution order:", error);
784
782
  }
@@ -806,7 +804,6 @@ var DependencyResolver = class {
806
804
  static orderCubeFiles(cubeFiles, cubeType) {
807
805
  const executionOrder = this.loadExecutionOrder();
808
806
  if (!executionOrder) {
809
- console.log("\u{1F4C4} No execution order found, processing files in current order");
810
807
  return cubeFiles;
811
808
  }
812
809
  const orderList = cubeType === "table" ? executionOrder.tables : executionOrder.seeders;
@@ -827,7 +824,6 @@ var DependencyResolver = class {
827
824
  for (const [, file] of fileMap) {
828
825
  orderedFiles.push(file);
829
826
  }
830
- console.log(`\u{1F4CB} Using dependency order: ${orderList.join(" \u2192 ")}`);
831
827
  return orderedFiles;
832
828
  }
833
829
  };
@@ -934,6 +930,62 @@ var Schema = class {
934
930
  return 1;
935
931
  }
936
932
  }
933
+ /**
934
+ * Extracts foreign key dependencies from a cube file
935
+ */
936
+ extractForeignKeyDependencies(filePath) {
937
+ const dependencies = [];
938
+ try {
939
+ const content = import_fs4.default.readFileSync(filePath, "utf8");
940
+ const lines = content.split("\n");
941
+ let insideForeignKey = false;
942
+ let braceCount = 0;
943
+ for (const line of lines) {
944
+ if (/foreign\s*:\s*\{/.test(line)) {
945
+ insideForeignKey = true;
946
+ braceCount = 1;
947
+ const sameLineMatch = line.match(/table\s*:\s*["']([^"']+)["']/);
948
+ if (sameLineMatch) {
949
+ dependencies.push(sameLineMatch[1]);
950
+ insideForeignKey = false;
951
+ braceCount = 0;
952
+ }
953
+ continue;
954
+ }
955
+ if (insideForeignKey) {
956
+ braceCount += (line.match(/\{/g) || []).length;
957
+ braceCount -= (line.match(/\}/g) || []).length;
958
+ const tableMatch = line.match(/table\s*:\s*["']([^"']+)["']/);
959
+ if (tableMatch) {
960
+ dependencies.push(tableMatch[1]);
961
+ }
962
+ if (braceCount === 0) {
963
+ insideForeignKey = false;
964
+ }
965
+ }
966
+ }
967
+ } catch (error) {
968
+ console.error(`Error reading dependencies from ${filePath}:`, error);
969
+ }
970
+ return dependencies;
971
+ }
972
+ /**
973
+ * Finds the line number where a foreign key table reference is located
974
+ */
975
+ findForeignKeyLineNumber(filePath, tableName) {
976
+ try {
977
+ const content = import_fs4.default.readFileSync(filePath, "utf8");
978
+ const lines = content.split("\n");
979
+ for (let i = 0; i < lines.length; i++) {
980
+ if (lines[i].includes(`table: "${tableName}"`) || lines[i].includes(`table: '${tableName}'`)) {
981
+ return i + 1;
982
+ }
983
+ }
984
+ return 1;
985
+ } catch {
986
+ return 1;
987
+ }
988
+ }
937
989
  async createDatabase() {
938
990
  const startTime = Date.now();
939
991
  const rootPath = import_path3.default.resolve(process.cwd());
@@ -988,7 +1040,6 @@ var Schema = class {
988
1040
  if (cubeFiles.length === 0) {
989
1041
  throw new Error("\u274C There are no cubes to execute");
990
1042
  }
991
- console.log("\u{1F504} Resolving table dependencies...");
992
1043
  DependencyResolver.resolveDependencies(cubeFiles, "table");
993
1044
  const orderedCubeFiles = DependencyResolver.orderCubeFiles(cubeFiles, "table");
994
1045
  UIUtils.showOperationHeader("EXECUTING REFRESH TABLES", this.name, "\u{1F504}");
@@ -997,6 +1048,7 @@ var Schema = class {
997
1048
  let errorCount = 0;
998
1049
  const processedTables = [];
999
1050
  const errors = [];
1051
+ const failedTables = /* @__PURE__ */ new Set();
1000
1052
  for (let index = 0; index < orderedCubeFiles.length; index++) {
1001
1053
  const file = orderedCubeFiles[index];
1002
1054
  const filePath = import_path3.default.isAbsolute(file) ? file : import_path3.default.join(cubesDir, file);
@@ -1010,6 +1062,22 @@ var Schema = class {
1010
1062
  if (!validation.isValid && validation.error) {
1011
1063
  UIUtils.showItemError(tableName, validation.error.error);
1012
1064
  errors.push(validation.error);
1065
+ failedTables.add(tableName);
1066
+ errorCount++;
1067
+ continue;
1068
+ }
1069
+ const dependencies = this.extractForeignKeyDependencies(filePath);
1070
+ const missingDependencies = dependencies.filter((dep) => failedTables.has(dep));
1071
+ if (missingDependencies.length > 0) {
1072
+ const dependencyError = {
1073
+ itemName: tableName,
1074
+ error: `Cannot refresh table '${tableName}' because it depends on failed table(s): ${missingDependencies.join(", ")}`,
1075
+ filePath,
1076
+ lineNumber: this.findForeignKeyLineNumber(filePath, missingDependencies[0])
1077
+ };
1078
+ UIUtils.showItemError(tableName, dependencyError.error);
1079
+ errors.push(dependencyError);
1080
+ failedTables.add(tableName);
1013
1081
  errorCount++;
1014
1082
  continue;
1015
1083
  }
@@ -1066,6 +1134,7 @@ var Schema = class {
1066
1134
  };
1067
1135
  UIUtils.showItemError(tableName, error.message);
1068
1136
  errors.push(processError);
1137
+ failedTables.add(tableName);
1069
1138
  errorCount++;
1070
1139
  }
1071
1140
  }
@@ -1093,7 +1162,6 @@ var Schema = class {
1093
1162
  if (cubeFiles.length === 0) {
1094
1163
  throw new Error("\u274C There are no cubes to execute");
1095
1164
  }
1096
- console.log("\u{1F504} Resolving table dependencies...");
1097
1165
  DependencyResolver.resolveDependencies(cubeFiles, "table");
1098
1166
  const orderedCubeFiles = DependencyResolver.orderCubeFiles(cubeFiles, "table");
1099
1167
  UIUtils.showOperationHeader("EXECUTING FRESH TABLES", this.name);
@@ -1102,6 +1170,7 @@ var Schema = class {
1102
1170
  let errorCount = 0;
1103
1171
  const processedTables = [];
1104
1172
  const errors = [];
1173
+ const failedTables = /* @__PURE__ */ new Set();
1105
1174
  for (let index = 0; index < orderedCubeFiles.length; index++) {
1106
1175
  const file = orderedCubeFiles[index];
1107
1176
  const filePath = import_path3.default.isAbsolute(file) ? file : import_path3.default.join(cubesDir, file);
@@ -1115,6 +1184,22 @@ var Schema = class {
1115
1184
  if (!validation.isValid && validation.error) {
1116
1185
  UIUtils.showItemError(tableName, validation.error.error);
1117
1186
  errors.push(validation.error);
1187
+ failedTables.add(tableName);
1188
+ errorCount++;
1189
+ continue;
1190
+ }
1191
+ const dependencies = this.extractForeignKeyDependencies(filePath);
1192
+ const missingDependencies = dependencies.filter((dep) => failedTables.has(dep));
1193
+ if (missingDependencies.length > 0) {
1194
+ const dependencyError = {
1195
+ itemName: tableName,
1196
+ error: `Cannot create table '${tableName}' because it depends on failed table(s): ${missingDependencies.join(", ")}`,
1197
+ filePath,
1198
+ lineNumber: this.findForeignKeyLineNumber(filePath, missingDependencies[0])
1199
+ };
1200
+ UIUtils.showItemError(tableName, dependencyError.error);
1201
+ errors.push(dependencyError);
1202
+ failedTables.add(tableName);
1118
1203
  errorCount++;
1119
1204
  continue;
1120
1205
  }
@@ -1169,6 +1254,7 @@ var Schema = class {
1169
1254
  };
1170
1255
  UIUtils.showItemError(tableName, error.message);
1171
1256
  errors.push(processError);
1257
+ failedTables.add(tableName);
1172
1258
  errorCount++;
1173
1259
  }
1174
1260
  }