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