/// <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; }
/// <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); } } }