Example #1
0
 public RetrieveDocumentIdsVisitor(MapQueryResultRetriever resultsRetriever, QueryMetadata metadata, ByteStringContext allocator) : base(metadata.Query.QueryText)
 {
     _query            = metadata.Query;
     _resultsRetriever = resultsRetriever;
     _metadata         = metadata;
     _allocator        = allocator;
 }
Example #2
0
 public RetrieveDocumentIdsVisitor(TransactionOperationContext serverContext, DocumentsOperationContext context, QueryMetadata metadata, ByteStringContext allocator) : base(metadata.Query.QueryText)
 {
     _query         = metadata.Query;
     _serverContext = serverContext;
     _context       = context;
     _metadata      = metadata;
     _allocator     = allocator;
 }
Example #3
0
        private static QueryFieldName ExtractIndexFieldName(Query query, BlittableJsonReaderObject parameters, QueryExpression field, QueryMetadata metadata)
        {
            if (field is FieldExpression fe)
            {
                return(metadata.GetIndexFieldName(fe, parameters));
            }

            if (field is ValueExpression ve)
            {
                return(metadata.GetIndexFieldName(new QueryFieldName(ve.Token, false), parameters));
            }

            if (field is MethodExpression me)
            {
                var methodType = QueryMethod.GetMethodType(me.Name.Value);
                switch (methodType)
                {
                case MethodType.Id:
                    if (me.Arguments == null || me.Arguments.Count == 0)
                    {
                        return(QueryFieldName.DocumentId);
                    }
                    if (me.Arguments[0] is FieldExpression docAlias && docAlias.Compound.Count == 1 && docAlias.Compound[0].Equals(query.From.Alias))
                    {
                        return(QueryFieldName.DocumentId);
                    }
                    throw new InvalidQueryException("id() can only be used on the root query alias but got: " + me.Arguments[0], query.QueryText, parameters);

                case MethodType.Count:
                    if (me.Arguments == null || me.Arguments.Count == 0)
                    {
                        return(QueryFieldName.Count);
                    }
                    if (me.Arguments[0] is FieldExpression countAlias && countAlias.Compound.Count == 1 && countAlias.Compound[0].Equals(query.From.Alias))
                    {
                        return(QueryFieldName.Count);
                    }

                    throw new InvalidQueryException("count() can only be used on the root query alias but got: " + me.Arguments[0], query.QueryText, parameters);

                case MethodType.Sum:
                    if (me.Arguments != null && me.Arguments.Count == 1 &&
                        me.Arguments[0] is FieldExpression f &&
                        f.Compound.Count == 1)
                    {
                        return(new QueryFieldName(f.Compound[0], f.IsQuoted));
                    }

                    throw new InvalidQueryException("sum() must be called with a single field name, but was called: " + me, query.QueryText, parameters);

                default:
                    throw new InvalidQueryException("Method " + me.Name.Value + " cannot be used in an expression in this manner", query.QueryText, parameters);
                }
            }

            throw new InvalidQueryException("Expected field, got: " + field, query.QueryText, parameters);
        }
