@@ -62,6 +62,8 @@ def recombinant_update(context: Context, data_dict: DataDict):
6262 :param owner_org: organization name or id
6363 :param delete_resources: True to delete extra resources found
6464 :param force_update: True to force updating of datastore tables
65+ :param delete_fields: True to delete old fields not in schema,
66+ requires force_update=True
6567 '''
6668 lc , geno , dataset = _action_get_dataset (context , data_dict )
6769
@@ -70,7 +72,8 @@ def recombinant_update(context: Context, data_dict: DataDict):
7072 delete_resources = asbool (data_dict .get ('delete_resources' , False )))
7173 _update_datastore (
7274 lc , geno , dataset ,
73- force_update = asbool (data_dict .get ('force_update' , False )))
75+ force_update = asbool (data_dict .get ('force_update' , False )),
76+ delete_fields = asbool (data_dict .get ('delete_fields' , False )))
7477
7578
7679def recombinant_show (context : Context , data_dict : DataDict ) -> Dict [str , Any ]:
@@ -113,11 +116,12 @@ def recombinant_show(context: Context, data_dict: DataDict) -> Dict[str, Any]:
113116 try :
114117 ds = lc .action .datastore_search (
115118 resource_id = resource ['id' ],
116- limit = 1 )
119+ limit = 0 )
117120 datastore_correct = _datastore_match (r ['fields' ], ds ['fields' ])
118121 out ['datastore_correct' ] = datastore_correct
119122 resources_correct = resources_correct and datastore_correct
120123 out ['datastore_rows' ] = ds .get ('total' , 0 )
124+ out ['datastore_active' ] = True
121125 except NotFound :
122126 out ['error' ] = 'datastore table missing'
123127 resources_correct = False
@@ -244,7 +248,8 @@ def _update_dataset(lc: LocalCKAN,
244248def _update_datastore (lc : LocalCKAN ,
245249 geno : Dict [str , Any ],
246250 dataset : Dict [str , Any ],
247- force_update : bool = False ):
251+ force_update : bool = False ,
252+ delete_fields : bool = False ):
248253 """
249254 call lc.action.datastore_create to create tables or add
250255 columns to existing datastore tables based on dataset definition
@@ -259,6 +264,7 @@ def _update_datastore(lc: LocalCKAN,
259264 chromo ['resource_name' ], dataset ['id' ])
260265 resource_id = resource_ids [chromo ['resource_name' ]]
261266 fields = datastore_fields (chromo ['fields' ], datastore_text_types )
267+ do_delete_fields = False
262268 try :
263269 ds = lc .action .datastore_search (resource_id = resource_id , limit = 0 )
264270 except NotFound :
@@ -273,6 +279,18 @@ def _update_datastore(lc: LocalCKAN,
273279 for f in datastore_fields (chromo ['fields' ], datastore_text_types ):
274280 if f ['id' ] not in seen :
275281 fields .append (f )
282+ if delete_fields :
283+ # remove any fields from DS not in Schema
284+ new_fields = []
285+ schema_field_ids = set (
286+ f ['id' ] for f in datastore_fields (chromo ['fields' ],
287+ datastore_text_types ))
288+ for f in fields :
289+ if f ['id' ] not in schema_field_ids :
290+ do_delete_fields = True
291+ continue
292+ new_fields .append (f )
293+ fields = new_fields
276294
277295 trigger_names = _update_triggers (lc , chromo )
278296
@@ -292,6 +310,7 @@ def _update_datastore(lc: LocalCKAN,
292310 lc .action .datastore_create (
293311 resource_id = resource_id ,
294312 fields = fields ,
313+ delete_fields = do_delete_fields ,
295314 primary_key = chromo .get ('datastore_primary_key' , []),
296315 foreign_keys = foreign_keys ,
297316 indexes = chromo .get ('datastore_indexes' , []),
@@ -410,7 +429,8 @@ def _datastore_match(fs: List[Dict[str, Any]], fields: List[Dict[str, Any]]) ->
410429 """
411430 # XXX: does not check types or extra columns at this time
412431 existing = set (c ['id' ] for c in fields )
413- return all (f ['datastore_id' ] in existing for f in fs )
432+ return all (f ['datastore_id' ] in existing for f in fs
433+ if not f .get ('published_resource_computed_field' , False ))
414434
415435
416436@chained_action
0 commit comments