如何检查 QueryContainer 是否具有特定属性?
How to check if QueryContainer has specific properties?
我在解析我自己的简单查询语言时为 NEST 客户端生成 Elasticsearch 查询。也就是说,解析器 returns a QueryDescriptor
(这是 Func<QueryContainerDescriptor<SearchResult>, QueryContainer>
的别名),然后可用于从 Elasticsearch 获取搜索结果。
当输入是像 nestedObject.someField:someValue
这样的查询时,将调用以下方法 GetQueryDescriptor
和 query == "nestedObject.someField:someValue"
。
// NestedObjectQueryToken.cs
public Func<QueryContainerDescriptor<SearchResult>, QueryContainer> GetQueryDescriptor(string query)
{
// GetFieldNames() extracts the fields that the user search in from the query
// (there could possibly be more than one field present)
var nestedFields = query.GetFieldNames().Select(fieldName => new Field("nestedObject." + fieldName));
return descriptor => descriptor.NestedFieldSearch(query, _ => _.Fields(fields));
}
// QueryDescriptorExtensions.cs
public static QueryContainer NestedFieldSearch(this QueryContainerDescriptor<SearchResult> descriptor,
string query, FieldsDescriptor nestedFields)
{
return descriptor.Nested(n => n
.Path("nestedObject")
.Query(sub => sub
.QueryString(queryString => queryString
.Query(query)
.Fields(nestedFields))))
}
SearchResult
是用于映射结果的 class。
QueryDescriptor
后来被应用到一个SearchDescriptor<SearchResult>
,这样就可以在NEST的Search
方法中使用了。
我希望 QueryDescriptor
具有特定的属性。在上面的示例中,它应该包含一个嵌套查询,其内部查询的字段设置为 "nestedObject.someField".
现在我想用单元测试来测试这个 属性,即不将查询发送到服务器。
我如何"look inside the QueryDescriptor
"断言其属性符合预期?
您可以通过将结果查询容器转换为 IQueryContainer
来实现此目的
QueryContainer Query(QueryContainerDescriptor<Document> q) =>
q.Term(t => t.Field(f => f.Name).Value("something"));
var actual = Query(new QueryContainerDescriptor<Document>()) as IQueryContainer;
Assert.AreEqual("something", actual.Term.Value);
希望对您有所帮助。
我在解析我自己的简单查询语言时为 NEST 客户端生成 Elasticsearch 查询。也就是说,解析器 returns a QueryDescriptor
(这是 Func<QueryContainerDescriptor<SearchResult>, QueryContainer>
的别名),然后可用于从 Elasticsearch 获取搜索结果。
当输入是像 nestedObject.someField:someValue
这样的查询时,将调用以下方法 GetQueryDescriptor
和 query == "nestedObject.someField:someValue"
。
// NestedObjectQueryToken.cs
public Func<QueryContainerDescriptor<SearchResult>, QueryContainer> GetQueryDescriptor(string query)
{
// GetFieldNames() extracts the fields that the user search in from the query
// (there could possibly be more than one field present)
var nestedFields = query.GetFieldNames().Select(fieldName => new Field("nestedObject." + fieldName));
return descriptor => descriptor.NestedFieldSearch(query, _ => _.Fields(fields));
}
// QueryDescriptorExtensions.cs
public static QueryContainer NestedFieldSearch(this QueryContainerDescriptor<SearchResult> descriptor,
string query, FieldsDescriptor nestedFields)
{
return descriptor.Nested(n => n
.Path("nestedObject")
.Query(sub => sub
.QueryString(queryString => queryString
.Query(query)
.Fields(nestedFields))))
}
SearchResult
是用于映射结果的 class。
QueryDescriptor
后来被应用到一个SearchDescriptor<SearchResult>
,这样就可以在NEST的Search
方法中使用了。
我希望 QueryDescriptor
具有特定的属性。在上面的示例中,它应该包含一个嵌套查询,其内部查询的字段设置为 "nestedObject.someField".
现在我想用单元测试来测试这个 属性,即不将查询发送到服务器。
我如何"look inside the QueryDescriptor
"断言其属性符合预期?
您可以通过将结果查询容器转换为 IQueryContainer
QueryContainer Query(QueryContainerDescriptor<Document> q) =>
q.Term(t => t.Field(f => f.Name).Value("something"));
var actual = Query(new QueryContainerDescriptor<Document>()) as IQueryContainer;
Assert.AreEqual("something", actual.Term.Value);
希望对您有所帮助。