Skip to content
This repository was archived by the owner on Sep 17, 2023. It is now read-only.

Commit d02c495

Browse files
authored
Resurrect search (#195)
* obsolete disk_size and data_size * ibmcom/couchdb3 docker image * search comments removed
1 parent 6367571 commit d02c495

25 files changed

+1345
-1320
lines changed

azure-pipelines-cd.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ pr: none
1616
resources:
1717
containers:
1818
- container: couchdb
19-
image: couchdb:2.3.1
19+
image: ibmcom/couchdb3:3.1.0
2020
ports:
2121
- 5984:5984
2222
env:

azure-pipelines-ci.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pr:
2020
resources:
2121
containers:
2222
- container: couchdb
23-
image: couchdb:2.3.1
23+
image: ibmcom/couchdb3:3.1.0
2424
ports:
2525
- 5984:5984
2626
env:

docker-compose.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
version: '3'
22
services:
33
couchdb:
4-
image: "couchdb:2.3.1"
4+
image: "ibmcom/couchdb3:3.1.0"
55
environment:
66
COUCHDB_USER: ${MyCouch_User}
77
COUCHDB_PASSWORD: ${MyCouch_Pass}
+51-51
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,51 @@
1-
//using System.Threading.Tasks;
2-
//using EnsureThat;
3-
//using MyCouch.Extensions;
4-
//using MyCouch.HttpRequestFactories;
5-
//using MyCouch.Requests;
6-
//using MyCouch.Responses;
7-
//using MyCouch.Responses.Factories;
8-
//using MyCouch.Serialization;
9-
10-
//namespace MyCouch.Contexts
11-
//{
12-
// public class Searches : ApiContextBase<IDbConnection>, ISearches
13-
// {
14-
// protected SearchIndexHttpRequestFactory SearchIndexHttpRequestFactory { get; set; }
15-
// protected SearchIndexResponseFactory SearchIndexResponseFactory { get; set; }
16-
17-
// public Searches(IDbConnection connection, ISerializer documentSerializer, ISerializer serializer)
18-
// : base(connection)
19-
// {
20-
// Ensure.That(documentSerializer, "documentSerializer").IsNotNull();
21-
// Ensure.Any.IsNotNull(serializer, nameof(serializer));
22-
23-
// SearchIndexHttpRequestFactory = new SearchIndexHttpRequestFactory(serializer);
24-
// SearchIndexResponseFactory = new SearchIndexResponseFactory(documentSerializer);
25-
// }
26-
27-
// public virtual async Task<SearchIndexResponse> SearchAsync(SearchIndexRequest request)
28-
// {
29-
// Ensure.Any.IsNotNull(request, nameof(request));
30-
31-
// var httpRequest = SearchIndexHttpRequestFactory.Create(request);
32-
33-
// using (var res = await SendAsync(httpRequest).ForAwait())
34-
// {
35-
// return await SearchIndexResponseFactory.CreateAsync(res).ForAwait();
36-
// }
37-
// }
38-
39-
// public virtual async Task<SearchIndexResponse<TIncludedDoc>> SearchAsync<TIncludedDoc>(SearchIndexRequest request)
40-
// {
41-
// Ensure.Any.IsNotNull(request, nameof(request));
42-
43-
// var httpRequest = SearchIndexHttpRequestFactory.Create(request);
44-
45-
// using (var res = await SendAsync(httpRequest).ForAwait())
46-
// {
47-
// return await SearchIndexResponseFactory.CreateAsync<TIncludedDoc>(res).ForAwait();
48-
// }
49-
// }
50-
// }
51-
//}
1+
using System.Threading.Tasks;
2+
using EnsureThat;
3+
using MyCouch.Extensions;
4+
using MyCouch.HttpRequestFactories;
5+
using MyCouch.Requests;
6+
using MyCouch.Responses;
7+
using MyCouch.Responses.Factories;
8+
using MyCouch.Serialization;
9+
10+
namespace MyCouch.Contexts
11+
{
12+
public class Searches : ApiContextBase<IDbConnection>, ISearches
13+
{
14+
protected SearchIndexHttpRequestFactory SearchIndexHttpRequestFactory { get; set; }
15+
protected SearchIndexResponseFactory SearchIndexResponseFactory { get; set; }
16+
17+
public Searches(IDbConnection connection, ISerializer documentSerializer, ISerializer serializer)
18+
: base(connection)
19+
{
20+
Ensure.That(documentSerializer, "documentSerializer").IsNotNull();
21+
Ensure.Any.IsNotNull(serializer, nameof(serializer));
22+
23+
SearchIndexHttpRequestFactory = new SearchIndexHttpRequestFactory(serializer);
24+
SearchIndexResponseFactory = new SearchIndexResponseFactory(documentSerializer);
25+
}
26+
27+
public virtual async Task<SearchIndexResponse> SearchAsync(SearchIndexRequest request)
28+
{
29+
Ensure.Any.IsNotNull(request, nameof(request));
30+
31+
var httpRequest = SearchIndexHttpRequestFactory.Create(request);
32+
33+
using (var res = await SendAsync(httpRequest).ForAwait())
34+
{
35+
return await SearchIndexResponseFactory.CreateAsync(res).ForAwait();
36+
}
37+
}
38+
39+
public virtual async Task<SearchIndexResponse<TIncludedDoc>> SearchAsync<TIncludedDoc>(SearchIndexRequest request)
40+
{
41+
Ensure.Any.IsNotNull(request, nameof(request));
42+
43+
var httpRequest = SearchIndexHttpRequestFactory.Create(request);
44+
45+
using (var res = await SendAsync(httpRequest).ForAwait())
46+
{
47+
return await SearchIndexResponseFactory.CreateAsync<TIncludedDoc>(res).ForAwait();
48+
}
49+
}
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -1,110 +1,110 @@
1-
//using System.Collections.Generic;
2-
//using System.Linq;
3-
//using System.Net.Http;
4-
//using EnsureThat;
5-
//using MyCouch.Net;
6-
//using MyCouch.Requests;
7-
//using MyCouch.Serialization;
8-
9-
//namespace MyCouch.HttpRequestFactories
10-
//{
11-
// public class SearchIndexHttpRequestFactory
12-
// {
13-
// protected ISerializer Serializer { get; private set; }
14-
15-
// public SearchIndexHttpRequestFactory(ISerializer serializer)
16-
// {
17-
// Ensure.Any.IsNotNull(serializer, nameof(serializer));
18-
19-
// Serializer = serializer;
20-
// }
21-
22-
// public virtual HttpRequest Create(SearchIndexRequest request)
23-
// {
24-
// Ensure.Any.IsNotNull(request, nameof(request));
25-
26-
// return new HttpRequest(HttpMethod.Get, GenerateRelativeUrl(request))
27-
// .SetRequestTypeHeader(request.GetType());
28-
// }
29-
30-
// protected virtual string GenerateRelativeUrl(SearchIndexRequest request)
31-
// {
32-
// return string.Format("/_design/{0}/_search/{1}{2}",
33-
// new UrlSegment(request.IndexIdentity.DesignDocument),
34-
// new UrlSegment(request.IndexIdentity.Name),
35-
// GenerateRequestUrlQueryString(request));
36-
// }
37-
38-
// protected virtual string GenerateRequestUrlQueryString(SearchIndexRequest request)
39-
// {
40-
// var p = GenerateQueryStringParams(request);
41-
42-
// return string.IsNullOrEmpty(p) ? string.Empty : string.Concat("?", p);
43-
// }
44-
45-
// protected virtual string GenerateQueryStringParams(SearchIndexRequest request)
46-
// {
47-
// return string.Join("&", GenerateJsonCompatibleKeyValues(request)
48-
// .Select(kv => string.Format("{0}={1}", kv.Key, UrlParam.Encode(kv.Value))));
49-
// }
50-
51-
// protected virtual IDictionary<string, string> GenerateJsonCompatibleKeyValues(SearchIndexRequest request)
52-
// {
53-
// var kvs = new Dictionary<string, string>();
54-
55-
// if (!string.IsNullOrWhiteSpace(request.Expression))
56-
// kvs.Add(KeyNames.Expression, request.Expression);
57-
58-
// if (request.HasSortings())
59-
// kvs.Add(KeyNames.Sort, Serializer.ToJsonArray(request.Sort.ToArray()));
60-
61-
// if (!string.IsNullOrWhiteSpace(request.Bookmark))
62-
// kvs.Add(KeyNames.Bookmark, request.Bookmark);
63-
64-
// if (request.Stale.HasValue)
65-
// kvs.Add(KeyNames.Stale, request.Stale.Value.AsString());
66-
67-
// if (request.Limit.HasValue)
68-
// kvs.Add(KeyNames.Limit, Serializer.ToJson(request.Limit.Value));
69-
70-
// if (request.IncludeDocs.HasValue)
71-
// kvs.Add(KeyNames.IncludeDocs, Serializer.ToJson(request.IncludeDocs.Value));
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using System.Net.Http;
4+
using EnsureThat;
5+
using MyCouch.Net;
6+
using MyCouch.Requests;
7+
using MyCouch.Serialization;
8+
9+
namespace MyCouch.HttpRequestFactories
10+
{
11+
public class SearchIndexHttpRequestFactory
12+
{
13+
protected ISerializer Serializer { get; private set; }
14+
15+
public SearchIndexHttpRequestFactory(ISerializer serializer)
16+
{
17+
Ensure.Any.IsNotNull(serializer, nameof(serializer));
18+
19+
Serializer = serializer;
20+
}
21+
22+
public virtual HttpRequest Create(SearchIndexRequest request)
23+
{
24+
Ensure.Any.IsNotNull(request, nameof(request));
25+
26+
return new HttpRequest(HttpMethod.Get, GenerateRelativeUrl(request))
27+
.SetRequestTypeHeader(request.GetType());
28+
}
29+
30+
protected virtual string GenerateRelativeUrl(SearchIndexRequest request)
31+
{
32+
return string.Format("/_design/{0}/_search/{1}{2}",
33+
new UrlSegment(request.IndexIdentity.DesignDocument),
34+
new UrlSegment(request.IndexIdentity.Name),
35+
GenerateRequestUrlQueryString(request));
36+
}
37+
38+
protected virtual string GenerateRequestUrlQueryString(SearchIndexRequest request)
39+
{
40+
var p = GenerateQueryStringParams(request);
41+
42+
return string.IsNullOrEmpty(p) ? string.Empty : string.Concat("?", p);
43+
}
44+
45+
protected virtual string GenerateQueryStringParams(SearchIndexRequest request)
46+
{
47+
return string.Join("&", GenerateJsonCompatibleKeyValues(request)
48+
.Select(kv => string.Format("{0}={1}", kv.Key, UrlParam.Encode(kv.Value))));
49+
}
50+
51+
protected virtual IDictionary<string, string> GenerateJsonCompatibleKeyValues(SearchIndexRequest request)
52+
{
53+
var kvs = new Dictionary<string, string>();
54+
55+
if (!string.IsNullOrWhiteSpace(request.Expression))
56+
kvs.Add(KeyNames.Expression, request.Expression);
57+
58+
if (request.HasSortings())
59+
kvs.Add(KeyNames.Sort, Serializer.ToJsonArray(request.Sort.ToArray()));
60+
61+
if (!string.IsNullOrWhiteSpace(request.Bookmark))
62+
kvs.Add(KeyNames.Bookmark, request.Bookmark);
63+
64+
if (request.Stale.HasValue)
65+
kvs.Add(KeyNames.Stale, request.Stale.Value.AsString());
66+
67+
if (request.Limit.HasValue)
68+
kvs.Add(KeyNames.Limit, Serializer.ToJson(request.Limit.Value));
69+
70+
if (request.IncludeDocs.HasValue)
71+
kvs.Add(KeyNames.IncludeDocs, Serializer.ToJson(request.IncludeDocs.Value));
7272

73-
// if (request.Ranges != null)
74-
// kvs.Add(KeyNames.Ranges, Serializer.Serialize(request.Ranges));
75-
76-
// if (request.HasCounts())
77-
// kvs.Add(KeyNames.Counts, Serializer.ToJsonArray(request.Counts.ToArray()));
78-
79-
// if (!string.IsNullOrWhiteSpace(request.GroupField))
80-
// kvs.Add(KeyNames.GroupField, request.GroupField);
81-
82-
// if (request.GroupLimit.HasValue)
83-
// kvs.Add(KeyNames.GroupLimit, Serializer.ToJson(request.GroupLimit.Value));
84-
85-
// if (request.HasGroupSortings())
86-
// kvs.Add(KeyNames.GroupSort, Serializer.ToJsonArray(request.GroupSort.ToArray()));
87-
88-
// if (request.DrillDown.HasValue)
89-
// kvs.Add(KeyNames.DrillDown, Serializer.ToJsonArray(new[] { request.DrillDown.Value.Key, request.DrillDown.Value.Value }));
90-
91-
// return kvs;
92-
// }
93-
94-
// protected static class KeyNames
95-
// {
96-
// public const string Expression = "q";
97-
// public const string Sort = "sort";
98-
// public const string Bookmark = "bookmark";
99-
// public const string Stale = "stale";
100-
// public const string Limit = "limit";
101-
// public const string IncludeDocs = "include_docs";
102-
// public const string Ranges = "ranges";
103-
// public const string Counts = "counts";
104-
// public const string GroupField = "group_field";
105-
// public const string GroupLimit = "group_limit";
106-
// public const string GroupSort = "group_sort";
107-
// public const string DrillDown = "drilldown";
108-
// }
109-
// }
110-
//}
73+
if (request.Ranges != null)
74+
kvs.Add(KeyNames.Ranges, Serializer.Serialize(request.Ranges));
75+
76+
if (request.HasCounts())
77+
kvs.Add(KeyNames.Counts, Serializer.ToJsonArray(request.Counts.ToArray()));
78+
79+
if (!string.IsNullOrWhiteSpace(request.GroupField))
80+
kvs.Add(KeyNames.GroupField, request.GroupField);
81+
82+
if (request.GroupLimit.HasValue)
83+
kvs.Add(KeyNames.GroupLimit, Serializer.ToJson(request.GroupLimit.Value));
84+
85+
if (request.HasGroupSortings())
86+
kvs.Add(KeyNames.GroupSort, Serializer.ToJsonArray(request.GroupSort.ToArray()));
87+
88+
if (request.DrillDown.HasValue)
89+
kvs.Add(KeyNames.DrillDown, Serializer.ToJsonArray(new[] { request.DrillDown.Value.Key, request.DrillDown.Value.Value }));
90+
91+
return kvs;
92+
}
93+
94+
protected static class KeyNames
95+
{
96+
public const string Expression = "q";
97+
public const string Sort = "sort";
98+
public const string Bookmark = "bookmark";
99+
public const string Stale = "stale";
100+
public const string Limit = "limit";
101+
public const string IncludeDocs = "include_docs";
102+
public const string Ranges = "ranges";
103+
public const string Counts = "counts";
104+
public const string GroupField = "group_field";
105+
public const string GroupLimit = "group_limit";
106+
public const string GroupSort = "group_sort";
107+
public const string DrillDown = "drilldown";
108+
}
109+
}
110+
}

source/projects/MyCouch/IMyCouchClient.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public interface IMyCouchClient : IDisposable
6565
///// <summary>
6666
///// Used to access Search Indexes.
6767
///// </summary>
68-
//ISearches Searches { get; }
68+
ISearches Searches { get; }
6969

7070
/// <summary>
7171
/// View oriented API operations, for accessing and managing views.

0 commit comments

Comments
 (0)