Beispiel #1
0
        protected virtual BaseCriteria Visit(BaseCriteria criteria)
        {
            if (Object.ReferenceEquals(null, criteria))
            {
                return(null);
            }

            if (criteria is Criteria)
            {
                return(VisitCriteria((Criteria)criteria));
            }

            if (criteria is BinaryCriteria)
            {
                return(VisitBinary((BinaryCriteria)criteria));
            }

            if (criteria is UnaryCriteria)
            {
                return(VisitUnary((UnaryCriteria)criteria));
            }

            if (criteria is ValueCriteria)
            {
                return(VisitValue((ValueCriteria)criteria));
            }

            if (criteria is ParamCriteria)
            {
                return(VisitParam((ParamCriteria)criteria));
            }

            throw new Exception(String.Format("Unhandled criteria type: '{0}'", criteria.GetType().Name));
        }
        /// <summary>
        /// Visits the specified criteria.
        /// </summary>
        /// <param name="criteria">The criteria.</param>
        /// <returns></returns>
        /// <exception cref="Exception">Criteria type is unkown.</exception>
        protected virtual BaseCriteria Visit(BaseCriteria criteria)
        {
            if (criteria is null)
            {
                return(null);
            }

            if (criteria is Criteria crit)
            {
                return(VisitCriteria(crit));
            }

            if (criteria is BinaryCriteria binary)
            {
                return(VisitBinary(binary));
            }

            if (criteria is UnaryCriteria unary)
            {
                return(VisitUnary(unary));
            }

            if (criteria is ValueCriteria value)
            {
                return(VisitValue(value));
            }

            if (criteria is ParamCriteria prm)
            {
                return(VisitParam(prm));
            }

            throw new InvalidProgramException(string.Format("Unhandled criteria type: '{0}'", criteria.GetType().Name));
        }
        private void ToJson(JsonWriter writer, BaseCriteria criteria, JsonSerializer serializer)
        {
            if (criteria is null ||
                criteria.IsEmpty)
            {
                writer.WriteNull();
                return;
            }

            if (criteria is ValueCriteria valueCriteria)
            {
                var value = valueCriteria.Value;
                if (value != null && value is IEnumerable && !(value is string))
                {
                    // make sure that first value in array won't be recognized as a operator
                    // while deserializing (e.g. if values are [">", "a", "b"], serialize them
                    // as [[">", "a", "b"]] so that the first > won't be recognized as GE operator.
                    writer.WriteStartArray();
                    serializer.Serialize(writer, value);
                    writer.WriteEndArray();
                    return;
                }

                serializer.Serialize(writer, value);
                return;
            }

            if (criteria is ParamCriteria prm)
            {
                writer.WriteStartArray();
                serializer.Serialize(writer, prm.Name);
                writer.WriteEndArray();
                return;
            }

            if (criteria is Criteria crit)
            {
                writer.WriteStartArray();
                serializer.Serialize(writer, crit.Expression);
                writer.WriteEndArray();
                return;
            }

            if (criteria is UnaryCriteria unary)
            {
                writer.WriteStartArray();
                writer.WriteValue(OperatorToKey[(int)unary.Operator]);
                ToJson(writer, unary.Operand, serializer);
                writer.WriteEndArray();
                return;
            }

            if (criteria is BinaryCriteria binary)
            {
                writer.WriteStartArray();
                ToJson(writer, binary.LeftOperand, serializer);
                writer.WriteValue(OperatorToKey[(int)binary.Operator]);
                ToJson(writer, binary.RightOperand, serializer);
                writer.WriteEndArray();
                return;
            }

            throw new JsonSerializationException(string.Format("Can't serialize criteria of type {0}", criteria.GetType().FullName));
        }