Skip to content

Commit

Permalink
Merge pull request #481 from mattflax/JsonQuery
Browse files Browse the repository at this point in the history
POST QueryExecuter
  • Loading branch information
gjunge committed Jun 25, 2019
2 parents 210e0c5 + 4d6f324 commit 114061f
Show file tree
Hide file tree
Showing 10 changed files with 321 additions and 31 deletions.
19 changes: 17 additions & 2 deletions SolrNet.Tests.Common/MockConnection.cs
Expand Up @@ -27,6 +27,9 @@ namespace SolrNet.Tests
public class MockConnection : ISolrConnection
{
private readonly ICollection<KeyValuePair<string, string>> expectations;
private readonly string mimetype;
private readonly string body;

private const string response =
@"<?xml version=""1.0"" encoding=""UTF-8""?>
<response>
Expand All @@ -36,9 +39,13 @@ public class MockConnection : ISolrConnection

public MockConnection() { }

public MockConnection(ICollection<KeyValuePair<string, string>> expectations)
public MockConnection(ICollection<KeyValuePair<string, string>> expectations) : this(expectations, null, null) { }

public MockConnection(ICollection<KeyValuePair<string, string>> expectations, string mimetype, string body)
{
this.expectations = expectations;
this.mimetype = mimetype;
this.body = body;
}

public virtual string ServerURL { get; set; }
Expand All @@ -59,7 +66,15 @@ public virtual Task<string> PostAsync (string relativeUrl, string s)

public virtual string PostStream(string relativeUrl, string contentType, Stream content, IEnumerable<KeyValuePair<string, string>> parameters)
{
return string.Empty;
// Verify the content and type match our expectations
Assert.Equal(mimetype, contentType);
using (StreamReader r = new StreamReader(content))
{
var b = r.ReadToEnd();
Assert.Equal(body, b);
}

return Get(relativeUrl, parameters);
}

public virtual Task<string> PostStreamAsync(string relativeUrl, string contentType, Stream content, IEnumerable<KeyValuePair<string, string>> parameters)
Expand Down
12 changes: 6 additions & 6 deletions SolrNet.Tests/SolrOperationsTests.cs
Expand Up @@ -464,7 +464,7 @@ public class TestDocWithNullable {
connection.get += new MFunc<string, IEnumerable<KeyValuePair<string, string>>, string>( (url, param) => {
Assert.Equal("/select", url);
var expectedParams = new Dictionary<string, string> {
{"q", ""},
{"q", "*:*"},
{"rows", SolrQueryExecuter<TestDocumentWithUniqueKey>.ConstDefaultRows.ToString()},
{"facet", "true"},
{"facet.query", "id:1"},
Expand All @@ -479,7 +479,7 @@ public class TestDocWithNullable {
parser.parse &= x => x.Stub();
var executer = new SolrQueryExecuter<TestDocumentWithUniqueKey>(parser, connection, querySerializer, facetQuerySerializer, null);
var solr = new SolrBasicServer<TestDocumentWithUniqueKey>(connection, executer, null, null, null, null, null, null);
var r = solr.Query(new SolrQuery(""), new QueryOptions {
var r = solr.Query(new SolrQuery("*:*"), new QueryOptions {
Facet = new FacetParameters {
Queries = new ISolrFacetQuery[] {
new SolrFacetQuery(new SolrQuery("id:1")),
Expand All @@ -496,7 +496,7 @@ public class TestDocWithNullable {
connection.get += new MFunc<string, IEnumerable<KeyValuePair<string, string>>, string>((url, param) => {
Assert.Equal("/select", url);
var expectedParams = new Dictionary<string, string> {
{"q", ""},
{"q", "*:*"},
{"rows", SolrQueryExecuter<TestDocumentWithUniqueKey>.ConstDefaultRows.ToString()},
{"facet", "true"},
{"facet.field", "id"},
Expand All @@ -509,12 +509,12 @@ public class TestDocWithNullable {
var parser = new MSolrAbstractResponseParser<TestDocumentWithUniqueKey>();
parser.parse &= x => x.Stub();
var querySerializer = new MSolrQuerySerializer();
querySerializer.serialize += _ => "";
querySerializer.serialize += _ => "*:*";
var facetQuerySerializer = new DefaultFacetQuerySerializer(querySerializer, new DefaultFieldSerializer());

var executer = new SolrQueryExecuter<TestDocumentWithUniqueKey>(parser, connection, querySerializer, facetQuerySerializer, null);
var solr = new SolrBasicServer<TestDocumentWithUniqueKey>(connection, executer, null, null, null, null, null, null);
var r = solr.Query(new SolrQuery(""), new QueryOptions {
var r = solr.Query(new SolrQuery("*:*"), new QueryOptions {
Facet = new FacetParameters {
Queries = new ISolrFacetQuery[] {
new SolrFacetFieldQuery("id") {Limit = 3},
Expand Down Expand Up @@ -556,4 +556,4 @@ public void AtomicUpdate()
Assert.Equal(1, connection.postStream.Calls);
}
}
}
}
152 changes: 135 additions & 17 deletions SolrNet.Tests/SolrQueryExecuterTests.cs
Expand Up @@ -16,9 +16,9 @@

#endregion

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mime;
using Xunit;
using Moroco;
using SolrNet.Attributes;
Expand Down Expand Up @@ -57,6 +57,23 @@ public void Execute()
Assert.Equal(1, serializer.serialize.Calls);
}

[Fact]
public void ExecuteAsyncWithBodyContent()
{
const string queryJson = "{ \"query\": \"id:123456\" }";
var q = new Dictionary<string, string>();
q["rows"] = SolrQueryExecuter<SolrQueryExecuterTests.TestDocument>.ConstDefaultRows.ToString();
var conn = new MockConnection(q, SimpleJsonQueryBody.ApplicationJson, queryJson);
var serializer = new MSolrQuerySerializer();
serializer.serialize += _ => string.Empty;
var parser = new MSolrAbstractResponseParser<SolrQueryExecuterTests.TestDocument>();
parser.parse &= x => x.Stub();

var queryExecuter = new SolrQueryExecuter<SolrQueryExecuterTests.TestDocument>(parser, conn, serializer, null, null);
var r = queryExecuter.ExecuteAsync(new SolrQuery(null), new SimpleJsonQueryBody(queryJson), new QueryOptions());
Assert.Equal(1, serializer.serialize.Calls);
}

[Fact]
public void RequestHandler()
{
Expand Down Expand Up @@ -138,7 +155,6 @@ public void RequestHandler()
[Fact]
public void Facets() {
var q = new Dictionary<string, string>();
q["q"] = "";
q["rows"] = SolrQueryExecuter<TestDocument>.ConstDefaultRows.ToString();
q["facet"] = "true";
q["facet.field"] = "Id";
Expand All @@ -163,7 +179,6 @@ public void RequestHandler()
[Fact]
public void MultipleFacetFields() {
var conn = new MockConnection(new[] {
KV.Create("q", ""),
KV.Create("rows", SolrQueryExecuter<TestDocument>.ConstDefaultRows.ToString()),
KV.Create("facet", "true"),
KV.Create("facet.field", "Id"),
Expand Down Expand Up @@ -196,7 +211,7 @@ public void RequestHandler()
const string query = "mausch";
var highlightQuery = new SolrQuery(query);
var q = new Dictionary<string, string>();
q["q"] = "";
q["q"] = "*";
q["rows"] = SolrQueryExecuter<TestDocument>.ConstDefaultRows.ToString();
q["hl"] = "true";
q["hl.q"] = query;
Expand Down Expand Up @@ -224,7 +239,7 @@ public void RequestHandler()
var parser = new MSolrAbstractResponseParser<TestDocument>();
parser.parse &= x => x.Stub();
var queryExecuter = new SolrQueryExecuter<TestDocument>(parser, conn, querySerializer, null, null);
queryExecuter.Execute(new SolrQuery(""), new QueryOptions {
queryExecuter.Execute(new SolrQuery("*"), new QueryOptions {
Highlight = new HighlightingParameters {
Fields = new[] { highlightedField },
AfterTerm = afterTerm,
Expand Down Expand Up @@ -252,22 +267,23 @@ public void RequestHandler()
public void HighlightingWithoutFieldsOutputsPrePost() {
const string afterTerm = "after";
const string beforeTerm = "before";
const string query = "*";

var q = new Dictionary<string, string>();
q["q"] = "";
q["q"] = query;
q["rows"] = SolrQueryExecuter<TestDocument>.ConstDefaultRows.ToString();
q["hl"] = "true";
q["hl.tag.pre"] = beforeTerm;
q["hl.tag.post"] = afterTerm;
q["hl.useFastVectorHighlighter"] = "true";

var conn = new MockConnection(q);
var querySerializer = new SolrQuerySerializerStub("");
var querySerializer = new SolrQuerySerializerStub(query);

var parser = new MSolrAbstractResponseParser<TestDocument>();
parser.parse &= x => x.Stub();
var queryExecuter = new SolrQueryExecuter<TestDocument>(parser, conn, querySerializer, null, null);
queryExecuter.Execute(new SolrQuery(""), new QueryOptions {
queryExecuter.Execute(new SolrQuery(query), new QueryOptions {
Highlight = new HighlightingParameters {
AfterTerm = afterTerm,
BeforeTerm = beforeTerm,
Expand Down Expand Up @@ -414,7 +430,7 @@ public void RequestHandler()

[Fact]
public void GetTermVectorParameterOptions_All() {
var r = SolrQueryExecuter<object>.GetTermVectorParameterOptions(TermVectorParameterOptions.All).ToList();
var r = SolrQueryExecuter<TestDocument>.GetTermVectorParameterOptions(TermVectorParameterOptions.All).ToList();
Assert.Single(r);
Assert.Equal("tv.all", r[0]);
}
Expand All @@ -427,28 +443,28 @@ public void RequestHandler()
| TermVectorParameterOptions.Positions
| TermVectorParameterOptions.Offsets
| TermVectorParameterOptions.TermFrequency_InverseDocumentFrequency;
var r = SolrQueryExecuter<object>.GetTermVectorParameterOptions(o).ToList();
var r = SolrQueryExecuter<TestDocument>.GetTermVectorParameterOptions(o).ToList();
Assert.Single(r);
Assert.Equal("tv.all", r[0]);
}

[Fact]
public void GetTermVectorParameterOptions_Tf() {
var r = SolrQueryExecuter<object>.GetTermVectorParameterOptions(TermVectorParameterOptions.TermFrequency).ToList();
var r = SolrQueryExecuter<TestDocument>.GetTermVectorParameterOptions(TermVectorParameterOptions.TermFrequency).ToList();
Assert.Single(r);
Assert.Equal("tv.tf", r[0]);
}

[Fact]
public void GetTermVectorParameterOptions_Df() {
var r = SolrQueryExecuter<object>.GetTermVectorParameterOptions(TermVectorParameterOptions.DocumentFrequency).ToList();
var r = SolrQueryExecuter<TestDocument>.GetTermVectorParameterOptions(TermVectorParameterOptions.DocumentFrequency).ToList();
Assert.Single(r);
Assert.Equal("tv.df", r[0]);
}

[Fact]
public void GetTermVectorParameterOptions_default() {
var r = SolrQueryExecuter<object>.GetTermVectorParameterOptions(TermVectorParameterOptions.Default).ToList();
var r = SolrQueryExecuter<TestDocument>.GetTermVectorParameterOptions(TermVectorParameterOptions.Default).ToList();
Assert.Empty(r);
}

Expand All @@ -457,22 +473,22 @@ public void RequestHandler()
const TermVectorParameterOptions o =
TermVectorParameterOptions.DocumentFrequency
| TermVectorParameterOptions.TermFrequency;
var r = SolrQueryExecuter<object>.GetTermVectorParameterOptions(o).ToList();
var r = SolrQueryExecuter<TestDocument>.GetTermVectorParameterOptions(o).ToList();
Assert.Equal(2, r.Count);
Assert.Contains( "tv.df",r);
Assert.Contains( "tv.tf",r);
}

[Fact]
public void GetTermVectorParameterOptions_offsets() {
var r = SolrQueryExecuter<object>.GetTermVectorParameterOptions(TermVectorParameterOptions.Offsets).ToList();
var r = SolrQueryExecuter<TestDocument>.GetTermVectorParameterOptions(TermVectorParameterOptions.Offsets).ToList();
Assert.Single(r);
Assert.Equal("tv.offsets", r[0]);
}

[Fact]
public void GetTermVectorParameterOptions_tfidf() {
var r = SolrQueryExecuter<object>.GetTermVectorParameterOptions(TermVectorParameterOptions.TermFrequency_InverseDocumentFrequency).ToList();
var r = SolrQueryExecuter<TestDocument>.GetTermVectorParameterOptions(TermVectorParameterOptions.TermFrequency_InverseDocumentFrequency).ToList();
Assert.Equal(3, r.Count);
Assert.Contains( "tv.df",r);
Assert.Contains( "tv.tf",r);
Expand Down Expand Up @@ -628,6 +644,108 @@ public void RequestHandler()
Assert.Contains( KV.Create("stream.url", "http://wiki.apache.org/solr/MoreLikeThisHandler"),p);
}

[Fact]
public void ExecuteMLT_with_stream_body_query() {
var parser = new MSolrMoreLikeThisHandlerQueryResultsParser<SolrQueryExecuterTests.TestDocument>();
var q = new Dictionary<string, string>();
q["mlt"] = "true";
q["mlt.fl"] = "one,three";
q["mlt.match.include"] = "false";
q["mlt.match.offset"] = "5";
q["mlt.interestingTerms"] = InterestingTerms.None.ToString().ToLowerInvariant();
q["start"] = "0";
q["rows"] = "5";
q["fl"] = "one,two,three";
var conn = new MockConnection(q, MediaTypeNames.Text.Plain, "one two three");

var qe = new SolrQueryExecuter<SolrQueryExecuterTests.TestDocument>(null, conn, null, null, parser);
var r = qe.ExecuteAsync(new SolrMoreLikeThisHandlerStreamBodyQuery("one two three"),
new MoreLikeThisHandlerQueryOptions(
new MoreLikeThisHandlerParameters(new[] {"one", "three"})
{
MatchInclude = false,
MatchOffset = 5,
ShowTerms = InterestingTerms.None,
})
{
Start = 0,
Rows = 5,
Fields = new[] {"one", "two", "three"},
});
}

[Fact]
public void ExecuteMLT_with_stream_body_option()
{
const string queryString = "my query";

var parser = new MSolrMoreLikeThisHandlerQueryResultsParser<SolrQueryExecuterTests.TestDocument>();
var q = new Dictionary<string, string>();
q["q"] = queryString;
q["mlt"] = "true";
q["mlt.fl"] = "one,three";
q["mlt.match.include"] = "false";
q["mlt.match.offset"] = "5";
q["mlt.interestingTerms"] = InterestingTerms.None.ToString().ToLowerInvariant();
q["start"] = "0";
q["rows"] = "5";
q["fl"] = "one,two,three";
var conn = new MockConnection(q, MediaTypeNames.Text.Plain, "one two three");

var serializer = new MSolrQuerySerializer();
serializer.serialize += _ => queryString;
var qe = new SolrQueryExecuter<SolrQueryExecuterTests.TestDocument>(null, conn, serializer, null, parser);
var r = qe.ExecuteAsync(new SolrMoreLikeThisHandlerQuery(new SolrQuery(queryString)), new PlainTextQueryBody("one two three"),
new MoreLikeThisHandlerQueryOptions(
new MoreLikeThisHandlerParameters(new[] {"one", "three"})
{
MatchInclude = false,
MatchOffset = 5,
ShowTerms = InterestingTerms.None,
})
{
Start = 0,
Rows = 5,
Fields = new[] {"one", "two", "three"}
});
}

[Fact]
public void ExecuteMLT_with_no_body()
{
const string queryString = "my query";

var parser = new MSolrMoreLikeThisHandlerQueryResultsParser<SolrQueryExecuterTests.TestDocument>();
var q = new Dictionary<string, string>();
q["q"] = queryString;
q["mlt"] = "true";
q["mlt.fl"] = "one,three";
q["mlt.match.include"] = "false";
q["mlt.match.offset"] = "5";
q["mlt.interestingTerms"] = InterestingTerms.None.ToString().ToLowerInvariant();
q["start"] = "0";
q["rows"] = "5";
q["fl"] = "one,two,three";
var conn = new MockConnection(q, MediaTypeNames.Text.Plain, string.Empty);

var serializer = new MSolrQuerySerializer();
serializer.serialize += _ => queryString;
var qe = new SolrQueryExecuter<SolrQueryExecuterTests.TestDocument>(null, conn, serializer, null, parser);
var r = qe.ExecuteAsync(new SolrMoreLikeThisHandlerQuery(new SolrQuery(queryString)),
new MoreLikeThisHandlerQueryOptions(
new MoreLikeThisHandlerParameters(new[] {"one", "three"})
{
MatchInclude = false,
MatchOffset = 5,
ShowTerms = InterestingTerms.None,
})
{
Start = 0,
Rows = 5,
Fields = new[] {"one", "two", "three"},
});
}

[Fact]
public void FacetFieldOptions() {
var querySerializer = new SolrQuerySerializerStub("q");
Expand Down Expand Up @@ -795,4 +913,4 @@ public void GetCursormarkWithMarkSet()
Assert.Contains( KV.Create("expand.q", "aquery"),p);
}
}
}
}
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using SolrNet.Impl;

namespace SolrNet.Commands.Parameters {
/// <summary>
Expand All @@ -19,4 +20,4 @@ public class MoreLikeThisHandlerQueryOptions: CommonQueryOptions {
/// </summary>
public MoreLikeThisHandlerParameters Parameters { get; set; }
}
}
}
3 changes: 2 additions & 1 deletion SolrNet/Commands/Parameters/QueryOptions.cs
Expand Up @@ -15,6 +15,7 @@
#endregion

using System.Collections.Generic;
using SolrNet.Impl;

namespace SolrNet.Commands.Parameters {
/// <summary>
Expand Down Expand Up @@ -94,4 +95,4 @@ public partial class QueryOptions: CommonQueryOptions {
OrderBy = new List<SortOrder>();
}
}
}
}

0 comments on commit 114061f

Please sign in to comment.