@@ -97,11 +97,10 @@ public List<DvObjectSolrDoc> determineSolrDocs(DvObject dvObject) {
9797 solrDocs .addAll (datasetSolrDocs );
9898 } else if (dvObject .isInstanceofDataFile ()) {
9999 DataFile datafile = (DataFile ) dvObject ;
100- Map <DatasetVersion .VersionState , Boolean > desiredCards = searchPermissionsService .getDesiredCards (datafile .getOwner ());
101100 Set <DatasetVersion > datasetVersions = datasetVersionsToBuildCardsFor (datafile .getOwner ());
102101 List <String > downloaders = searchPermissionsService .findDvObjectPerms (datafile );
103102 for (DatasetVersion version : datasetVersions ) {
104- if (desiredCards . containsKey ( version . getVersionState ()) && desiredCards . get ( version . getVersionState ()) && datafile .isInDatasetVersion (version )) {
103+ if (datafile .isInDatasetVersion (version )) {
105104 List <String > cachedPerms = searchPermissionsService .findDatasetVersionPerms (version );
106105 String solrIdEnd = getDatasetOrDataFileSolrEnding (version .getVersionState ());
107106 Long versionId = version .getId ();
@@ -148,13 +147,9 @@ private DvObjectSolrDoc constructDataverseSolrDoc(Dataverse dataverse) {
148147 private List <DvObjectSolrDoc > constructDatasetSolrDocs (Dataset dataset ) {
149148 List <DvObjectSolrDoc > emptyList = new ArrayList <>();
150149 List <DvObjectSolrDoc > solrDocs = emptyList ;
151- Map <DatasetVersion .VersionState , Boolean > desiredCards = searchPermissionsService .getDesiredCards (dataset );
152150 for (DatasetVersion version : datasetVersionsToBuildCardsFor (dataset )) {
153- boolean cardShouldExist = desiredCards .get (version .getVersionState ());
154- if (cardShouldExist ) {
155- DvObjectSolrDoc datasetSolrDoc = makeDatasetSolrDoc (version );
156- solrDocs .add (datasetSolrDoc );
157- }
151+ DvObjectSolrDoc datasetSolrDoc = makeDatasetSolrDoc (version );
152+ solrDocs .add (datasetSolrDoc );
158153 }
159154 return solrDocs ;
160155 }
@@ -173,43 +168,49 @@ private DvObjectSolrDoc constructDatafileSolrDoc(DataFileProxy fileProxy, List<S
173168
174169 private List <DvObjectSolrDoc > constructDatafileSolrDocsFromDataset (Dataset dataset ) {
175170 List <DvObjectSolrDoc > datafileSolrDocs = new ArrayList <>();
176- Map <DatasetVersion .VersionState , Boolean > desiredCards = searchPermissionsService .getDesiredCards (dataset );
177171 for (DatasetVersion datasetVersionFileIsAttachedTo : datasetVersionsToBuildCardsFor (dataset )) {
178- boolean cardShouldExist = desiredCards .get (datasetVersionFileIsAttachedTo .getVersionState ());
179- if (cardShouldExist ) {
180- List <String > perms = new ArrayList <>();
181- if (datasetVersionFileIsAttachedTo .isReleased ()) {
182- perms .add (IndexServiceBean .getPublicGroupString ());
183- } else {
184- perms = searchPermissionsService .findDatasetVersionPerms (datasetVersionFileIsAttachedTo );
185- }
172+ List <String > perms = new ArrayList <>();
173+ if (datasetVersionFileIsAttachedTo .isReleased ()) {
174+ perms .add (IndexServiceBean .getPublicGroupString ());
175+ } else {
176+ perms = searchPermissionsService .findDatasetVersionPerms (datasetVersionFileIsAttachedTo );
177+ }
186178
187- for (FileMetadata fileMetadata : datasetVersionFileIsAttachedTo .getFileMetadatas ()) {
188- Long fileId = fileMetadata .getDataFile ().getId ();
189- String solrIdStart = IndexServiceBean .solrDocIdentifierFile + fileId ;
190- String solrIdEnd = getDatasetOrDataFileSolrEnding (datasetVersionFileIsAttachedTo .getVersionState ());
191- String solrId = solrIdStart + solrIdEnd ;
192- List <String > ftperms = new ArrayList <>();
193- if (fileMetadata .getDataFile ().isRestricted ()) {
194- ftperms = searchPermissionsService .findDvObjectPerms (fileMetadata .getDataFile ());
195- }
196- DvObjectSolrDoc dataFileSolrDoc = new DvObjectSolrDoc (fileId .toString (), solrId , datasetVersionFileIsAttachedTo .getId (), fileMetadata .getLabel (), perms , ftperms );
197- logger .finest ("adding fileid " + fileId );
198- datafileSolrDocs .add (dataFileSolrDoc );
179+ for (FileMetadata fileMetadata : datasetVersionFileIsAttachedTo .getFileMetadatas ()) {
180+ Long fileId = fileMetadata .getDataFile ().getId ();
181+ String solrIdStart = IndexServiceBean .solrDocIdentifierFile + fileId ;
182+ String solrIdEnd = getDatasetOrDataFileSolrEnding (datasetVersionFileIsAttachedTo .getVersionState ());
183+ String solrId = solrIdStart + solrIdEnd ;
184+ List <String > ftperms = new ArrayList <>();
185+ if (fileMetadata .getDataFile ().isRestricted ()) {
186+ ftperms = searchPermissionsService .findDvObjectPerms (fileMetadata .getDataFile ());
199187 }
188+ DvObjectSolrDoc dataFileSolrDoc = new DvObjectSolrDoc (fileId .toString (), solrId , datasetVersionFileIsAttachedTo .getId (), fileMetadata .getLabel (), perms , ftperms );
189+ logger .finest ("adding fileid " + fileId );
190+ datafileSolrDocs .add (dataFileSolrDoc );
200191 }
201192 }
202193 return datafileSolrDocs ;
203194 }
204195
196+ /** Find the versions to index. The overall logic is
197+ * If there is only one version, or no released version (all non-draft versions are deaccessioned)
198+ * then index it regardless of it's versionstate
199+ * If there are released versions
200+ * then index the latest released version and a draft version if one exists
201+ * Hence - the latest deaccessioned version is only indexed if there is no released version
202+ * @param dataset
203+ * @return the set of versions to build cards for
204+ */
205205 private Set <DatasetVersion > datasetVersionsToBuildCardsFor (Dataset dataset ) {
206206 Set <DatasetVersion > datasetVersions = new HashSet <>();
207207 DatasetVersion latest = dataset .getLatestVersion ();
208- if (latest != null ) {
208+ DatasetVersion released = dataset .getReleasedVersion ();
209+ if (latest != null && (released == null || latest .isDraft ())) {
209210 datasetVersions .add (latest );
210211 }
211- DatasetVersion released = dataset .getReleasedVersion ();
212212 if (released != null ) {
213+ //May be the same as the latest version - only one copy will be in the set in that case
213214 datasetVersions .add (released );
214215 }
215216 return datasetVersions ;
@@ -435,17 +436,14 @@ public IndexResponse indexPermissionsOnSelfAndChildren(DvObject definitionPoint)
435436 *
436437 **/
437438 Map <Long , List <String >> fileDownloadersMap = roleAssigneeSvc .findAssigneesWithDownloadPermissionOnDatasetFiles (dataset .getId ());
438- Map <DatasetVersion .VersionState , Boolean > desiredCards = searchPermissionsService .getDesiredCards (dataset );
439439 List <DatasetVersion > versionsToIndex = new ArrayList <>();
440- for (DatasetVersion version : versionsToReIndexPermissionsFor (dataset )) {
441- if (desiredCards .get (version .getVersionState ())) {
442- int fileCount = dataFileService .findCountByDatasetVersionId (version .getId ()).intValue ();
443- if (fileCount >= fileQueryMin ) {
444- // IMPORTANT: This triggers the loading of fileMetadatas within the current transaction
445- version .getFileMetadatas ().size ();
446- }
447- versionsToIndex .add (version );
440+ for (DatasetVersion version : datasetVersionsToBuildCardsFor (dataset )) {
441+ int fileCount = dataFileService .findCountByDatasetVersionId (version .getId ()).intValue ();
442+ if (fileCount >= fileQueryMin ) {
443+ // IMPORTANT: This triggers the loading of fileMetadatas within the current transaction
444+ version .getFileMetadatas ().size ();
448445 }
446+ versionsToIndex .add (version );
449447 }
450448
451449 // Process the dataset's files in a new transaction, passing the pre-loaded data
@@ -471,11 +469,19 @@ public void indexDatasetBatchInNewTransaction(List<Long> datasetIds, final int[]
471469
472470 // Process files for this dataset
473471 Map <Long , List <String >> fileDownloadersMap = roleAssigneeSvc .findAssigneesWithDownloadPermissionOnDatasetFiles (dataset .getId ());
474- List <DatasetVersion > versions = versionsToReIndexPermissionsFor (dataset );
472+ Set <DatasetVersion > versions = datasetVersionsToBuildCardsFor (dataset );
475473 final List <Long > changedFileIds = new ArrayList <>();
476474 if (versions .size ()>1 ) {
477- Long releasedVersionId = versions .get (versions .get (0 ).isReleased () ? 0 : 1 ).getId ();
478- Long draftVersionId = versions .get (versions .get (0 ).isReleased () ? 1 : 0 ).getId ();
475+ Long releasedVersionId = null ;
476+ Long draftVersionId = null ;
477+
478+ for (DatasetVersion version : versions ) {
479+ if (version .isReleased ()) {
480+ releasedVersionId = version .getId ();
481+ } else if (version .isDraft ()) {
482+ draftVersionId = version .getId ();
483+ }
484+ }
479485
480486 populateChangedFileIds (
481487 releasedVersionId ,
@@ -632,18 +638,6 @@ private void reindexFilesInBatches(List<DataFileProxy> filesToReindexAsBatch, Li
632638 }
633639 }
634640
635- private List <DatasetVersion > versionsToReIndexPermissionsFor (Dataset dataset ) {
636- List <DatasetVersion > versionsToReindexPermissionsFor = new ArrayList <>();
637- Map <DatasetVersion .VersionState , Boolean > desiredCards = searchPermissionsService .getDesiredCards (dataset );
638- for (DatasetVersion version : datasetVersionsToBuildCardsFor (dataset )) {
639- boolean cardShouldExist = desiredCards .get (version .getVersionState ());
640- if (cardShouldExist ) {
641- versionsToReindexPermissionsFor .add (version );
642- }
643- }
644- return versionsToReindexPermissionsFor ;
645- }
646-
647641 public IndexResponse deleteMultipleSolrIds (List <String > solrIdsToDelete ) {
648642 if (solrIdsToDelete .isEmpty ()) {
649643 return new IndexResponse ("nothing to delete" );
0 commit comments