Example #4
0
        public static (object Value, ValueTokenType Type) GetValue(string fieldName, Query query, QueryMetadata metadata, BlittableJsonReaderObject parameters,
                                                                   QueryExpression expr)
        {
            var value = expr as ValueExpression;

            if (value == null)
            {
                throw new InvalidQueryException("Expected value, but got: " + expr, query.QueryText, parameters);
            }

            if (value.Value == ValueTokenType.Parameter)
            {
                var parameterName = value.Token.Value;

                if (parameters == null)
                {
                    ThrowParametersWereNotProvided(metadata.QueryText);
                }

                if (parameters.TryGetMember(parameterName, out var parameterValue) == false)
                {
                    ThrowParameterValueWasNotProvided(parameterName, metadata.QueryText, parameters);
                }

                var parameterValueType = GetValueTokenType(parameterValue, metadata.QueryText, parameters);

                return(UnwrapParameter(parameterValue, parameterValueType), parameterValueType);
            }

            switch (value.Value)
            {
            case ValueTokenType.String:
                return(value.Token, ValueTokenType.String);

            case ValueTokenType.Long:
                var valueAsLong = long.Parse(value.Token);
                return(valueAsLong, ValueTokenType.Long);

            case ValueTokenType.Double:
                var valueAsDouble = double.Parse(value.Token, CultureInfo.InvariantCulture);
                return(valueAsDouble, ValueTokenType.Double);

            case ValueTokenType.True:
                return(LuceneDocumentConverterBase.TrueString, ValueTokenType.String);

            case ValueTokenType.False:
                return(LuceneDocumentConverterBase.FalseString, ValueTokenType.String);

            case ValueTokenType.Null:
                return(null, ValueTokenType.String);

            default:
                throw new ArgumentOutOfRangeException(nameof(value.Type), value.Type, null);
            }
        }
Example #5
0
        private static Shape HandleWkt(Query query, MethodExpression expression, QueryMetadata metadata, BlittableJsonReaderObject parameters, string fieldName,
                                       SpatialField spatialField)
        {
            var wktValue = GetValue(fieldName, query, metadata, parameters, (ValueExpression)expression.Arguments[0]);

            AssertValueIsString(fieldName, wktValue.Type);

            SpatialUnits?spatialUnits = null;

            if (expression.Arguments.Count == 2)
            {
                spatialUnits = GetSpatialUnits(query, expression.Arguments[3] as ValueExpression, metadata, parameters, fieldName);
            }

            return(spatialField.ReadShape((string)wktValue.Value, spatialUnits));
        }
Example #6
0
        private static Lucene.Net.Search.Query HandleEndsWith(Query query, MethodExpression expression, QueryMetadata metadata, BlittableJsonReaderObject parameters)
        {
            var fieldName = ExtractIndexFieldName(query, parameters, expression.Arguments[0], metadata);

            var(value, valueType) = GetValue(fieldName, query, metadata, parameters, (ValueExpression)expression.Arguments[1]);

            if (valueType != ValueTokenType.String)
            {
                ThrowMethodExpectsArgumentOfTheFollowingType("endsWith", ValueTokenType.String, valueType, metadata.QueryText, parameters);
            }

            var valueAsString = GetValueAsString(value);

            valueAsString = string.IsNullOrEmpty(valueAsString)
                ? LuceneQueryHelper.Asterisk
                : valueAsString.Insert(0, LuceneQueryHelper.Asterisk);

            return(LuceneQueryHelper.Term(fieldName, valueAsString, LuceneTermType.WildCard));
        }
Example #7
0
        private static SpatialUnits?GetSpatialUnits(Query query, ValueExpression value, QueryMetadata metadata, BlittableJsonReaderObject parameters, string fieldName)
        {
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            var spatialUnitsValue = GetValue(fieldName, query, metadata, parameters, value);

            AssertValueIsString(fieldName, spatialUnitsValue.Type);

            var spatialUnitsValueAsString = spatialUnitsValue.Value.ToString();

            if (Enum.TryParse(typeof(SpatialUnits), spatialUnitsValueAsString, true, out var su) == false)
            {
                throw new InvalidOperationException(
                          $"{nameof(SpatialUnits)} value must be either '{SpatialUnits.Kilometers}' or '{SpatialUnits.Miles}' but was '{spatialUnitsValueAsString}'.");
            }

            return((SpatialUnits)su);
        }
