Skip to content

Commit 4078f63

Browse files
#666 Add Dataset behavior to Geodatasets (#670)
* #666 Chunk upload geodatasets, early group_id and feature_id for geodatasets * #666 geodataset settable group_id and feature_id * #666 geodataset _source and noDups * #666 Add Dataset behavior to Geodatasets * #666 touchups
1 parent 3965934 commit 4078f63

File tree

27 files changed

+2472
-341
lines changed

27 files changed

+2472
-341
lines changed

API/Backend/Geodatasets/models/geodatasets.js

Lines changed: 121 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,16 @@ const attributes = {
3131
unique: false,
3232
allowNull: true,
3333
},
34+
group_id_field: {
35+
type: Sequelize.STRING,
36+
unique: false,
37+
allowNull: true,
38+
},
39+
feature_id_field: {
40+
type: Sequelize.STRING,
41+
unique: false,
42+
allowNull: true,
43+
},
3444
table: {
3545
type: Sequelize.STRING,
3646
unique: true,
@@ -51,6 +61,8 @@ function makeNewGeodatasetTable(
5161
num_features,
5262
startProp,
5363
endProp,
64+
groupIdProp,
65+
featureIdProp,
5466
action,
5567
success,
5668
failure
@@ -71,6 +83,14 @@ function makeNewGeodatasetTable(
7183
type: Sequelize.BIGINT,
7284
allowNull: true,
7385
},
86+
group_id: {
87+
type: Sequelize.STRING,
88+
allowNull: true,
89+
},
90+
feature_id: {
91+
type: Sequelize.STRING,
92+
allowNull: true,
93+
},
7494
geometry_type: {
7595
type: Sequelize.STRING,
7696
unique: false,
@@ -86,18 +106,6 @@ function makeNewGeodatasetTable(
86106
timestamps: false,
87107
};
88108

89-
if (startProp != null)
90-
attributes.start_time = {
91-
type: Sequelize.BIGINT,
92-
allowNull: true,
93-
};
94-
95-
if (endProp != null)
96-
attributes.end_time = {
97-
type: Sequelize.BIGINT,
98-
allowNull: true,
99-
};
100-
101109
Geodatasets.findOne({ where: { name: name } })
102110
.then((result) => {
103111
if (result) {
@@ -113,6 +121,8 @@ function makeNewGeodatasetTable(
113121
if (action != "append") {
114122
updateThese.start_time_field = startProp;
115123
updateThese.end_time_field = endProp;
124+
updateThese.group_id_field = groupIdProp;
125+
updateThese.feature_id_field = featureIdProp;
116126
updateThese.num_features = num_features;
117127
} else {
118128
updateThese.num_features = (result.num_features || 0) + num_features;
@@ -131,9 +141,11 @@ function makeNewGeodatasetTable(
131141
}
132142
)
133143
.then(() => {
144+
const promises = [];
145+
134146
if (startProp != null || endProp != null) {
135-
sequelize
136-
.query(
147+
promises.push(
148+
sequelize.query(
137149
`CREATE INDEX IF NOT EXISTS ${Utils.forceAlphaNumUnder(
138150
`${result.dataValues.table}_time_idx`
139151
)} on ${Utils.forceAlphaNumUnder(
@@ -147,37 +159,65 @@ function makeNewGeodatasetTable(
147159
replacements: {},
148160
}
149161
)
150-
.then(() => {
151-
success({
152-
name: result.dataValues.name,
153-
table: result.dataValues.table,
154-
tableObj: GeodatasetTable,
155-
});
162+
);
163+
}
156164

157-
return null;
158-
})
159-
.catch((err) => {
160-
logger(
161-
"error",
162-
"Failed to recreate temporal index for geodataset table.",
163-
"geodatasets",
164-
null,
165-
err
166-
);
167-
failure({
168-
status: "failure",
169-
message: "Failed to recreate temporal index",
170-
});
165+
if (groupIdProp != null) {
166+
promises.push(
167+
sequelize.query(
168+
`CREATE INDEX IF NOT EXISTS ${Utils.forceAlphaNumUnder(
169+
`${result.dataValues.table}_group_id_idx`
170+
)} on ${Utils.forceAlphaNumUnder(
171+
result.dataValues.table
172+
)} USING gist (group_id);`,
173+
{
174+
replacements: {},
175+
}
176+
)
177+
);
178+
}
179+
180+
if (featureIdProp != null) {
181+
promises.push(
182+
sequelize.query(
183+
`CREATE INDEX IF NOT EXISTS ${Utils.forceAlphaNumUnder(
184+
`${result.dataValues.table}_feature_id_idx`
185+
)} on ${Utils.forceAlphaNumUnder(
186+
result.dataValues.table
187+
)} USING gist (feature_id);`,
188+
{
189+
replacements: {},
190+
}
191+
)
192+
);
193+
}
194+
195+
Promise.all(promises)
196+
.then(() => {
197+
success({
198+
name: result.dataValues.name,
199+
table: result.dataValues.table,
200+
tableObj: GeodatasetTable,
171201
});
172-
} else {
173-
success({
174-
name: result.dataValues.name,
175-
table: result.dataValues.table,
176-
tableObj: GeodatasetTable,
202+
203+
return null;
204+
})
205+
.catch((err) => {
206+
logger(
207+
"error",
208+
"Failed to recreate some indexes for geodataset table.",
209+
"geodatasets",
210+
null,
211+
err
212+
);
213+
failure({
214+
status: "failure",
215+
message: "Failed to recreate some indexes",
216+
});
217+
return null;
177218
});
178219

179-
return null;
180-
}
220+
return null;
181221
})
182222
.catch((err) => {
183223
logger(
@@ -220,6 +260,8 @@ function makeNewGeodatasetTable(
220260
num_features: num_features,
221261
start_time_field: startProp,
222262
end_time_field: endProp,
263+
group_id_field: groupIdProp,
264+
feature_id_field: featureIdProp,
223265
})
224266
.then((created) => {
225267
let GeodatasetTable = sequelize.define(
@@ -431,6 +473,44 @@ const up = async () => {
431473
);
432474
return null;
433475
});
476+
477+
// group_id_field column
478+
await sequelize
479+
.query(
480+
`ALTER TABLE geodatasets ADD COLUMN IF NOT EXISTS group_id_field varchar(255) NULL;`
481+
)
482+
.then(() => {
483+
return null;
484+
})
485+
.catch((err) => {
486+
logger(
487+
"error",
488+
`Failed to add geodatasets.group_id_field column. DB tables may be out of sync!`,
489+
"geodatasets",
490+
null,
491+
err
492+
);
493+
return null;
494+
});
495+
496+
// feature_id_field column
497+
await sequelize
498+
.query(
499+
`ALTER TABLE geodatasets ADD COLUMN IF NOT EXISTS feature_id_field varchar(255) NULL;`
500+
)
501+
.then(() => {
502+
return null;
503+
})
504+
.catch((err) => {
505+
logger(
506+
"error",
507+
`Failed to add geodatasets.feature_id_field column. DB tables may be out of sync!`,
508+
"geodatasets",
509+
null,
510+
err
511+
);
512+
return null;
513+
});
434514
};
435515

436516
// export User model for use in other files.

0 commit comments

Comments
 (0)