Skip to content

Commit

Permalink
Adds Search across all databases
Browse files Browse the repository at this point in the history
  • Loading branch information
006627 committed Sep 26, 2024
1 parent 1bcbf76 commit b0f3c0c
Show file tree
Hide file tree
Showing 12 changed files with 124 additions and 268 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import java.util.Map;
import java.util.Set;

import com.databasepreservation.common.server.index.utils.SolrUtils;
import org.apache.solr.client.solrj.SolrServerException;
import org.roda.core.data.exceptions.GenericException;
import org.roda.core.data.exceptions.NotFoundException;
Expand Down Expand Up @@ -51,6 +50,7 @@
import com.databasepreservation.common.server.ViewerFactory;
import com.databasepreservation.common.server.controller.SIARDController;
import com.databasepreservation.common.server.index.utils.IterableDatabaseResult;
import com.databasepreservation.common.server.index.utils.SolrUtils;
import com.databasepreservation.common.utils.ControllerAssistant;
import com.databasepreservation.common.utils.UserUtility;

Expand Down Expand Up @@ -81,9 +81,9 @@ public IndexResult<ViewerDatabase> find(FindRequest findRequest, String localeSt
fieldsToReturn.add(ViewerConstants.SOLR_DATABASES_METADATA);
fieldsToReturn.add(ViewerConstants.SOLR_DATABASES_PERMISSIONS);

FindRequest request = new FindRequest(findRequest.classToReturn, getDatabaseFilterForUser(user),
FindRequest userFindRequest = new FindRequest(findRequest.classToReturn, getDatabaseFilterForUser(user),
findRequest.sorter, findRequest.sublist, findRequest.facets, findRequest.exportFacets, fieldsToReturn);
return getViewerDatabaseIndexResult(request, fieldsToReturn, controllerAssistant, user, state);
return getViewerDatabaseIndexResult(userFindRequest, fieldsToReturn, controllerAssistant, user, state);
}
} else {
return getViewerDatabaseIndexResult(findRequest, controllerAssistant, user, state);
Expand All @@ -100,19 +100,21 @@ public IndexResult<ViewerDatabase> findAll(FindRequest findRequest, String local
if (ViewerConfiguration.getInstance().getApplicationEnvironment().equals(ViewerConstants.APPLICATION_ENV_SERVER)) {
if (user.isAdmin() || user.isWhiteList()) {

return getAllViewerDatabaseIndexResult(findRequest, controllerAssistant, user, state);
return getCrossViewerDatabaseIndexResult(findRequest, controllerAssistant, user, state);
} else {
List<String> fieldsToReturn = new ArrayList<>();
fieldsToReturn.add(ViewerConstants.INDEX_ID);
fieldsToReturn.add(ViewerConstants.SOLR_DATABASES_STATUS);
fieldsToReturn.add(ViewerConstants.SOLR_DATABASES_METADATA);
fieldsToReturn.add(ViewerConstants.SOLR_DATABASES_PERMISSIONS);

FindRequest request = new FindRequest(findRequest.classToReturn, getDatabaseFilterForUser(user),
findRequest.sorter, findRequest.sublist, findRequest.facets, findRequest.exportFacets, fieldsToReturn);
return getViewerDatabaseIndexResult(request, fieldsToReturn, controllerAssistant, user, state);
FindRequest userFindRequest = new FindRequest(findRequest.classToReturn, getDatabaseFilterForUser(user),
findRequest.sorter, findRequest.sublist, findRequest.facets, findRequest.exportFacets, fieldsToReturn);
return getCrossViewerDatabaseIndexResult(userFindRequest, controllerAssistant, user, state,
getDatabaseFilterForUser(user));
}
} else {
return getViewerDatabaseIndexResult(findRequest, controllerAssistant, user, state);
return getCrossViewerDatabaseIndexResult(findRequest, controllerAssistant, user, state);
}
}

Expand Down Expand Up @@ -153,88 +155,91 @@ private IndexResult<ViewerDatabase> getViewerDatabaseIndexResult(FindRequest fin
}
}

