示例#1
0
        /// <summary>
        /// Get string filter to be used with Elasticsearch.
        /// </summary>
        /// <param name="searchCriteria">Search criteria.</param>
        /// <returns>String filter.</returns>
        private static String GetStringFilter(this WebSpeciesObservationFieldSearchCriteria searchCriteria)
        {
            if (searchCriteria.IsNotNull())
            {
                switch (searchCriteria.Operator)
                {
                    case CompareOperator.BeginsWith:
                        return "{ \"prefix\" : { \"" + GetFieldName(searchCriteria) + "_Lowercase" +
                               "\" : \"" + searchCriteria.Value.ToLower() + "\" }}";

                    case CompareOperator.Contains:
                        return "{\"query\" : { \"wildcard\" : { \"" + GetFieldName(searchCriteria) + "_Lowercase" +
                               "\" : \"*" + searchCriteria.Value.ToLower() + "*\"}}}";

                    case CompareOperator.EndsWith:
                        return "{\"query\" : { \"wildcard\" : { \"" + GetFieldName(searchCriteria) + "_Lowercase" +
                               "\" : \"*" + searchCriteria.Value.ToLower() + "\"}}}";

                    case CompareOperator.Equal:
                        return "{ \"term\" : { \"" + GetFieldName(searchCriteria) + "_Lowercase" +
                               "\" : \"" + searchCriteria.Value.ToLower() + "\" }}";

                    case CompareOperator.Like:
                        return "{\"query\" : { \"wildcard\" : { \"" + GetFieldName(searchCriteria) + "_Lowercase" +
                               "\" : \"" + searchCriteria.Value.ToLower() + "\"}}}";

                    case CompareOperator.NotEqual:
                        return "{not : { \"term\" : { \"" + GetFieldName(searchCriteria) + "_Lowercase" +
                                "\" : \"" + searchCriteria.Value.ToLower() + "\" }}}";

                    default:
                        throw new ArgumentException("Not handled string compare operator = " + searchCriteria.Operator);
                }
            }

            return null;
        }
示例#2
0
        /// <summary>
        /// Check that data is valid.
        /// </summary>
        /// <param name="searchCriteria">Search criteria.</param>
        /// <param name="mapping">Information about fields in Elasticsearch.</param>
        public static void CheckData(this WebSpeciesObservationFieldSearchCriteria searchCriteria,
                                     Dictionary<String, WebSpeciesObservationField> mapping)
        {
            String fieldName;
            WebSpeciesObservationField field;

            if (searchCriteria.IsNotNull())
            {
                searchCriteria.Class.CheckNotNull("Class");
                searchCriteria.Class.GetClass().CheckNotEmpty("Class string");
                searchCriteria.Property.CheckNotNull("Property");
                searchCriteria.Property.GetProperty().CheckNotEmpty("Property string");
                searchCriteria.Value.CheckNotEmpty("Value");
                searchCriteria.Value = searchCriteria.Value.CheckJsonInjection();

                fieldName = searchCriteria.GetFieldName();
                if (mapping.ContainsKey(fieldName))
                {
                    field = mapping[fieldName];
                }
                else
                {
                    throw new ArgumentException("No field in Elasticsearch with name = " + fieldName);
                }

                if ((fieldName == "Location_CoordinateX") ||
                    (fieldName == "Location_CoordinateY"))
                {
                    throw new ArgumentException("Can not make field search on field " + fieldName);
                }

                if ((field.Type != searchCriteria.Type) &&
                    !((field.Type == WebDataType.Int64) &&
                      (searchCriteria.Type == WebDataType.Int32)))
                {
                    throw new ArgumentException("Different data types. Field type = " + field.Type + ". Field search criteria type = " + searchCriteria.Type + ".");
                }

                switch (searchCriteria.Type)
                {
                    case WebDataType.Boolean:
                        if (!((searchCriteria.Operator == CompareOperator.Equal) ||
                              (searchCriteria.Operator == CompareOperator.NotEqual)))
                        {
                            throw new ArgumentException("Operator " + searchCriteria.Operator + " is not supported on data of type " + searchCriteria.Type + ".");
                        }
                        break;

                    case WebDataType.DateTime:
                    case WebDataType.Float64:
                    case WebDataType.Int32:
                    case WebDataType.Int64:
                        if (!((searchCriteria.Operator == CompareOperator.Equal) ||
                              (searchCriteria.Operator == CompareOperator.Greater) ||
                              (searchCriteria.Operator == CompareOperator.GreaterOrEqual) ||
                              (searchCriteria.Operator == CompareOperator.Less) ||
                              (searchCriteria.Operator == CompareOperator.LessOrEqual) ||
                              (searchCriteria.Operator == CompareOperator.NotEqual)))
                        {
                            throw new ArgumentException("Operator " + searchCriteria.Operator + " is not supported on data of type " + searchCriteria.Type + ".");
                        }
                        break;

                    case WebDataType.String:
                        if (!((searchCriteria.Operator == CompareOperator.BeginsWith) ||
                              (searchCriteria.Operator == CompareOperator.Contains) ||
                              (searchCriteria.Operator == CompareOperator.EndsWith) ||
                              (searchCriteria.Operator == CompareOperator.Equal) ||
                              (searchCriteria.Operator == CompareOperator.Like) ||
                              (searchCriteria.Operator == CompareOperator.NotEqual)))
                        {
                            throw new ArgumentException("Operator " + searchCriteria.Operator + " is not supported on data of type " + searchCriteria.Type + ".");
                        }
                        break;

                    default:
                        throw new ArgumentException("Not supported data type = " + searchCriteria.Type);
                }
            }
        }