@travetto/model-sql 8.0.0-alpha.13 → 8.0.0-alpha.14

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@travetto/model-sql",
3
- "version": "8.0.0-alpha.13",
3
+ "version": "8.0.0-alpha.14",
4
4
  "type": "module",
5
5
  "description": "SQL backing for the travetto model module, with real-time modeling support for SQL schemas.",
6
6
  "keywords": [
@@ -31,8 +31,8 @@
31
31
  "@travetto/config": "^8.0.0-alpha.12",
32
32
  "@travetto/context": "^8.0.0-alpha.11",
33
33
  "@travetto/model": "^8.0.0-alpha.12",
34
- "@travetto/model-indexed": "^8.0.0-alpha.13",
35
- "@travetto/model-query": "^8.0.0-alpha.12"
34
+ "@travetto/model-indexed": "^8.0.0-alpha.14",
35
+ "@travetto/model-query": "^8.0.0-alpha.13"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "@travetto/cli": "^8.0.0-alpha.17",
@@ -746,15 +746,16 @@ CREATE TABLE IF NOT EXISTS ${this.table(stack)} (
746
746
  }
747
747
  return [castTo(key), typeof value === 'number' ? value === 1 : (!!value)];
748
748
  });
749
- return `CREATE ${idx.type === 'query:unique' ? 'UNIQUE ' : ''}INDEX ${constraint} ON ${this.identifier(table)} (${fields
749
+ return `CREATE ${idx.unique ? 'UNIQUE ' : ''}INDEX ${constraint} ON ${this.identifier(table)} (${fields
750
750
  .map(([name, sel]) => `${this.identifier(name)} ${sel ? 'ASC' : 'DESC'}`)
751
751
  .join(', ')});`;
752
752
  } else if (isModelIndexedIndex(idx)) {
753
- if ([...idx.sortTemplate, ...idx.keyTemplate].find(field => field.path.length > 1)) {
753
+ const all = [...idx.keyTemplate, ...idx.sortTemplate];
754
+ if (all.find(field => field.path.length > 1)) {
754
755
  console.debug('Nested fields are not supported in ModelIndexed indices SQL', { index: idx.name });
755
756
  return;
756
757
  }
757
- const fields = [...idx.sortTemplate, ...idx.keyTemplate]
758
+ const fields = all
758
759
  .map(({ path, value }) => `${this.identifier(path.join('_'))} ${value === -1 ? 'DESC' : 'ASC'}`)
759
760
  .join(', ');
760
761
  switch (idx.type) {
@@ -1094,10 +1095,9 @@ ${this.getWhereSQL(cls, where!)}`;
1094
1095
  */
1095
1096
  isIndexChanged(requested: IndexConfig, existing: SQLTableDescription['indices'][number]): boolean {
1096
1097
  if (isModelQueryIndex(requested)) {
1097
- let result =
1098
- (existing.is_unique && requested.type !== 'query:unique')
1099
- || requested.fields.length !== existing.columns.length;
1100
-
1098
+ const uniqueChanged = (existing.is_unique && !requested.unique);
1099
+ const columnSizeChanged = requested.fields.length !== existing.columns.length;
1100
+ let result = uniqueChanged || columnSizeChanged;
1101
1101
  for (let i = 0; i < requested.fields.length && !result; i++) {
1102
1102
  const [[key, value]] = Object.entries(requested.fields[i]);
1103
1103
  const desc = value === -1;
@@ -1106,8 +1106,21 @@ ${this.getWhereSQL(cls, where!)}`;
1106
1106
 
1107
1107
  return result;
1108
1108
  } else if (isModelIndexedIndex(requested)) {
1109
- // TODO: Fill this out
1110
- return false;
1109
+ const keys = Object.entries(requested.key);
1110
+ const sort = Object.entries(requested.sort);
1111
+ const all = [...keys, ...sort];
1112
+
1113
+ const uniqueChanged = (requested.type === 'indexed:keyed' && existing.is_unique && !requested.unique);
1114
+ const columnSizeChanged = all.length !== existing.columns.length;
1115
+ let result = uniqueChanged || columnSizeChanged;
1116
+
1117
+ for (let i = 0; i < all.length && !result; i++) {
1118
+ const [key, value] = all[i];
1119
+ const desc = value === -1;
1120
+ result ||= key !== existing.columns[i].name && desc !== existing.columns[i].desc;
1121
+ }
1122
+
1123
+ return result;
1111
1124
  } else {
1112
1125
  throw new IndexNotSupported(requested.class, requested, 'Only indexed and query indices are supported in SQL');
1113
1126
  }