forked from ravendb/ravendb
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathJustin.cs
236 lines (204 loc) · 8.67 KB
/
Justin.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
using System;
using Raven.Abstractions.Exceptions;
using Raven.Client;
using Raven.Client.Linq;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Raven.Client.Document;
using Raven.Client.Embedded;
using Raven.Client.Indexes;
using Raven.Tests.Common;
using Xunit;
namespace Raven.Tests.MailingList
{
public class Justin : RavenTest
{
[Fact]
public void ActualTest()
{
// Arrange.
using (var documentStore = NewDocumentStore())
{
new Users_NameAndPassportSearching().Execute(documentStore);
var users = CreateFakeUsers();
var usersCount = users.Count();
using (var documentSession = documentStore.OpenSession())
{
foreach (var user in users)
{
documentSession.Store(user);
}
documentSession.SaveChanges();
}
// If we want to search for *Krome .. this means the index will contain
// 'emorK eruP' .. so we need to reverse the search query string.
var userSearchQuery = new string("Krome".Reverse().ToArray());
var passportSearchQuery = new string("12345".Reverse().ToArray());
// Act.
// Lets check if there are any errors.
var errors = documentStore.DatabaseCommands.GetStatistics().Errors;
Assert.Empty(errors);
using (var documentSession = documentStore.OpenSession())
{
var allData = documentSession
.Query<User>()
.Customize(x => x.WaitForNonStaleResults())
.ToList();
Assert.Equal(usersCount, allData.Count);
var specificUsers = documentSession
.Query<Users_NameAndPassportSearching.ReduceResult, Users_NameAndPassportSearching>()
.Customize(x => x.WaitForNonStaleResults())
.Where(x => x.ReversedName.StartsWith(userSearchQuery))
.As<User>()
.ToList();
var passports = documentSession
.Query<Users_NameAndPassportSearching.ReduceResult, Users_NameAndPassportSearching>()
.Customize(x => x.WaitForNonStaleResults())
.Where(x => x.ReversedName.StartsWith(passportSearchQuery))
.ToList();
}
}
}
[Fact]
public void ActualTest_IgnoreErrors()
{
// Arrange.
using (var server = GetNewServer())
using (var documentStore = new DocumentStore { Url = server.SystemDatabase.Configuration.ServerUrl }.Initialize())
{
Console.WriteLine("Document Store initialized - running in memory.");
Assert.Throws<IndexCompilationException>(() => new Users_NameAndPassportSearching_WithError().Execute(documentStore));
var users = CreateFakeUsers();
var usersCount = users.Count();
using (var documentSession = documentStore.OpenSession())
{
foreach (var user in users)
{
documentSession.Store(user);
}
documentSession.SaveChanges();
}
Console.WriteLine("Seed data stored.");
// Act.
// Lets check if there are any errors.
var errors = documentStore.DatabaseCommands.GetStatistics().Errors;
if (errors != null && errors.Length > 0)
{
foreach (var error in errors)
{
Console.WriteLine("Index: {0}; Error: {1}", error.Index, error.Error);
}
return;
}
Console.WriteLine("No Document Store errors.");
using (var documentSession = documentStore.OpenSession())
{
var allData = documentSession
.Query<User>()
.Customize(x => x.WaitForNonStaleResults())
.ToList();
Assert.Equal(usersCount, allData.Count);
foreach (var user in allData)
{
Console.WriteLine("User: {0}; Passport: {1}", user.Name, user.PassportNumber);
}
}
// Assert.
}
}
private static IEnumerable<User> CreateFakeUsers()
{
return new List<User>
{
new User
{
Name = "Pure Krome",
Age = 36,
PassportNumber = "QWERTY-12345"
},
new User
{
Name = "Ayende Rayen",
Age = 35,
PassportNumber = "ABC-12345"
},
new User
{
Name = "Itamar Syn-Hershko",
Age = 34,
PassportNumber = "DEF-12345"
},
new User
{
Name = "aaa bbb",
Age = 33,
PassportNumber = "GHI-12345"
},
new User
{
Name = "ccc ddd",
Age = 32,
PassportNumber = "JKL-12345"
},
new User
{
Name = "eee fff",
Age = 31,
PassportNumber = "MNO-12345"
}
};
}
public class User
{
public string Name { get; set; }
public int Age { get; set; }
public string PassportNumber { get; set; }
}
internal class Users_NameAndPassportSearching_WithError : AbstractIndexCreationTask<User, Users_NameAndPassportSearching.ReduceResult>
{
public Users_NameAndPassportSearching_WithError()
{
Map = users => from user in users
select new
{
user.Name,
user.PassportNumber,
ReversedName = user.Name,
ReversedPassportNumber = user.PassportNumber,
};
// This result function will cause RavenDB to throw an error
Reduce = results => from r in results
select new
{
r.Name,
r.PassportNumber,
ReversedName = r.Name,
};
}
}
internal class Users_NameAndPassportSearching : AbstractIndexCreationTask<User, Users_NameAndPassportSearching.ReduceResult>
{
public Users_NameAndPassportSearching()
{
Map = users => from user in users
select new
{
user.Name,
user.PassportNumber,
ReversedName = user.Name.Reverse(),
ReversedPassportNumber = user.PassportNumber.Reverse(),
};
}
#region Nested type: ReduceResult
public class ReduceResult
{
public string Name { get; set; }
public string PassportNumber { get; set; }
public string ReversedName { get; set; }
public string ReversedPassportNumber { get; set; }
}
#endregion
}
}
}