private IndexResult<ViewerDatabase> getAllViewerDatabaseIndexResult(FindRequest findRequest,
private IndexResult<ViewerDatabase> getViewerDatabaseIndexResult(FindRequest findRequest, List<String> fieldsToReturn,
ControllerAssistant controllerAssistant, User user, LogEntryState state) {
long count = 0;
try {
// List databases
Filter availableFilter = new Filter(
new SimpleFilterParameter(ViewerConstants.SOLR_DATABASES_STATUS, ViewerDatabaseStatus.AVAILABLE.name()));
//availableFilter.add(findRequest.filter.getParameters());
final IndexResult<ViewerDatabase> result = ViewerFactory.getSolrManager().find(ViewerDatabase.class,
findRequest.filter, findRequest.sorter, findRequest.sublist, findRequest.facets, fieldsToReturn);
count = result.getTotalCount();
return result;
} catch (GenericException | RequestNotValidException e) {
state = LogEntryState.FAILURE;
throw new RESTException(e);
} finally {
// register action
controllerAssistant.registerAction(user, state, ViewerConstants.CONTROLLER_FILTER_PARAM,
JsonUtils.getJsonFromObject(findRequest.filter), ViewerConstants.CONTROLLER_SUBLIST_PARAM,
JsonUtils.getJsonFromObject(findRequest.sublist), ViewerConstants.CONTROLLER_RETRIEVE_COUNT, count);
}
}

private IndexResult<ViewerDatabase> getCrossViewerDatabaseIndexResult(FindRequest findRequest,
ControllerAssistant controllerAssistant, User user, LogEntryState state) {
return getCrossViewerDatabaseIndexResult(findRequest, controllerAssistant, user, state, new Filter());
}

private IndexResult<ViewerDatabase> getCrossViewerDatabaseIndexResult(FindRequest findRequest,
ControllerAssistant controllerAssistant, User user, LogEntryState state, Filter userFilter) {
long count = 0;
try {
IterableDatabaseResult<ViewerDatabase> databases = ViewerFactory.getSolrManager().findAll(ViewerDatabase.class,
availableFilter, Sorter.NONE, findRequest.fieldsToReturn);
userFilter, Sorter.NONE, findRequest.fieldsToReturn);

if (databases.getTotalCount() == 0) {
final IndexResult<ViewerDatabase> result = ViewerFactory.getSolrManager().find(ViewerDatabase.class,
findRequest.filter, findRequest.sorter, findRequest.sublist, findRequest.facets, findRequest.fieldsToReturn);
count = result.getTotalCount();
return result;
return new IndexResult<>();
}

// Search on all collections
List<String> collections = new ArrayList<>();
Map<String, ViewerDatabase> databaseMap = new HashMap<>();
for (ViewerDatabase database : databases) {
String collectionName = ViewerConstants.SOLR_INDEX_ROW_COLLECTION_NAME_PREFIX + database.getUuid();
collections.add(collectionName);
databaseMap.put(database.getUuid(), database);
// only add the available collections
if(database.getStatus().equals(ViewerDatabaseStatus.AVAILABLE)){
String collectionName = ViewerConstants.SOLR_INDEX_ROW_COLLECTION_NAME_PREFIX + database.getUuid();
collections.add(collectionName);
}
}

String collectionAlias = SolrUtils.crateSearchAllAlias(ViewerFactory.getSolrClient(), "alias-" + user.getUUID(),
collections);

SimpleFacetParameter simpleFacetParameter = new SimpleFacetParameter(ViewerConstants.SOLR_ROWS_DATABASE_UUID,
FacetParameter.SORT.COUNT);
simpleFacetParameter.setMinCount(1);
simpleFacetParameter.setLimit(15);
// set offset 0
Facets facets = new Facets(simpleFacetParameter);

String collectionAlias = SolrUtils.crateSearchAllAlias(ViewerFactory.getSolrClient(), "aliase-" + user.getUUID(), collections);
simpleFacetParameter.setLimit(findRequest.sublist.getMaximumElementCount());
simpleFacetParameter.setOffset(findRequest.sublist.getFirstElementIndex());

final IndexResult<ViewerDatabase> facetsSearch = ViewerFactory.getSolrManager().findHits(ViewerDatabase.class,
collectionAlias, findRequest.filter, findRequest.sorter, findRequest.sublist, new Facets(simpleFacetParameter));
count = facetsSearch.getTotalCount();
FacetFieldResult facetResults = facetsSearch.getFacetResults().get(0);

final IndexResult<ViewerDatabase> hits = ViewerFactory.getSolrManager().findHits(ViewerDatabase.class, collectionAlias,
findRequest.filter, findRequest.sorter, findRequest.sublist, facets);
count = hits.getTotalCount();

IndexResult<ViewerDatabase> result2 = new IndexResult<>();
result2.setTotalCount(-1);
result2.setLimit(100);
result2.setOffset(findRequest.sublist.getFirstElementIndex());
IndexResult<ViewerDatabase> searchHitsResult = new IndexResult<>();
if(facetResults.getValues().size() < findRequest.sublist.getMaximumElementCount() && findRequest.sublist.getFirstElementIndex() == 0) {
searchHitsResult.setTotalCount(facetResults.getValues().size());
} else {
searchHitsResult.setTotalCount(-1);
}
searchHitsResult.setLimit(findRequest.sublist.getMaximumElementCount());
searchHitsResult.setOffset(findRequest.sublist.getFirstElementIndex());
List<ViewerDatabase> resultsFromFacet = new ArrayList<>();
result2.setResults(resultsFromFacet);
// Retrieve the databases HITs

for (FacetFieldResult facetResult : hits.getFacetResults()) {
for (FacetValue value : facetResult.getValues()) {
String databaseUUID = value.getValue();
long searchHits = value.getCount();
// Retrieve the databases HITs
for (FacetValue value : facetResults.getValues()) {
String databaseUUID = value.getValue();
long searchHits = value.getCount();

ViewerDatabase vd = databaseMap.get(databaseUUID);
vd.setSearchHits(searchHits);
resultsFromFacet.add(vd);
}
ViewerDatabase vd = databaseMap.get(databaseUUID);
vd.setSearchHits(searchHits);
resultsFromFacet.add(vd);
}
return result2;

} catch (GenericException | RequestNotValidException | SolrServerException | IOException e) {
state = LogEntryState.FAILURE;
throw new RESTException(e);
} finally {
// register action
controllerAssistant.registerAction(user, state, ViewerConstants.CONTROLLER_FILTER_PARAM,
JsonUtils.getJsonFromObject(findRequest.filter), ViewerConstants.CONTROLLER_SUBLIST_PARAM,
JsonUtils.getJsonFromObject(findRequest.sublist), ViewerConstants.CONTROLLER_RETRIEVE_COUNT, count);
}
}
searchHitsResult.setResults(resultsFromFacet);
return searchHitsResult;

private IndexResult<ViewerDatabase> getViewerDatabaseIndexResult(FindRequest findRequest, List<String> fieldsToReturn,
ControllerAssistant controllerAssistant, User user, LogEntryState state) {
long count = 0;
try {
final IndexResult<ViewerDatabase> result = ViewerFactory.getSolrManager().find(ViewerDatabase.class,
findRequest.filter, findRequest.sorter, findRequest.sublist, findRequest.facets, fieldsToReturn);
count = result.getTotalCount();
return result;
} catch (GenericException | RequestNotValidException e) {
} catch (GenericException | RequestNotValidException | SolrServerException | IOException e) {
state = LogEntryState.FAILURE;
throw new RESTException(e);
} finally {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import org.fusesource.restygwt.client.MethodCallback;
import org.roda.core.data.v2.index.sublist.Sublist;

import com.databasepreservation.common.client.ClientLogger;
import com.databasepreservation.common.client.ViewerConstants;
import com.databasepreservation.common.client.common.DefaultAsyncCallback;
import com.databasepreservation.common.client.common.UserLogin;
Expand All @@ -32,7 +31,6 @@
import com.databasepreservation.common.client.models.structure.ViewerDatabase;
import com.databasepreservation.common.client.models.user.User;
import com.databasepreservation.common.client.services.DatabaseService;
import com.databasepreservation.common.client.tools.HistoryManager;
import com.databasepreservation.common.client.tools.Humanize;
import com.databasepreservation.common.client.tools.PathUtils;
import com.databasepreservation.common.client.tools.RestUtils;
Expand All @@ -56,18 +54,13 @@
*/
public class CrossDatabaseList extends BasicAsyncTableCell<ViewerDatabase> {
private static final ClientMessages messages = GWT.create(ClientMessages.class);
private final ClientLogger logger = new ClientLogger(getClass().getName());

private static final String OPEN_VALIDATED_SPAN = "<span>&#10004;</span>";
private static final String OPEN_NOT_VALIDATED_SPAN = "<span>&#10006;</span>";

public CrossDatabaseList() {
this(new Filter(), null, null, false, false);
}

private CrossDatabaseList(Filter filter, Facets facets, String summary, boolean selectable, boolean exportable) {
public CrossDatabaseList(Filter filter, Facets facets, String summary, boolean selectable, boolean exportable) {
super(filter, facets, summary, selectable, exportable, 15, 15);
autoUpdate(10000);
}

@Override
Expand Down Expand Up @@ -163,14 +156,6 @@ public SafeHtml getValue(ViewerDatabase database) {
}
};

Column<ViewerDatabase, String> openColumn = new ButtonColumn<ViewerDatabase>() {
@Override
public String getValue(ViewerDatabase object) {
return messages.basicActionOpen();
}
};
openColumn.setFieldUpdater((index, object, value) -> HistoryManager.gotoSIARDInfo(object.getUuid()));

Column<ViewerDatabase, String> searchHitsColumn = new ButtonColumn<ViewerDatabase>() {
@Override
public String getValue(ViewerDatabase database) {
Expand All @@ -194,7 +179,7 @@ public void onSuccess(User user) {
5);
addColumn(statusColumn, messages.managePageTableHeaderTextForDatabaseStatus(), true, TextAlign.NONE, 5);
}
addColumn(searchHitsColumn, "Hits", true, TextAlign.NONE, 5);
addColumn(searchHitsColumn, messages.managePageTableHeaderTextForSearchHits(), true, TextAlign.NONE, 5);
}
});
} else {
Expand All @@ -208,8 +193,7 @@ public void onSuccess(User user) {
addColumn(versionColumn, messages.managePageTableHeaderTextForSIARDVersion(), true, TextAlign.NONE, 4);
addColumn(validColumn, messages.managePageTableHeaderTextForSIARDValidationStatus(), true, TextAlign.NONE, 5);
addColumn(statusColumn, messages.managePageTableHeaderTextForDatabaseStatus(), true, TextAlign.NONE, 5);
addColumn(openColumn, messages.managePageTableHeaderTextForActions(), true, TextAlign.NONE, 5);
addColumn(searchHitsColumn, messages.managePageTableHeaderTextForActions(), true, TextAlign.NONE, 5);
addColumn(searchHitsColumn, messages.managePageTableHeaderTextForSearchHits(), true, TextAlign.NONE, 5);
}

Alert alert = new Alert(Alert.MessageAlertType.LIGHT, messages.noItemsToDisplay());
Expand Down Expand Up @@ -237,6 +221,6 @@ public void exportClickHandler() {
@Override
protected void onAttach() {
super.onAttach();
refresh();
// refresh();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public void onSuccess(Method method, IndexResult<T> result) {
updateRowData((int) result.getOffset(), result.getResults());

if(rowCount == -1){
updateRowCount(result.getResults().size(), false);
updateRowCount(Integer.MAX_VALUE, false);
} else {
updateRowCount(rowCount, true);
}
Expand Down
Loading

0 comments on commit b0f3c0c

Please sign in to comment.