Example #8
0
        private static Lucene.Net.Search.Query HandleLucene(Query query, MethodExpression expression, QueryMetadata metadata, BlittableJsonReaderObject parameters,
                                                            Analyzer analyzer)
        {
            var fieldName = ExtractIndexFieldName(query, parameters, expression.Arguments[0], metadata);

            var(value, valueType) = GetValue(fieldName, query, metadata, parameters, (ValueExpression)expression.Arguments[1]);

            if (valueType != ValueTokenType.String)
            {
                ThrowMethodExpectsArgumentOfTheFollowingType("lucene", ValueTokenType.String, valueType, metadata.QueryText, parameters);
            }

            if (metadata.IsDynamic)
            {
                fieldName = new QueryFieldName(AutoIndexField.GetSearchAutoIndexFieldName(fieldName.Value), fieldName.IsQuoted);
            }

            var parser = new Lucene.Net.QueryParsers.QueryParser(Version.LUCENE_29, fieldName, analyzer);

            return(parser.Parse(GetValueAsString(value)));
        }
Example #9
0
        private static IEnumerable <(string Value, ValueTokenType Type)> GetValuesForIn(
            JsonOperationContext context,
            Query query,
            InExpression expression,
            QueryMetadata metadata,
            BlittableJsonReaderObject parameters,
            string fieldName)
        {
            foreach (var val in expression.Values)
            {
                var valueToken = val as ValueExpression;
                if (valueToken == null)
                {
                    ThrowInvalidInValue(query, parameters, val);
                }

                foreach (var(value, type) in GetValues(fieldName, query, metadata, parameters, valueToken))
                {
                    string valueAsString;
                    switch (type)
                    {
                    case ValueTokenType.Long:
                        var valueAsLong = (long)value;
                        valueAsString = valueAsLong.ToString(CultureInfo.InvariantCulture);
                        break;

                    case ValueTokenType.Double:
                        var valueAsDbl = (double)value;
                        valueAsString = valueAsDbl.ToString("G");
                        break;

                    default:
                        valueAsString = value?.ToString();
                        break;
                    }

                    yield return(valueAsString, type);
                }
            }
        }
Example #10
0
        private static Shape HandleCircle(Query query, MethodExpression expression, QueryMetadata metadata, BlittableJsonReaderObject parameters, string fieldName,
                                          SpatialField spatialField)
        {
            var radius = GetValue(fieldName, query, metadata, parameters, (ValueExpression)expression.Arguments[0]);

            AssertValueIsNumber(fieldName, radius.Type);

            var latitute = GetValue(fieldName, query, metadata, parameters, (ValueExpression)expression.Arguments[1]);

            AssertValueIsNumber(fieldName, latitute.Type);

            var longitude = GetValue(fieldName, query, metadata, parameters, (ValueExpression)expression.Arguments[2]);

            AssertValueIsNumber(fieldName, longitude.Type);

            SpatialUnits?spatialUnits = null;

            if (expression.Arguments.Count == 4)
            {
                spatialUnits = GetSpatialUnits(query, expression.Arguments[3] as ValueExpression, metadata, parameters, fieldName);
            }

            return(spatialField.ReadCircle(Convert.ToDouble(radius.Value), Convert.ToDouble(latitute.Value), Convert.ToDouble(longitude.Value), spatialUnits));
        }
