Skip to content

Commit

Permalink
AutoSolrConnection improvements
Browse files Browse the repository at this point in the history
* Correctly dispose of streams
* Accept CancellationTokens in SolrQueyExecuter and pass down to connection.
  • Loading branch information
gjunge committed Oct 29, 2018
1 parent 7c4cdff commit f549fba
Show file tree
Hide file tree
Showing 10 changed files with 75 additions and 44 deletions.
3 changes: 2 additions & 1 deletion SolrNet.Tests.Common/MockConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Xunit;

Expand Down Expand Up @@ -93,7 +94,7 @@ public virtual string Get(string relativeUrl, IEnumerable<KeyValuePair<string, s
Assert.True(expectations.Contains(p));
return response;
}
public virtual Task<string> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters)
public virtual Task<string> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(Get(relativeUrl, parameters));
}
Expand Down
5 changes: 3 additions & 2 deletions SolrNet.Tests.Common/Mocks/MSolrConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.IO;
using Moroco;
using System.Threading.Tasks;
using System.Threading;

namespace SolrNet.Tests.Mocks {
public class MSolrConnection : ISolrConnection {
Expand Down Expand Up @@ -44,9 +45,9 @@ public Task<string> PostStreamAsync(string relativeUrl, string contentType, Stre
return postStreamAsync.Invoke(relativeUrl, contentType, content, getParameters);
}

public Task<string> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters)
public Task<string> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters, CancellationToken cancellationToken = default(CancellationToken))
{
return getAsync.Invoke(relativeUrl, parameters);
}
}
}
}
7 changes: 4 additions & 3 deletions SolrNet.Tests.Common/Utils/LoggingConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

namespace SolrNet.Tests.Utils {
Expand Down Expand Up @@ -56,12 +57,12 @@ public virtual Task<string> PostStreamAsync(string relativeUrl, string contentTy
return conn.PostStreamAsync(relativeUrl, contentType, content, parameters);
}

public virtual async Task<string> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters)
public virtual async Task<string> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters, CancellationToken cancellationToken = default(CancellationToken))
{
Console.WriteLine("Getting Async");
var r = await conn.GetAsync(relativeUrl, parameters);
var r = await conn.GetAsync(relativeUrl, parameters, cancellationToken);
Console.WriteLine("Result is:\n" + r);
return r;
}
}
}
}
28 changes: 25 additions & 3 deletions SolrNet.Tests/AutoSolrConnectionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,25 @@ public async Task GetAsyncAutoPost()
Assert.Single(xdoc.Root.Element("result").Elements("doc"));
}


[Trait("Category", "Integration")]
[Fact()]
public async Task GetStreamAsyncAutoPost()
{
var p = new Dictionary<string, string>();
p["q"] = "*";
p["rows"] = "1";
p["test"] = string.Join("", Enumerable.Range(0, 9000).Select(a => "a"));
var conn = new AutoSolrConnection(solrURL);
XDocument xdoc;
using (var response = await conn.GetAsStreamAsync("/select/", p, default(CancellationToken)))
xdoc = XDocument.Load(response);

Assert.Equal("0", xdoc.Root.Element("lst").Elements("int").First(el => (string)el.Attribute("name") == "status").Value);
Assert.True(int.Parse((string)xdoc.Root.Element("result").Attribute("numFound")) > 1);
Assert.Single(xdoc.Root.Element("result").Elements("doc"));
}

[Trait("Category", "Integration")]
[Fact()]
public async Task GetAsyncAutoPostWithStream()
Expand All @@ -92,8 +111,11 @@ public async Task GetAsyncAutoPostWithStream()
p["rows"] = "1";
p["test"] = string.Join("", Enumerable.Range(0, 9000).Select(a => "a"));
var conn = new AutoSolrConnection(solrURL);
var response = await conn.GetAsync("/select/", p, CancellationToken.None);
var xdoc = XDocument.Load(response);
XDocument xdoc;
using (var response = await conn.GetAsStreamAsync("/select/", p, CancellationToken.None))
{
xdoc = XDocument.Load(response);
}
Assert.Equal("0", xdoc.Root.Element("lst").Elements("int").First(el => (string)el.Attribute("name") == "status").Value);
Assert.True(int.Parse((string)xdoc.Root.Element("result").Attribute("numFound")) > 1);
Assert.Single(xdoc.Root.Element("result").Elements("doc"));
Expand All @@ -109,7 +131,7 @@ public async Task GetAsyncWithCancelledToken()
var conn = new AutoSolrConnection(solrURL);
var tokenSource = new CancellationTokenSource(1);

