From 0de9a2b822bc140be937714d2de89b3effceb867 Mon Sep 17 00:00:00 2001 From: Ivan Bella Date: Wed, 20 Dec 2023 12:09:14 -0500 Subject: [PATCH] Updated to fill out the query parameters prior to creating Query object (#2202) * Updated to fill out the query parameters prior to creating Query object * Added test case --- .../webservice/query/util/LookupUUIDUtil.java | 30 +++++--- .../query/util/LookupUUIDUtilTest.java | 70 +++++++++++++++++++ 2 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 web-services/query/src/test/java/datawave/webservice/query/util/LookupUUIDUtilTest.java diff --git a/web-services/query/src/main/java/datawave/webservice/query/util/LookupUUIDUtil.java b/web-services/query/src/main/java/datawave/webservice/query/util/LookupUUIDUtil.java index 12cd6c5c620..1c0584f3e2f 100644 --- a/web-services/query/src/main/java/datawave/webservice/query/util/LookupUUIDUtil.java +++ b/web-services/query/src/main/java/datawave/webservice/query/util/LookupUUIDUtil.java @@ -27,6 +27,7 @@ import datawave.webservice.common.exception.DatawaveWebApplicationException; import datawave.webservice.common.exception.NoResultsException; import datawave.webservice.query.Query; +import datawave.webservice.query.QueryImpl; import datawave.webservice.query.QueryParameters; import datawave.webservice.query.QueryParametersImpl; import datawave.webservice.query.QueryPersistence; @@ -427,20 +428,33 @@ public T createUUIDQueryAndNext(final AbstractUUIDLookupCriteria unvalidated return response; } - private Query createSettings(MultivaluedMap queryParameters) { + public Query createSettings(MultivaluedMap queryParameters) { + log.debug("Initial query parameters: " + queryParameters); Query query = responseObjectFactory.getQueryImpl(); if (queryParameters != null) { - query.setOptionalQueryParameters(queryParameters); - for (String key : queryParameters.keySet()) { - if (queryParameters.get(key).size() == 1) { - query.addParameter(key, queryParameters.get(key).get(0)); + MultivaluedMap expandedQueryParameters = new MultivaluedMapImpl<>(); + if (defaultOptionalParams != null) { + expandedQueryParameters.putAll(defaultOptionalParams); + } + String delimitedParams = queryParameters.getFirst(QueryParameters.QUERY_PARAMS); + if (delimitedParams != null) { + for (QueryImpl.Parameter pm : QueryUtil.parseParameters(delimitedParams)) { + expandedQueryParameters.putSingle(pm.getParameterName(), pm.getParameterValue()); + } + } + expandedQueryParameters.putAll(queryParameters); + log.debug("Final query parameters: " + expandedQueryParameters); + query.setOptionalQueryParameters(expandedQueryParameters); + for (String key : expandedQueryParameters.keySet()) { + if (expandedQueryParameters.get(key).size() == 1) { + query.addParameter(key, expandedQueryParameters.getFirst(key)); } } } return query; } - private String getAuths(String logicName, MultivaluedMap queryParameters, String queryAuths, Principal principal) { + public String getAuths(String logicName, MultivaluedMap queryParameters, String queryAuths, Principal principal) { String userAuths; try { QueryLogic logic = queryLogicFactory.getQueryLogic(logicName, principal); @@ -601,7 +615,6 @@ private T lookupContentByEvents(final AbstractUUIDLookupCriteria criteria, f String sid = principal.getName(); // Initialize the reusable query input - final String userAuths = getAuths(CONTENT_QUERY, criteria.getQueryParameters(), null, principal); final String queryName = sid + '-' + UUID.randomUUID(); final Date endDate = new Date(); final Date expireDate = new Date(endDate.getTime() + 1000 * 60 * 60); @@ -616,7 +629,8 @@ private T lookupContentByEvents(final AbstractUUIDLookupCriteria criteria, f } else { validatedCriteria = criteria; } - + final String userAuths = getAuths(CONTENT_QUERY, validatedCriteria.getQueryParameters(), null, principal); + // Perform the lookup boolean allEventMockResponse = (uuidQueryResponse instanceof AllEventMockResponse); try { diff --git a/web-services/query/src/test/java/datawave/webservice/query/util/LookupUUIDUtilTest.java b/web-services/query/src/test/java/datawave/webservice/query/util/LookupUUIDUtilTest.java new file mode 100644 index 00000000000..ec65ded4a7d --- /dev/null +++ b/web-services/query/src/test/java/datawave/webservice/query/util/LookupUUIDUtilTest.java @@ -0,0 +1,70 @@ +package datawave.webservice.query.util; + +import datawave.query.data.UUIDType; +import datawave.security.authorization.UserOperations; +import datawave.webservice.query.Query; +import datawave.webservice.query.QueryImpl; +import datawave.webservice.query.configuration.LookupUUIDConfiguration; +import datawave.webservice.query.logic.QueryLogicFactory; +import datawave.webservice.query.result.event.ResponseObjectFactory; +import datawave.webservice.query.runner.QueryExecutor; +import org.jboss.resteasy.specimpl.MultivaluedMapImpl; +import org.jboss.resteasy.util.FindAnnotation; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.easymock.annotation.Mock; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import javax.ejb.EJBContext; +import javax.ws.rs.core.MultivaluedMap; +import java.util.Collections; + +import static junit.framework.TestCase.assertEquals; +import static org.easymock.EasyMock.expect; +import static org.powermock.api.easymock.PowerMock.replayAll; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(FindAnnotation.class) +public class LookupUUIDUtilTest { + + @Mock + LookupUUIDConfiguration configuration; + @Mock + QueryExecutor queryExecutor; + @Mock + EJBContext context; + @Mock + ResponseObjectFactory responseObjectFactory; + @Mock + QueryLogicFactory queryLogicFactory; + @Mock + UserOperations userOperations; + + @Test + public void testCreateSettings() { + expect(configuration.getUuidTypes()).andReturn(Collections.singletonList(new UUIDType("ID", "LuceneUUIDEventQuery", 28))); + expect(configuration.getBeginDate()).andReturn("20230101"); + expect(configuration.getBatchLookupUpperLimit()).andReturn(10); + MultivaluedMap defaultParams = new MultivaluedMapImpl<>(); + defaultParams.putSingle("foo", "bar"); + defaultParams.putSingle("foo2", "default"); + expect(configuration.optionalParamsToMap()).andReturn(defaultParams); + expect(responseObjectFactory.getQueryImpl()).andReturn(new QueryImpl()); + replayAll(); + LookupUUIDUtil utils = new LookupUUIDUtil(configuration, queryExecutor, context, responseObjectFactory, queryLogicFactory, userOperations); + + MultivaluedMap properties = new MultivaluedMapImpl<>(); + properties.putSingle("foo2", "bar2"); + properties.add("foo3", "bar3"); + properties.add("foo3", "bar3.1"); + Query q = utils.createSettings(properties); + + assertEquals(new QueryImpl.Parameter("foo", "bar"), q.findParameter("foo")); + assertEquals(new QueryImpl.Parameter("foo2", "bar2"), q.findParameter("foo2")); + assertEquals(new QueryImpl.Parameter("foo3", ""), q.findParameter("foo3")); + assertEquals(3, q.getOptionalQueryParameters().size()); + properties.putSingle("foo", "bar"); + assertEquals(properties, q.getOptionalQueryParameters()); + } +}