void ISearchValueVisitor.Visit(UriSearchValue uri)
        {
            EnsureArg.IsNotNull(uri, nameof(uri));

            switch (_modifier)
            {
            case null:
                _outputExpression = Expression.Equals(FieldName.Uri, _componentIndex, uri.Uri);
                break;

            case SearchModifierCode.Above:
                _outputExpression = Expression.And(
                    Expression.EndsWith(FieldName.Uri, _componentIndex, uri.Uri, false),
                    Expression.NotStartsWith(FieldName.Uri, _componentIndex, KnownUriSchemes.Urn, false));
                break;

            case SearchModifierCode.Below:
                _outputExpression = Expression.And(
                    Expression.StartsWith(FieldName.Uri, _componentIndex, uri.Uri, false),
                    Expression.NotStartsWith(FieldName.Uri, _componentIndex, KnownUriSchemes.Urn, false));
                break;

            default:
                ThrowModifierNotSupported();
                break;
            }
        }
        void ISearchValueVisitor.Visit(StringSearchValue s)
        {
            EnsureArg.IsNotNull(s, nameof(s));

            EnsureOnlyEqualComparatorIsSupported();

            if (_modifier == null)
            {
                // Based on spec http://hl7.org/fhir/STU3/search.html#string,
                // is case-insensitive search so we will normalize into lower case for search.
                _outputExpression = Expression.StartsWith(FieldName.String, _componentIndex, s.String, true);
            }
            else if (_modifier == SearchModifierCode.Exact)
            {
                _outputExpression = Expression.StringEquals(FieldName.String, _componentIndex, s.String, false);
            }
            else if (_modifier == SearchModifierCode.Contains)
            {
                // Based on spec http://hl7.org/fhir/STU3/search.html#modifiers,
                // contains is case-insensitive search so we will normalize into lower case for search.
                _outputExpression = Expression.Contains(FieldName.String, _componentIndex, s.String, true);
            }
            else
            {
                ThrowModifierNotSupported();
            }
        }