22
33import edu .harvard .iq .dataverse .*;
44import edu .harvard .iq .dataverse .api .auth .AuthRequired ;
5+ import edu .harvard .iq .dataverse .engine .command .DataverseRequest ;
56import edu .harvard .iq .dataverse .search .SearchFields ;
67import edu .harvard .iq .dataverse .search .FacetCategory ;
78import edu .harvard .iq .dataverse .search .FacetLabel ;
1718import edu .harvard .iq .dataverse .search .SortBy ;
1819import edu .harvard .iq .dataverse .settings .SettingsServiceBean ;
1920import java .io .IOException ;
20- import java .util .ArrayList ;
21- import java .util .Arrays ;
22- import java .util .List ;
23- import java .util .Map ;
21+ import java .util .*;
2422import java .util .logging .Logger ;
2523import jakarta .ejb .EJB ;
2624import jakarta .inject .Inject ;
@@ -92,9 +90,50 @@ public Response search(
9290 String geoPoint ;
9391 String geoRadius ;
9492 List <Dataverse > dataverseSubtrees = new ArrayList <>();
93+ DataverseRequest requestUser = createDataverseRequest (user );
94+ String allTypes = ":(" + SearchConstants .DATAVERSES + " OR " + SearchConstants .DATASETS + " OR " + SearchConstants .FILES + ")" ;
95+ Map <String , Long > objectTypeCountsMap = new HashMap <>(3 );
96+ objectTypeCountsMap .put (SearchConstants .UI_DATAVERSES , 0L );
97+ objectTypeCountsMap .put (SearchConstants .UI_DATASETS , 0L );
98+ objectTypeCountsMap .put (SearchConstants .UI_FILES , 0L );
99+
100+ // users can't change these (yet anyway)
101+ boolean dataRelatedToMe = showMyData ; //getDataRelatedToMe();
95102
96103 try {
104+ // we have to add "" (root) otherwise there is no permissions check
105+ if (subtrees .isEmpty ()) {
106+ dataverseSubtrees .add (getSubtree ("" ));
107+ }
108+ else {
109+ for (String subtree : subtrees ) {
110+ dataverseSubtrees .add (getSubtree (subtree ));
111+ }
112+ }
113+ filterQueries .add (getFilterQueryFromSubtrees (dataverseSubtrees ));
114+
97115 if (!types .isEmpty ()) {
116+ // Query to get the totals if needed.
117+ // Only needed if the list of types doesn't include all types since missing types will default to count of 0
118+ // Only get the totals for the first page (paginationStart == 0) for speed
119+ if (showTypeCounts && types .size () < objectTypeCountsMap .size () && paginationStart == 0 ) {
120+ List <String > totalFilterQueries = new ArrayList <>();
121+ totalFilterQueries .addAll (filterQueries );
122+ totalFilterQueries .add (SearchFields .TYPE + allTypes );
123+ try {
124+ SolrQueryResponse resp = searchService .search (requestUser , dataverseSubtrees , query , totalFilterQueries , null , null , 0 ,
125+ dataRelatedToMe , 1 , false , null , null , false , false );
126+ if (resp != null ) {
127+ for (FacetCategory facetCategory : resp .getTypeFacetCategories ()) {
128+ for (FacetLabel facetLabel : facetCategory .getFacetLabel ()) {
129+ objectTypeCountsMap .put (facetLabel .getName (), facetLabel .getCount ());
130+ }
131+ }
132+ }
133+ } catch (Exception e ) {
134+ logger .info ("Search getting total counts: " + e .getMessage ());
135+ }
136+ }
98137 filterQueries .add (getFilterQueryFromTypes (types ));
99138 } else {
100139 /**
@@ -103,22 +142,11 @@ public Response search(
103142 * SearchServiceBean tries to get SearchFields.TYPE. The GUI
104143 * always seems to add SearchFields.TYPE, even for superusers.
105144 */
106- filterQueries .add (SearchFields .TYPE + ":(" + SearchConstants . DATAVERSES + " OR " + SearchConstants . DATASETS + " OR " + SearchConstants . FILES + ")" );
145+ filterQueries .add (SearchFields .TYPE + allTypes );
107146 }
108147 sortBy = SearchUtil .getSortBy (sortField , sortOrder );
109148 numResultsPerPage = getNumberOfResultsPerPage (numResultsPerPageRequested );
110149
111- // we have to add "" (root) otherwise there is no permissions check
112- if (subtrees .isEmpty ()) {
113- dataverseSubtrees .add (getSubtree ("" ));
114- }
115- else {
116- for (String subtree : subtrees ) {
117- dataverseSubtrees .add (getSubtree (subtree ));
118- }
119- }
120- filterQueries .add (getFilterQueryFromSubtrees (dataverseSubtrees ));
121-
122150 if (filterQueries .isEmpty ()) { //Extra sanity check just in case someone else touches this
123151 throw new IOException ("Filter is empty, which should never happen, as this allows unfettered searching of our index" );
124152 }
@@ -137,13 +165,10 @@ public Response search(
137165 } catch (Exception ex ) {
138166 return error (Response .Status .BAD_REQUEST , ex .getLocalizedMessage ());
139167 }
140-
141- // users can't change these (yet anyway)
142- boolean dataRelatedToMe = showMyData ; //getDataRelatedToMe();
143168
144169 SolrQueryResponse solrQueryResponse ;
145170 try {
146- solrQueryResponse = searchService .search (createDataverseRequest ( user ) ,
171+ solrQueryResponse = searchService .search (requestUser ,
147172 dataverseSubtrees ,
148173 query ,
149174 filterQueries ,
@@ -211,50 +236,17 @@ public Response search(
211236 }
212237
213238 value .add ("count_in_response" , solrSearchResults .size ());
214-
215- // we want to show the missing dvobject types with count = 0
216- // per https://github.com/IQSS/dataverse/issues/11127
217239
218240 if (showTypeCounts ) {
219- JsonObjectBuilder objectTypeCounts = Json .createObjectBuilder ();
220- if (!solrQueryResponse .getTypeFacetCategories ().isEmpty ()) {
221- boolean filesMissing = true ;
222- boolean datasetsMissing = true ;
223- boolean dataversesMissing = true ;
224- for (FacetCategory facetCategory : solrQueryResponse .getTypeFacetCategories ()) {
225- for (FacetLabel facetLabel : facetCategory .getFacetLabel ()) {
226- objectTypeCounts .add (facetLabel .getName (), facetLabel .getCount ());
227- if (facetLabel .getName ().equals ((SearchConstants .UI_DATAVERSES ))) {
228- dataversesMissing = false ;
229- }
230- if (facetLabel .getName ().equals ((SearchConstants .UI_DATASETS ))) {
231- datasetsMissing = false ;
232- }
233- if (facetLabel .getName ().equals ((SearchConstants .UI_FILES ))) {
234- filesMissing = false ;
235- }
236- }
237- }
238-
239- if (solrQueryResponse .getTypeFacetCategories ().size () < 3 ) {
240- if (dataversesMissing ) {
241- objectTypeCounts .add (SearchConstants .UI_DATAVERSES , 0 );
242- }
243- if (datasetsMissing ) {
244- objectTypeCounts .add (SearchConstants .UI_DATASETS , 0 );
245- }
246- if (filesMissing ) {
247- objectTypeCounts .add (SearchConstants .UI_FILES , 0 );
241+ for (FacetCategory facetCategory : solrQueryResponse .getTypeFacetCategories ()) {
242+ for (FacetLabel facetLabel : facetCategory .getFacetLabel ()) {
243+ if (facetLabel .getCount () > 0 ) {
244+ objectTypeCountsMap .put (facetLabel .getName (), facetLabel .getCount ());
248245 }
249246 }
250-
251- }
252- if (showTypeCounts && solrQueryResponse .getTypeFacetCategories ().isEmpty ()) {
253- objectTypeCounts .add (SearchConstants .UI_DATAVERSES , 0 );
254- objectTypeCounts .add (SearchConstants .UI_DATASETS , 0 );
255- objectTypeCounts .add (SearchConstants .UI_FILES , 0 );
256247 }
257-
248+ JsonObjectBuilder objectTypeCounts = Json .createObjectBuilder ();
249+ objectTypeCountsMap .forEach ((k ,v ) -> objectTypeCounts .add (k ,v ));
258250 value .add ("total_count_per_object_type" , objectTypeCounts );
259251 }
260252 /**
0 commit comments