await Assert.ThrowsAsync<TaskCanceledException>(() => conn.GetAsync("/select/", p, tokenSource.Token));
await Assert.ThrowsAsync<TaskCanceledException>(() => conn.GetAsStreamAsync("/select/", p, tokenSource.Token));

}
}
Expand Down
6 changes: 3 additions & 3 deletions SolrNet/ISolrConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,13 @@ public interface ISolrConnection {
/// <param name="relativeUrl">Path to get from</param>
/// <param name="parameters">Query string parameters</param>
/// <returns></returns>
Task<string> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters);
Task<string> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters, CancellationToken cancellationToken= default(CancellationToken));
}

public interface IStreamSolrConnection : ISolrConnection
{
Task<Stream> PostStreamAsync(string relativeUrl, string contentType, Stream content, IEnumerable<KeyValuePair<string, string>> getParameters, CancellationToken cancellationToken);
Task<Stream> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters, CancellationToken cancellationToken);
Task<Stream> PostStreamAsStreamAsync(string relativeUrl, string contentType, Stream content, IEnumerable<KeyValuePair<string, string>> getParameters, CancellationToken cancellationToken);
Task<Stream> GetAsStreamAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters, CancellationToken cancellationToken);

}
}
33 changes: 17 additions & 16 deletions SolrNet/ISolrQueryExecuter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,31 +14,32 @@
// limitations under the License.
#endregion

using System.Collections.Generic;
using System.Threading.Tasks;
using SolrNet.Commands.Parameters;
using SolrNet.Impl;
using System.Threading.Tasks;

namespace SolrNet {
/// <summary>
/// Executable query
/// </summary>
/// <typeparam name="T">Document type</typeparam>
public interface ISolrQueryExecuter<T> {
/// <summary>
/// Executes the query and returns results
/// </summary>
/// <returns>query results</returns>
SolrQueryResults<T> Execute(ISolrQuery q, QueryOptions options);
namespace SolrNet
{
/// <summary>
/// Executable query
/// </summary>
/// <typeparam name="T">Document type</typeparam>
public interface ISolrQueryExecuter<T>
{
/// <summary>
/// Executes the query and returns results
/// </summary>
/// <returns>query results</returns>
SolrQueryResults<T> Execute(ISolrQuery q, QueryOptions options);

SolrMoreLikeThisHandlerResults<T> Execute(SolrMLTQuery query, MoreLikeThisHandlerQueryOptions options);

/// <summary>
/// Executes the query and returns results
/// </summary>
/// <returns>query results</returns>
Task<SolrQueryResults<T>> ExecuteAsync(ISolrQuery q, QueryOptions options);
Task<SolrQueryResults<T>> ExecuteAsync(ISolrQuery q, QueryOptions options, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken));

Task<SolrMoreLikeThisHandlerResults<T>> ExecuteAsync(SolrMLTQuery query, MoreLikeThisHandlerQueryOptions options);
Task<SolrMoreLikeThisHandlerResults<T>> ExecuteAsync(SolrMLTQuery query, MoreLikeThisHandlerQueryOptions options, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken));
}
}
}
14 changes: 7 additions & 7 deletions SolrNet/Impl/AutoSolrConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public AutoSolrConnection(string serverUrl, HttpClient httpClient)
this.SyncFallbackConnection = new PostSolrConnection(new SolrConnection(serverUrl), serverUrl);
this.ServerURL = Utils.UriValidator.ValidateHTTP(serverUrl);
this.HttpClient = httpClient;


}

Expand All @@ -62,17 +62,17 @@ public AutoSolrConnection(string serverUrl, HttpClient httpClient)

public string Get(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters) => SyncFallbackConnection.Get(relativeUrl, parameters);

public async Task<string> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters)
public async Task<string> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters, CancellationToken cancellationToken = default(CancellationToken))
{
var responseStream = await GetAsync(relativeUrl, parameters, CancellationToken.None);
using (var responseStream = await GetAsStreamAsync(relativeUrl, parameters, cancellationToken))
using (var sr = new StreamReader(responseStream))
{
return await sr.ReadToEndAsync();
}
}