Example #11
0
        private static Lucene.Net.Search.Query HandleSpatial(Query query, MethodExpression expression, QueryMetadata metadata, BlittableJsonReaderObject parameters,
                                                             MethodType spatialMethod, Func <string, SpatialField> getSpatialField)
        {
            string fieldName;

            if (metadata.IsDynamic == false)
            {
                fieldName = ExtractIndexFieldName(query, parameters, expression.Arguments[0], metadata);
            }
            else
            {
                var spatialExpression = (MethodExpression)expression.Arguments[0];
                fieldName = spatialExpression.GetText();
            }

            var shapeExpression = (MethodExpression)expression.Arguments[1];

            var distanceErrorPct = Constants.Documents.Indexing.Spatial.DefaultDistanceErrorPct;

            if (expression.Arguments.Count == 3)
            {
                var distanceErrorPctValue = GetValue(fieldName, query, metadata, parameters, (ValueExpression)expression.Arguments[2]);
                AssertValueIsNumber(fieldName, distanceErrorPctValue.Type);

                distanceErrorPct = Convert.ToDouble(distanceErrorPctValue.Value);
            }

            var spatialField = getSpatialField(fieldName);

            var methodName = shapeExpression.Name;
            var methodType = QueryMethod.GetMethodType(methodName);

            Shape shape = null;

            switch (methodType)
            {
            case MethodType.Circle:
                shape = HandleCircle(query, shapeExpression, metadata, parameters, fieldName, spatialField);
                break;

            case MethodType.Wkt:
                shape = HandleWkt(query, shapeExpression, metadata, parameters, fieldName, spatialField);
                break;

            default:
                QueryMethod.ThrowMethodNotSupported(methodType, metadata.QueryText, parameters);
                break;
            }

            Debug.Assert(shape != null);

            SpatialOperation operation = null;

            switch (spatialMethod)
            {
            case MethodType.Within:
                operation = SpatialOperation.IsWithin;
                break;

            case MethodType.Contains:
                operation = SpatialOperation.Contains;
                break;

            case MethodType.Disjoint:
                operation = SpatialOperation.IsDisjointTo;
                break;

            case MethodType.Intersects:
                operation = SpatialOperation.Intersects;
                break;

            default:
                QueryMethod.ThrowMethodNotSupported(spatialMethod, metadata.QueryText, parameters);
                break;
            }

            Debug.Assert(operation != null);

            var args = new SpatialArgs(operation, shape)
            {
                DistErrPct = distanceErrorPct
            };

            return(spatialField.Strategy.MakeQuery(args));
        }
