Union type
editUnion type
editSome API parameters within Elasticsearch can accept more than one JSON data structure, for example, source filtering on a search request can accept
-
a
boolvalue to disable_sourceretrieval -
a
stringvalue representing a wildcard pattern to control what parts of_sourceto return -
an array of
stringvalues representing multiple wildcard patterns to control what parts of_sourceto return -
an
objectwithincludesandexcludesproperties that each accept an array of wildcard patterns to control what parts of_sourceto include and exclude, respectively.
That’s a lot of different flexibility! NEST includes a Union<TFirst,TSecond> type to make it easier to work with
these kinds of parameters, forming the union of two types, TFirst and TSecond.
Implicit conversion
editThe Union<TFirst,TSecond> has implicit operators to convert from an instance of TFirst or TSecond to an
instance of Union<TFirst,TSecond>. This is often the easiest way of construction an instance
Union<bool, ISourceFilter> sourceFilterFalse = false;
Union<bool, ISourceFilter> sourceFilterInterface = new SourceFilter
{
Includes = new [] { "foo.*" }
};
Constructor
editSometimes, the constructor of Union<TFirst,TSecond> may be required in cases where the compiler is
unable to infer the correct implicit conversion
var sourceFilterTrue = new Union<bool, ISourceFilter>(true);
var sourceFilterInterface = new Union<bool, ISourceFilter>(new SourceFilter
{
Includes = new [] { "foo.*" }
});
Match
editThe Match method can be used to operate on the value encapsulated by the instance of Union<TFirst,TSecond>.
Two delegates are passed; one to operate on a TFirst value and the other to operate on a TSecond value.
sourceFilterTrue.Match(
b => b.Should().BeTrue(),
s => s.Should().BeNull());
sourceFilterInterface.Match(
b => b.Should().BeFalse(),
s => s.Should().NotBeNull());
The delegates can also return a value
var serializedFilterTrue = sourceFilterTrue.Match(
b => serializer.SerializeToString(b),
s => null);
serializedFilterTrue.Should().Be("true");
var serializedFilterInterface = sourceFilterTrue.Match(
b => null,
s => serializer.SerializeToString(s));
serializedFilterInterface.Should().Be("{\"includes\":[\"foo.*\"]}");