public async Task<Stream> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters, CancellationToken cancellationToken)
public async Task<Stream> GetAsStreamAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters, CancellationToken cancellationToken)
{
var u = new UriBuilder(ServerURL);
u.Path += relativeUrl;
Expand Down Expand Up @@ -102,7 +102,7 @@ public async Task<string> PostAsync(string relativeUrl, string s, CancellationTo
var bytes = Encoding.UTF8.GetBytes(s);
using (var content = new MemoryStream(bytes))
{
var responseStream = await PostStreamAsync(relativeUrl, "text/xml; charset=utf-8", content, null, cancellationToken);
using (var responseStream = await PostStreamAsStreamAsync(relativeUrl, "text/xml; charset=utf-8", content, null, cancellationToken))
using (var sr = new StreamReader(responseStream))
{
return await sr.ReadToEndAsync();
Expand All @@ -114,15 +114,15 @@ public async Task<string> PostAsync(string relativeUrl, string s, CancellationTo

public async Task<string> PostStreamAsync(string relativeUrl, string contentType, Stream content, IEnumerable<KeyValuePair<string, string>> getParameters)
{
var responseStream = await PostStreamAsync(relativeUrl, contentType, content, getParameters, CancellationToken.None);
using (var responseStream = await PostStreamAsStreamAsync(relativeUrl, contentType, content, getParameters, CancellationToken.None))
using (var sr = new StreamReader(responseStream))
{
return await sr.ReadToEndAsync();
}
}


public async Task<Stream> PostStreamAsync(string relativeUrl, string contentType, Stream content, IEnumerable<KeyValuePair<string, string>> getParameters, CancellationToken cancellationToken)
public async Task<Stream> PostStreamAsStreamAsync(string relativeUrl, string contentType, Stream content, IEnumerable<KeyValuePair<string, string>> getParameters, CancellationToken cancellationToken)
{
var u = new UriBuilder(ServerURL);
u.Path += relativeUrl;
Expand Down
5 changes: 3 additions & 2 deletions SolrNet/Impl/SolrConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
using SolrNet.Utils;
using HttpUtility = SolrNet.Utils.HttpUtility;
using System.Threading.Tasks;
using System.Threading;

namespace SolrNet.Impl
{
Expand Down Expand Up @@ -237,7 +238,7 @@ public string Get(string relativeUrl, IEnumerable<KeyValuePair<string, string>>
}
}

public async Task<string> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters)
public async Task<string> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters, CancellationToken cancellationToken = default(CancellationToken))
{
var wr = PrepareGetWebRequest(relativeUrl, parameters);

Expand Down Expand Up @@ -366,4 +367,4 @@ private Encoding TryGetEncoding(IHttpWebResponse response)
}
}
}
}
}
3 changes: 2 additions & 1 deletion SolrNet/Impl/SolrPostConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using SolrNet.Exceptions;
using SolrNet.Utils;
using System.Threading.Tasks;
using System.Threading;

namespace SolrNet.Impl
{
Expand Down Expand Up @@ -85,7 +86,7 @@ public string Get(string relativeUrl, IEnumerable<KeyValuePair<string, string>>
}
}

public async Task<string> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters)
public async Task<string> GetAsync(string relativeUrl, IEnumerable<KeyValuePair<string, string>> parameters, CancellationToken cancellationToken = default(CancellationToken))
{
var g = PrepareGet(relativeUrl, parameters);
try
Expand Down
15 changes: 9 additions & 6 deletions SolrNet/Impl/SolrQueryExecuter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
using SolrNet.Commands.Parameters;
Expand Down Expand Up @@ -687,7 +688,7 @@ public SolrMoreLikeThisHandlerResults<T> Execute(SolrMLTQuery q, MoreLikeThisHan
return qr;
}

public async Task<SolrQueryResults<T>> ExecuteAsync(ISolrQuery q, QueryOptions options)
public async Task<SolrQueryResults<T>> ExecuteAsync(ISolrQuery q, QueryOptions options, CancellationToken cancellationToken = default(CancellationToken))
{
var handler = options?.RequestHandler?.HandlerUrl ?? DefaultHandler;
var param = GetAllParameters(q, options);
Expand All @@ -696,23 +697,25 @@ public async Task<SolrQueryResults<T>> ExecuteAsync(ISolrQuery q, QueryOptions o
XDocument xml;
if (connection is IStreamSolrConnection cc)
{
var r = await cc.GetAsync(handler, param, System.Threading.CancellationToken.None);
xml = XDocument.Load(r);
using (var r = await cc.GetAsStreamAsync(handler, param, cancellationToken))
{
xml = XDocument.Load(r);
}
}
else
{
var r = await connection.GetAsync(handler, param);
var r = await connection.GetAsync(handler, param, cancellationToken);
xml = XDocument.Parse(r);
}

resultParser.Parse(xml, results);
return results;
}

public async Task<SolrMoreLikeThisHandlerResults<T>> ExecuteAsync(SolrMLTQuery q, MoreLikeThisHandlerQueryOptions options)
public async Task<SolrMoreLikeThisHandlerResults<T>> ExecuteAsync(SolrMLTQuery q, MoreLikeThisHandlerQueryOptions options, CancellationToken cancellationToken = default(CancellationToken))
{
var param = GetAllMoreLikeThisHandlerParameters(q, options).ToList();
var r = await connection.GetAsync(MoreLikeThisHandler, param);
var r = await connection.GetAsync(MoreLikeThisHandler, param, cancellationToken);
var qr = mlthResultParser.Parse(r);
return qr;
}
Expand Down

0 comments on commit f549fba

Please sign in to comment.