cpoerschke commented on code in PR #2348: URL: https://github.com/apache/solr/pull/2348#discussion_r1534377191
########## solr/modules/ltr/src/test/org/apache/solr/ltr/TestLTRQParserPlugin.java: ########## @@ -137,4 +140,92 @@ public void ltrNoResultsTest() throws Exception { query.add("rq", "{!ltr reRankDocs=3 model=6029760550880411648}"); assertJQ("/query" + query.toQueryString(), "/response/numFound/==0"); } + + @Test + public void ltr_expensiveFeatureRescoring_shouldTimeOutAndReturnPartialResults() + throws Exception { + /* One SolrFeature is defined: {!func}sleep(1000,999) + * It simulates a slow feature extraction, sleeping for 1000ms and returning 999 as a score when finished + * */ + + final String solrQuery = "_query_:{!edismax qf='id' v='8^=10 9^=5 7^=3 6^=1'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFields("*", "score"); + query.setRows(4); + query.setTimeAllowed(300); + query.add("fv", "true"); + query.add("rq", "{!ltr model=slowModel reRankDocs=3}"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound/==4", + "/responseHeader/partialResults/==true", + "/responseHeader/partialResultsDetails/=='Limits exceeded! (Learning To Rank rescoring - " + + "The full reranking didn\\'t complete. " + + "If partial results are tolerated the reranking got reverted and " + + "all documents preserved their original score and ranking.)" + + ": Query limits: [TimeAllowedLimit:LIMIT EXCEEDED]'", + "/response/docs/[0]/id=='8'", + "/response/docs/[0]/score==10.0", + "/response/docs/[1]/id=='9'", + "/response/docs/[1]/score==5.0", + "/response/docs/[2]/id=='7'", + "/response/docs/[2]/score==3.0", + "/response/docs/[3]/id=='6'", + "/response/docs/[3]/score==1.0"); + } + + @Test + public void ltr_expensiveFeatureRescoringAndPartialResultsNotTolerated_shouldRaiseException() + throws Exception { + /* One SolrFeature is defined: {!func}sleep(1000,999) + * It simulates a slow feature extraction, sleeping for 1000ms and returning 999 as a score when finished + * */ + final String solrQuery = "_query_:{!edismax qf='id' v='8^=10 9^=5 7^=3 6^=1'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFields("*", "score"); + query.setRows(4); + query.setTimeAllowed(300); + query.add("partialResults", "false"); + query.add("fv", "true"); + query.add("rq", "{!ltr model=slowModel reRankDocs=3}"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='org.apache.solr.search.QueryLimitsExceededException: Limits exceeded! (Learning To Rank rescoring - " + + "The full reranking didn\\'t complete. " + + "If partial results are tolerated the reranking got reverted and all documents preserved their original score and ranking.)" + + ": Query limits: [TimeAllowedLimit:LIMIT EXCEEDED]'"); + } + + @Test + public void ltr_expensiveFeatureRescoringWithinTimeAllowed_shouldReturnRerankedResults() + throws Exception { + /* One SolrFeature is defined: {!func}sleep(1000,999) + * It simulates a slow feature extraction, sleeping for 1000ms and returning 999 as a score when finished + * */ + + final String solrQuery = "_query_:{!edismax qf='id' v='8^=10 9^=5 7^=3 6^=1'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFields("*", "score"); Review Comment: ```suggestion query.setFields("id", "score"); ``` ########## solr/modules/ltr/src/test/org/apache/solr/ltr/TestLTRQParserPlugin.java: ########## @@ -137,4 +140,92 @@ public void ltrNoResultsTest() throws Exception { query.add("rq", "{!ltr reRankDocs=3 model=6029760550880411648}"); assertJQ("/query" + query.toQueryString(), "/response/numFound/==0"); } + + @Test + public void ltr_expensiveFeatureRescoring_shouldTimeOutAndReturnPartialResults() + throws Exception { + /* One SolrFeature is defined: {!func}sleep(1000,999) + * It simulates a slow feature extraction, sleeping for 1000ms and returning 999 as a score when finished + * */ + + final String solrQuery = "_query_:{!edismax qf='id' v='8^=10 9^=5 7^=3 6^=1'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFields("*", "score"); Review Comment: ```suggestion query.setFields("id", "score"); ``` ########## solr/modules/ltr/src/test/org/apache/solr/ltr/TestLTRQParserPlugin.java: ########## @@ -137,4 +140,92 @@ public void ltrNoResultsTest() throws Exception { query.add("rq", "{!ltr reRankDocs=3 model=6029760550880411648}"); assertJQ("/query" + query.toQueryString(), "/response/numFound/==0"); } + + @Test + public void ltr_expensiveFeatureRescoring_shouldTimeOutAndReturnPartialResults() + throws Exception { + /* One SolrFeature is defined: {!func}sleep(1000,999) + * It simulates a slow feature extraction, sleeping for 1000ms and returning 999 as a score when finished + * */ + + final String solrQuery = "_query_:{!edismax qf='id' v='8^=10 9^=5 7^=3 6^=1'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFields("*", "score"); + query.setRows(4); + query.setTimeAllowed(300); + query.add("fv", "true"); + query.add("rq", "{!ltr model=slowModel reRankDocs=3}"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound/==4", + "/responseHeader/partialResults/==true", + "/responseHeader/partialResultsDetails/=='Limits exceeded! (Learning To Rank rescoring - " + + "The full reranking didn\\'t complete. " + + "If partial results are tolerated the reranking got reverted and " + + "all documents preserved their original score and ranking.)" + + ": Query limits: [TimeAllowedLimit:LIMIT EXCEEDED]'", + "/response/docs/[0]/id=='8'", + "/response/docs/[0]/score==10.0", + "/response/docs/[1]/id=='9'", + "/response/docs/[1]/score==5.0", + "/response/docs/[2]/id=='7'", + "/response/docs/[2]/score==3.0", + "/response/docs/[3]/id=='6'", + "/response/docs/[3]/score==1.0"); + } + + @Test + public void ltr_expensiveFeatureRescoringAndPartialResultsNotTolerated_shouldRaiseException() + throws Exception { + /* One SolrFeature is defined: {!func}sleep(1000,999) + * It simulates a slow feature extraction, sleeping for 1000ms and returning 999 as a score when finished + * */ + final String solrQuery = "_query_:{!edismax qf='id' v='8^=10 9^=5 7^=3 6^=1'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFields("*", "score"); + query.setRows(4); + query.setTimeAllowed(300); + query.add("partialResults", "false"); + query.add("fv", "true"); + query.add("rq", "{!ltr model=slowModel reRankDocs=3}"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='org.apache.solr.search.QueryLimitsExceededException: Limits exceeded! (Learning To Rank rescoring - " + + "The full reranking didn\\'t complete. " + + "If partial results are tolerated the reranking got reverted and all documents preserved their original score and ranking.)" + + ": Query limits: [TimeAllowedLimit:LIMIT EXCEEDED]'"); + } + + @Test + public void ltr_expensiveFeatureRescoringWithinTimeAllowed_shouldReturnRerankedResults() + throws Exception { + /* One SolrFeature is defined: {!func}sleep(1000,999) + * It simulates a slow feature extraction, sleeping for 1000ms and returning 999 as a score when finished + * */ + + final String solrQuery = "_query_:{!edismax qf='id' v='8^=10 9^=5 7^=3 6^=1'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFields("*", "score"); + query.setRows(4); + query.setTimeAllowed(5000); + query.add("fv", "true"); Review Comment: Maybe we could also test that `fv` is correctly returned here (and not in the time-ran-out case)? ########## solr/modules/ltr/src/test/org/apache/solr/ltr/TestLTRQParserPlugin.java: ########## @@ -137,4 +140,92 @@ public void ltrNoResultsTest() throws Exception { query.add("rq", "{!ltr reRankDocs=3 model=6029760550880411648}"); assertJQ("/query" + query.toQueryString(), "/response/numFound/==0"); } + + @Test + public void ltr_expensiveFeatureRescoring_shouldTimeOutAndReturnPartialResults() + throws Exception { + /* One SolrFeature is defined: {!func}sleep(1000,999) + * It simulates a slow feature extraction, sleeping for 1000ms and returning 999 as a score when finished + * */ + + final String solrQuery = "_query_:{!edismax qf='id' v='8^=10 9^=5 7^=3 6^=1'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFields("*", "score"); + query.setRows(4); + query.setTimeAllowed(300); + query.add("fv", "true"); + query.add("rq", "{!ltr model=slowModel reRankDocs=3}"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound/==4", + "/responseHeader/partialResults/==true", + "/responseHeader/partialResultsDetails/=='Limits exceeded! (Learning To Rank rescoring - " + + "The full reranking didn\\'t complete. " + + "If partial results are tolerated the reranking got reverted and " + + "all documents preserved their original score and ranking.)" + + ": Query limits: [TimeAllowedLimit:LIMIT EXCEEDED]'", + "/response/docs/[0]/id=='8'", + "/response/docs/[0]/score==10.0", + "/response/docs/[1]/id=='9'", + "/response/docs/[1]/score==5.0", + "/response/docs/[2]/id=='7'", + "/response/docs/[2]/score==3.0", + "/response/docs/[3]/id=='6'", + "/response/docs/[3]/score==1.0"); + } + + @Test + public void ltr_expensiveFeatureRescoringAndPartialResultsNotTolerated_shouldRaiseException() + throws Exception { + /* One SolrFeature is defined: {!func}sleep(1000,999) + * It simulates a slow feature extraction, sleeping for 1000ms and returning 999 as a score when finished + * */ + final String solrQuery = "_query_:{!edismax qf='id' v='8^=10 9^=5 7^=3 6^=1'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFields("*", "score"); + query.setRows(4); + query.setTimeAllowed(300); + query.add("partialResults", "false"); + query.add("fv", "true"); + query.add("rq", "{!ltr model=slowModel reRankDocs=3}"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='org.apache.solr.search.QueryLimitsExceededException: Limits exceeded! (Learning To Rank rescoring - " + + "The full reranking didn\\'t complete. " + + "If partial results are tolerated the reranking got reverted and all documents preserved their original score and ranking.)" + + ": Query limits: [TimeAllowedLimit:LIMIT EXCEEDED]'"); + } + + @Test + public void ltr_expensiveFeatureRescoringWithinTimeAllowed_shouldReturnRerankedResults() + throws Exception { + /* One SolrFeature is defined: {!func}sleep(1000,999) + * It simulates a slow feature extraction, sleeping for 1000ms and returning 999 as a score when finished + * */ + + final String solrQuery = "_query_:{!edismax qf='id' v='8^=10 9^=5 7^=3 6^=1'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFields("*", "score"); + query.setRows(4); + query.setTimeAllowed(5000); + query.add("fv", "true"); + query.add("rq", "{!ltr model=slowModel reRankDocs=3}"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound/==4", + "/response/docs/[0]/id=='7'", + "/response/docs/[0]/score==999.0", + "/response/docs/[1]/id=='8'", + "/response/docs/[1]/score==999.0", + "/response/docs/[2]/id=='9'", + "/response/docs/[2]/score==999.0", + "/response/docs/[3]/id=='6'", Review Comment: ```suggestion "/response/docs/[3]/id=='6'", // original score for the 4th document due to reRankDocs=3 limit ``` ########## solr/modules/ltr/src/test/org/apache/solr/ltr/TestLTRQParserPlugin.java: ########## @@ -137,4 +140,92 @@ public void ltrNoResultsTest() throws Exception { query.add("rq", "{!ltr reRankDocs=3 model=6029760550880411648}"); assertJQ("/query" + query.toQueryString(), "/response/numFound/==0"); } + + @Test + public void ltr_expensiveFeatureRescoring_shouldTimeOutAndReturnPartialResults() + throws Exception { + /* One SolrFeature is defined: {!func}sleep(1000,999) + * It simulates a slow feature extraction, sleeping for 1000ms and returning 999 as a score when finished + * */ + + final String solrQuery = "_query_:{!edismax qf='id' v='8^=10 9^=5 7^=3 6^=1'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFields("*", "score"); + query.setRows(4); + query.setTimeAllowed(300); + query.add("fv", "true"); + query.add("rq", "{!ltr model=slowModel reRankDocs=3}"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound/==4", + "/responseHeader/partialResults/==true", + "/responseHeader/partialResultsDetails/=='Limits exceeded! (Learning To Rank rescoring - " + + "The full reranking didn\\'t complete. " + + "If partial results are tolerated the reranking got reverted and " + + "all documents preserved their original score and ranking.)" + + ": Query limits: [TimeAllowedLimit:LIMIT EXCEEDED]'", + "/response/docs/[0]/id=='8'", + "/response/docs/[0]/score==10.0", + "/response/docs/[1]/id=='9'", + "/response/docs/[1]/score==5.0", + "/response/docs/[2]/id=='7'", + "/response/docs/[2]/score==3.0", + "/response/docs/[3]/id=='6'", + "/response/docs/[3]/score==1.0"); + } + + @Test + public void ltr_expensiveFeatureRescoringAndPartialResultsNotTolerated_shouldRaiseException() + throws Exception { + /* One SolrFeature is defined: {!func}sleep(1000,999) + * It simulates a slow feature extraction, sleeping for 1000ms and returning 999 as a score when finished + * */ + final String solrQuery = "_query_:{!edismax qf='id' v='8^=10 9^=5 7^=3 6^=1'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFields("*", "score"); Review Comment: ```suggestion query.setFields("id", "score"); ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: issues-unsubscr...@solr.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@solr.apache.org For additional commands, e-mail: issues-h...@solr.apache.org