예제 #1
0
        public override void VisitOrdering(Ordering ordering, QueryModel queryModel,
                                           OrderByClause orderByClause, int index)
        {
            base.VisitOrdering(ordering, queryModel, orderByClause, index);
            var field = memberAccessBuilder.GetFieldOrNull(ordering.Expression);

            if (field == null)
            {
                throw new InvalidOperationException("order by must have field reference");
            }

            var fieldOrdering = new FieldOrdering
            {
                Field = new FieldReferenceExpression
                {
                    Field    = field.Expression,
                    CustomId = CustomFieldHelpers.ExtractIdentifier(field.Expression)
                },
                Order = ordering.OrderingDirection == OrderingDirection.Asc
                    ? JqlOrderType.Asc
                    : JqlOrderType.Desc
            };

            queryBuilder.AppendOrdering(fieldOrdering);
        }
예제 #2
0
        protected override Expression VisitMember(MemberExpression node)
        {
            base.VisitMember(node);

            var property = node.Member as PropertyInfo;

            if (property == null)
            {
                throw new InvalidOperationException(
                          $"member chain should contain only properties [{node}]");
            }

            var filter = stack.Pop();

            if (filter is FieldReferenceExpression fieldReference)
            {
                if (fieldReference.Source == null)
                {
                    throw new InvalidOperationException(
                              $"member chain should start from query source [{node}]");
                }
                if (property.DeclaringType == typeof(JiraIssue) && property.Name == "CustomFields")
                {
                    stack.Push(fieldReference);
                }
                else if (property.DeclaringType == typeof(JiraStatus) &&
                         property.Name == "StatusCategory" &&
                         property.PropertyType == typeof(JiraStatusCategory))
                {
                    fieldReference.Field    = "STATUSCATEGORY";
                    fieldReference.CustomId = null;
                    stack.Push(fieldReference);
                }
                else if (fieldReference.Field == null)
                {
                    var jiraProperty = metadataProvider.GetFieldMetadata(property);
                    fieldReference.Field    = jiraProperty.FieldName;
                    fieldReference.CustomId = CustomFieldHelpers.ExtractIdentifier(jiraProperty.FieldName);
                    stack.Push(fieldReference);
                }
                else
                {
                    stack.Push(fieldReference);
                }
            }
            else
            {
                throw new InvalidOperationException(
                          $"member chain should start from query source [{node}]");
            }

            return(node);
        }