Example #12
0
        private static Lucene.Net.Search.Query ToLuceneQuery(JsonOperationContext context, Query query, QueryExpression expression, QueryMetadata metadata,
                                                             BlittableJsonReaderObject parameters, Analyzer analyzer, Func <string, SpatialField> getSpatialField, bool exact = false)
        {
            if (expression == null)
            {
                return(new MatchAllDocsQuery());
            }

            if (expression is BinaryExpression where)
            {
                switch (where.Operator)
                {
                case OperatorType.Equal:
                case OperatorType.NotEqual:
                case OperatorType.GreaterThan:
                case OperatorType.LessThan:
                case OperatorType.LessThanEqual:
                case OperatorType.GreaterThanEqual:
                {
                    var fieldName = ExtractIndexFieldName(query, parameters, where.Left, metadata);
                    var(value, valueType) = GetValue(fieldName, query, metadata, parameters, where.Right);

                    var(luceneFieldName, fieldType, termType) = GetLuceneField(fieldName, valueType);

                    switch (fieldType)
                    {
                    case LuceneFieldType.String:
                        var valueAsString = GetValueAsString(value);


                        if (exact && metadata.IsDynamic)
                        {
                            luceneFieldName = AutoIndexField.GetExactAutoIndexFieldName(luceneFieldName);
                        }

                        switch (where.Operator)
                        {
                        case OperatorType.Equal:
                            return(LuceneQueryHelper.Equal(luceneFieldName, termType, valueAsString, exact));

                        case OperatorType.NotEqual:
                            return(LuceneQueryHelper.NotEqual(luceneFieldName, termType, valueAsString, exact));

                        case OperatorType.LessThan:
                            return(LuceneQueryHelper.LessThan(luceneFieldName, termType, valueAsString, exact));

                        case OperatorType.GreaterThan:
                            return(LuceneQueryHelper.GreaterThan(luceneFieldName, termType, valueAsString, exact));

                        case OperatorType.LessThanEqual:
                            return(LuceneQueryHelper.LessThanOrEqual(luceneFieldName, termType, valueAsString, exact));

                        case OperatorType.GreaterThanEqual:
                            return(LuceneQueryHelper.GreaterThanOrEqual(luceneFieldName, termType, valueAsString, exact));
                        }
                        break;

                    case LuceneFieldType.Long:
                        var valueAsLong = (long)value;

                        switch (where.Operator)
                        {
                        case OperatorType.Equal:
                            return(LuceneQueryHelper.Equal(luceneFieldName, termType, valueAsLong));

                        case OperatorType.NotEqual:
                            return(LuceneQueryHelper.NotEqual(luceneFieldName, termType, valueAsLong));

                        case OperatorType.LessThan:
                            return(LuceneQueryHelper.LessThan(luceneFieldName, termType, valueAsLong));

                        case OperatorType.GreaterThan:
                            return(LuceneQueryHelper.GreaterThan(luceneFieldName, termType, valueAsLong));

                        case OperatorType.LessThanEqual:
                            return(LuceneQueryHelper.LessThanOrEqual(luceneFieldName, termType, valueAsLong));

                        case OperatorType.GreaterThanEqual:
                            return(LuceneQueryHelper.GreaterThanOrEqual(luceneFieldName, termType, valueAsLong));
                        }
                        break;

                    case LuceneFieldType.Double:
                        var valueAsDouble = (double)value;

                        switch (where.Operator)
                        {
                        case OperatorType.Equal:
                            return(LuceneQueryHelper.Equal(luceneFieldName, termType, valueAsDouble));

                        case OperatorType.NotEqual:
                            return(LuceneQueryHelper.NotEqual(luceneFieldName, termType, valueAsDouble));

                        case OperatorType.LessThan:
                            return(LuceneQueryHelper.LessThan(luceneFieldName, termType, valueAsDouble));

                        case OperatorType.GreaterThan:
                            return(LuceneQueryHelper.GreaterThan(luceneFieldName, termType, valueAsDouble));

                        case OperatorType.LessThanEqual:
                            return(LuceneQueryHelper.LessThanOrEqual(luceneFieldName, termType, valueAsDouble));

                        case OperatorType.GreaterThanEqual:
                            return(LuceneQueryHelper.GreaterThanOrEqual(luceneFieldName, termType, valueAsDouble));
                        }
                        break;

                    default:
                        throw new ArgumentOutOfRangeException(nameof(fieldType), fieldType, null);
                    }

                    throw new NotSupportedException("Should not happen!");
                }

                case OperatorType.And:
                case OperatorType.AndNot:
                    var andPrefix = where.Operator == OperatorType.AndNot ? LucenePrefixOperator.Minus : LucenePrefixOperator.None;
                    return(LuceneQueryHelper.And(
                               ToLuceneQuery(context, query, where.Left, metadata, parameters, analyzer, getSpatialField, exact),
                               LucenePrefixOperator.None,
                               ToLuceneQuery(context, query, where.Right, metadata, parameters, analyzer, getSpatialField, exact),
                               andPrefix));

                case OperatorType.Or:
                case OperatorType.OrNot:
                    var orPrefix = where.Operator == OperatorType.OrNot ? LucenePrefixOperator.Minus : LucenePrefixOperator.None;
                    return(LuceneQueryHelper.Or(
                               ToLuceneQuery(context, query, where.Left, metadata, parameters, analyzer, getSpatialField, exact),
                               LucenePrefixOperator.None,
                               ToLuceneQuery(context, query, where.Right, metadata, parameters, analyzer, getSpatialField, exact),
                               orPrefix));
                }
            }
            if (expression is BetweenExpression be)
            {
                var fieldName = ExtractIndexFieldName(query, parameters, be.Source, metadata);
                var(valueFirst, valueFirstType) = GetValue(fieldName, query, metadata, parameters, be.Min);
                var(valueSecond, _)             = GetValue(fieldName, query, metadata, parameters, be.Max);

                var(luceneFieldName, fieldType, termType) = GetLuceneField(fieldName, valueFirstType);

                switch (fieldType)
                {
                case LuceneFieldType.String:
                    var valueFirstAsString  = GetValueAsString(valueFirst);
                    var valueSecondAsString = GetValueAsString(valueSecond);
                    return(LuceneQueryHelper.Between(luceneFieldName, termType, valueFirstAsString, valueSecondAsString, exact));

                case LuceneFieldType.Long:
                    var valueFirstAsLong  = (long)valueFirst;
                    var valueSecondAsLong = (long)valueSecond;
                    return(LuceneQueryHelper.Between(luceneFieldName, termType, valueFirstAsLong, valueSecondAsLong));

                case LuceneFieldType.Double:
                    var valueFirstAsDouble  = (double)valueFirst;
                    var valueSecondAsDouble = (double)valueSecond;
                    return(LuceneQueryHelper.Between(luceneFieldName, termType, valueFirstAsDouble, valueSecondAsDouble));

                default:
                    throw new ArgumentOutOfRangeException(nameof(fieldType), fieldType, null);
                }
            }
            if (expression is InExpression ie)
            {
                var            fieldName         = ExtractIndexFieldName(query, parameters, ie.Source, metadata);
                LuceneTermType termType          = LuceneTermType.Null;
                bool           hasGotTheRealType = false;

                if (ie.All)
                {
                    var allInQuery = new BooleanQuery();
                    foreach (var value in GetValuesForIn(context, query, ie, metadata, parameters, fieldName))
                    {
                        if (hasGotTheRealType == false)
                        {
                            // here we assume that all the values are of the same type
                            termType          = GetLuceneField(fieldName, value.Type).LuceneTermType;
                            hasGotTheRealType = true;
                        }
                        if (exact && metadata.IsDynamic)
                        {
                            fieldName = new QueryFieldName(AutoIndexField.GetExactAutoIndexFieldName(fieldName.Value), fieldName.IsQuoted);
                        }

                        allInQuery.Add(LuceneQueryHelper.Equal(fieldName, termType, value.Value, exact), Occur.MUST);
                    }

                    return(allInQuery);
                }
                var matches = new List <string>();
                foreach (var tuple in GetValuesForIn(context, query, ie, metadata, parameters, fieldName))
                {
                    if (hasGotTheRealType == false)
                    {
                        // we assume that the type of all the parameters is the same
                        termType          = GetLuceneField(fieldName, tuple.Type).LuceneTermType;
                        hasGotTheRealType = true;
                    }
                    matches.Add(LuceneQueryHelper.GetTermValue(tuple.Value, termType, exact));
                }

                return(new TermsMatchQuery(fieldName, matches));
            }
            if (expression is TrueExpression)
            {
                return(new MatchAllDocsQuery());
            }
            if (expression is MethodExpression me)
            {
                var methodName = me.Name.Value;
                var methodType = QueryMethod.GetMethodType(methodName);

                switch (methodType)
                {
                case MethodType.Search:
                    return(HandleSearch(query, me, metadata, parameters, analyzer));

                case MethodType.Boost:
                    return(HandleBoost(context, query, me, metadata, parameters, analyzer, getSpatialField, exact));

                case MethodType.StartsWith:
                    return(HandleStartsWith(query, me, metadata, parameters));

                case MethodType.EndsWith:
                    return(HandleEndsWith(query, me, metadata, parameters));

                case MethodType.Lucene:
                    return(HandleLucene(query, me, metadata, parameters, analyzer));

                case MethodType.Exists:
                    return(HandleExists(query, parameters, me, metadata));

                case MethodType.Exact:
                    return(HandleExact(context, query, me, metadata, parameters, analyzer, getSpatialField));

                case MethodType.Within:
                case MethodType.Contains:
                case MethodType.Disjoint:
                case MethodType.Intersects:
                    return(HandleSpatial(query, me, metadata, parameters, methodType, getSpatialField));

                default:
                    QueryMethod.ThrowMethodNotSupported(methodType, metadata.QueryText, parameters);
                    return(null);    // never hit
                }
            }

            throw new InvalidQueryException("Unable to understand query", query.QueryText, parameters);
        }
