Exhaustive uploaded datasets
An Exhaustive instance normally trains and recalls against live transaction data accumulated through the entity analysis model. This page covers the other path: uploading a static CSV or JSON file as the instance’s data source, for offline exploration, training against a historical extract, or demonstrating a model without a live feed.
Where it lives
- Parsing and profiling:
Jube.Analytics/Datasets/(DatasetCsvParser,DatasetJsonParser,DatasetContentSniffer,DatasetProfile,DatasetColumnAccumulator,Models/DatasetModels.cs). This project has no dependency onJube.Dataand knows nothing about Postgres — it only turns a byte stream into rows, a column profile and a list of mapping warnings. - Storage and the upload/confirm workflow:
Jube.Service/Repository/ExhaustiveInstanceDataset/(ExhaustiveInstanceDatasetService,ExhaustiveInstanceDatasetMapper,HashingStream). - The row store itself:
Jube.Data/Repository/ExhaustiveInstanceDatasetRepository.cs, behind theIDatasetStoreinterface (Jube.Data/Repository/Interfaces/IDatasetStore.cs). - HTTP surface:
Jube.App/Endpoints/ExhaustiveInstanceDatasetEndpoints.cs, mounted at/api/ExhaustiveInstanceDatasetplus the two format-specific routes/api/ExhaustiveInstanceCsvand/api/ExhaustiveInstanceJsonthat the upload button posts to directly. - The Exhaustive page’s dataset panel:
Jube.App/Pages/Model/Frame/Exhaustive.cshtmlandJube.App/wwwroot/js/Model/Frame/ExhaustiveDataset.js, loaded beforeExhaustive.jsso the dataset picker is ready before the rest of the page’s script runs.
Upload, map, confirm
- Upload. The panel’s Kendo Upload widget posts the file (
.csv,.txtor.json) to/api/ExhaustiveInstanceCsv/Uploador/api/ExhaustiveInstanceJson/Upload.DatasetContentSnifferand the relevant parser read it as a stream —DatasetCountingStreamenforces the configured row and byte ceilings (DatasetLimits) without buffering the whole file — and return a profile: the column names, an inferredDatasetProcessingTypesguess per column, a handful of distinct sample values, and aDatasetParseReportof rows skipped or truncated. - Map. The grid (
DatasetColumnsGrid) lets the user confirm or override each column’s processing type and, for categorical columns, see the distinct valuesDatasetColumnAccumulatorcollected while scanning. Nothing is written to the instance yet — the parsed rows and the proposed mapping sit behind anExhaustiveInstanceDatasetDto/ExhaustiveInstanceDatasetMappingDtopair identified by the dataset’s own id. - Confirm.
ExhaustiveInstanceDatasetService.ConfirmAsynctakes the (possibly edited) column mapping, persists the dataset’s rows throughIDatasetStore, and points the owningExhaustiveSearchInstanceat it by settingExhaustiveInstanceCsvIdorExhaustiveInstanceJsonId(whichever format was uploaded) andDataSourceId. From this point the instance trains and recalls against the uploaded rows exactly as it would against a live feed, through the same sampling and training stages.
A dataset can be replaced (upload a new file, confirm it, and the instance’s ExhaustiveInstanceCsvId /
ExhaustiveInstanceJsonId moves to the new one) or removed (DELETE /api/ExhaustiveInstanceDataset/{id}, which the
page’s DatasetDeleteButton calls), returning the instance to whatever data source it had before.
See also
Exhaustive data sources covers how DataSourceId picks between a live archive feed, the
demo generator and an uploaded dataset, and what Preservation does with an uploaded dataset’s rows on export and import.