Example #13
0
 public RetrieveDocumentIdsVisitor(QueryMetadata metadata, ByteStringContext allocator) : base(metadata.Query.QueryText)
 {
     _query     = metadata.Query;
     _metadata  = metadata;
     _allocator = allocator;
 }
Example #14
0
        private static Lucene.Net.Search.Query HandleExists(Query query, BlittableJsonReaderObject parameters, MethodExpression expression, QueryMetadata metadata)
        {
            var fieldName = ExtractIndexFieldName(query, parameters, expression.Arguments[0], metadata);

            return(LuceneQueryHelper.Term(fieldName, LuceneQueryHelper.Asterisk, LuceneTermType.WildCard));
        }
Example #15
0
        public static IEnumerable <(object Value, ValueTokenType Type)> GetValues(string fieldName, Query query, QueryMetadata metadata,
                                                                                  BlittableJsonReaderObject parameters, ValueExpression value)
        {
            if (value.Value == ValueTokenType.Parameter)
            {
                var parameterName = value.Token.Value;

                if (parameters == null)
                {
                    ThrowParametersWereNotProvided(metadata.QueryText);
                }

                if (parameters.TryGetMember(parameterName, out var parameterValue) == false)
                {
                    ThrowParameterValueWasNotProvided(parameterName, metadata.QueryText, parameters);
                }

                var array = parameterValue as BlittableJsonReaderArray;
                if (array != null)
                {
                    ValueTokenType?expectedValueType = null;
                    foreach (var item in UnwrapArray(array, metadata.QueryText, parameters))
                    {
                        if (expectedValueType == null)
                        {
                            expectedValueType = item.Type;
                        }
                        else
                        {
                            if (AreValueTokenTypesValid(expectedValueType.Value, item.Type) == false)
                            {
                                ThrowInvalidParameterType(expectedValueType.Value, item, metadata.QueryText, parameters);
                            }
                        }

                        yield return(item);
                    }

                    yield break;
                }

                var parameterValueType = GetValueTokenType(parameterValue, metadata.QueryText, parameters);

                yield return(UnwrapParameter(parameterValue, parameterValueType), parameterValueType);

                yield break;
            }

            switch (value.Value)
            {
            case ValueTokenType.String:
                yield return(value.Token.Value, ValueTokenType.String);

                yield break;

            case ValueTokenType.Long:
                var valueAsLong = long.Parse(value.Token.Value);
                yield return(valueAsLong, ValueTokenType.Long);

                yield break;

            case ValueTokenType.Double:
                var valueAsDouble = double.Parse(value.Token.Value, CultureInfo.InvariantCulture);
                yield return(valueAsDouble, ValueTokenType.Double);

                yield break;

            case ValueTokenType.True:
                yield return(LuceneDocumentConverterBase.TrueString, ValueTokenType.String);

                yield break;

            case ValueTokenType.False:
                yield return(LuceneDocumentConverterBase.FalseString, ValueTokenType.String);

                yield break;

            case ValueTokenType.Null:
                yield return(null, ValueTokenType.String);

                yield break;

            default:
                throw new ArgumentOutOfRangeException(nameof(value.Type), value.Type, null);
            }
        }
Example #16
0
 private static Lucene.Net.Search.Query HandleExact(JsonOperationContext context, Query query, MethodExpression expression, QueryMetadata metadata,
                                                    BlittableJsonReaderObject parameters, Analyzer analyzer, Func <string, SpatialField> getSpatialField)
 {
     return(ToLuceneQuery(context, query, expression.Arguments[0], metadata, parameters, analyzer, getSpatialField, exact: true));
 }
Example #17
0
        private static Lucene.Net.Search.Query HandleBoost(JsonOperationContext context, Query query, MethodExpression expression, QueryMetadata metadata,
                                                           BlittableJsonReaderObject parameters, Analyzer analyzer, Func <string, SpatialField> getSpatialField, bool exact)
        {
            var boost = float.Parse(((ValueExpression)expression.Arguments[1]).Token.Value);

            var q = ToLuceneQuery(context, query, expression.Arguments[0], metadata, parameters, analyzer, getSpatialField, exact);

            q.Boost = boost;

            return(q);
        }
Example #18
0
        private static Lucene.Net.Search.Query HandleSearch(Query query, MethodExpression expression, QueryMetadata metadata, BlittableJsonReaderObject parameters,
                                                            Analyzer analyzer)
        {
            QueryFieldName fieldName;

            if (expression.Arguments[0] is FieldExpression ft)
            {
                fieldName = ExtractIndexFieldName(query, parameters, ft, metadata);
            }
            else if (expression.Arguments[0] is ValueExpression vt)
            {
                fieldName = ExtractIndexFieldName(vt, metadata, parameters);
            }
            else
            {
                throw new InvalidOperationException("search() method can only be called with an identifier or string, but was called with " + expression.Arguments[0]);
            }

            var(value, valueType) = GetValue(fieldName, query, metadata, parameters, (ValueExpression)expression.Arguments[1]);

            if (valueType != ValueTokenType.String)
            {
                ThrowMethodExpectsArgumentOfTheFollowingType("search", ValueTokenType.String, valueType, metadata.QueryText, parameters);
            }

            Debug.Assert(metadata.IsDynamic == false || metadata.WhereFields[fieldName].IsFullTextSearch);

            var valueAsString = GetValueAsString(value);
            var values        = valueAsString.Split(' ');

            if (metadata.IsDynamic)
            {
                fieldName = new QueryFieldName(AutoIndexField.GetSearchAutoIndexFieldName(fieldName.Value), fieldName.IsQuoted);
            }

            if (values.Length == 1)
            {
                var nValue = values[0];
                return(LuceneQueryHelper.AnalyzedTerm(fieldName, nValue, GetTermType(nValue), analyzer));
            }

            var occur = Occur.SHOULD;

            if (expression.Arguments.Count == 3)
            {
                var fieldExpression = (FieldExpression)expression.Arguments[2];
                if (fieldExpression.Compound.Count != 1)
                {
                    ThrowInvalidOperatorInSearch(metadata, parameters, fieldExpression);
                }

                var op = fieldExpression.Compound[0];
                if (string.Equals("AND", op, StringComparison.OrdinalIgnoreCase))
                {
                    occur = Occur.MUST;
                }
                else if (string.Equals("OR", op, StringComparison.OrdinalIgnoreCase))
                {
                    occur = Occur.SHOULD;
                }
                else
                {
                    ThrowInvalidOperatorInSearch(metadata, parameters, fieldExpression);
                }
            }

            var q = new BooleanQuery();

            foreach (var v in values)
            {
                q.Add(LuceneQueryHelper.AnalyzedTerm(fieldName, v, GetTermType(v), analyzer), occur);
            }

            return(q);

            LuceneTermType GetTermType(string termValue)
            {
                if (string.IsNullOrEmpty(termValue))
                {
                    return(LuceneTermType.String);
                }

                if (termValue[0] == LuceneQueryHelper.AsteriskChar)
                {
                    return(LuceneTermType.WildCard);
                }

                if (termValue[termValue.Length - 1] == LuceneQueryHelper.AsteriskChar)
                {
                    if (termValue[termValue.Length - 2] != '\\')
                    {
                        return(LuceneTermType.Prefix);
                    }
                }

                return(LuceneTermType.String);
            }
        }
Example #19
0
 private static void ThrowInvalidInValue(Query query, BlittableJsonReaderObject parameters, QueryExpression val)
 {
     throw new InvalidQueryException("Expected in argument to be value, but was: " + val, query.QueryText, parameters);
 }