public override void Attach( EventType parentEventType, int streamNumber, ViewForgeEnv viewForgeEnv) { eventType = parentEventType; var message = NAME + " window requires a numeric size parameter and a list of expressions providing sort keys"; if (viewParameters.Count < 2) { throw new ViewParameterException(message); } var validated = ViewForgeSupport.Validate( NAME + " window", parentEventType, viewParameters, true, viewForgeEnv, streamNumber); for (var i = 1; i < validated.Length; i++) { ViewForgeSupport.AssertReturnsNonConstant(NAME + " window", validated[i], i); } ViewForgeSupport.ValidateNoProperties(ViewName, validated[0], 0); sizeForge = ViewForgeSupport.ValidateSizeParam(ViewName, validated[0], 0); sortCriteriaExpressions = new ExprNode[validated.Length - 1]; isDescendingValues = new bool[sortCriteriaExpressions.Length]; for (var i = 1; i < validated.Length; i++) { if (validated[i] is ExprOrderedExpr) { isDescendingValues[i - 1] = ((ExprOrderedExpr) validated[i]).IsDescending; sortCriteriaExpressions[i - 1] = validated[i].ChildNodes[0]; } else { sortCriteriaExpressions[i - 1] = validated[i]; } } sortSerdes = viewForgeEnv.SerdeResolver.SerdeForDataWindowSortCriteria( ExprNodeUtilityQuery.GetExprResultTypes(sortCriteriaExpressions), viewForgeEnv.StatementRawInfo); }
public override void Attach( EventType parentEventType, int streamNumber, ViewForgeEnv viewForgeEnv) { eventType = parentEventType; var message = NAME + " view requires a list of expressions providing unique keys, a numeric size parameter and a list of expressions providing sort keys"; if (viewParameters.Count < 3) { throw new ViewParameterException(message); } // validate var validated = ViewForgeSupport.Validate( NAME, parentEventType, viewParameters, true, viewForgeEnv, streamNumber); // find size-parameter index var indexNumericSize = -1; for (var i = 0; i < validated.Length; i++) { if (validated[i] is ExprConstantNode || validated[i] is ExprContextPropertyNode) { indexNumericSize = i; break; } } if (indexNumericSize == -1) { throw new ViewParameterException("Failed to find constant value for the numeric size parameter"); } if (indexNumericSize == 0) { throw new ViewParameterException( "Failed to find unique value expressions that are expected to occur before the numeric size parameter"); } if (indexNumericSize == validated.Length - 1) { throw new ViewParameterException( "Failed to find sort key expressions after the numeric size parameter"); } // validate non-constant for unique-keys and sort-keys for (var i = 0; i < indexNumericSize; i++) { ViewForgeSupport.AssertReturnsNonConstant(NAME, validated[i], i); } for (var i = indexNumericSize + 1; i < validated.Length; i++) { ViewForgeSupport.AssertReturnsNonConstant(NAME, validated[i], i); } // get sort size ViewForgeSupport.ValidateNoProperties(ViewName, validated[indexNumericSize], indexNumericSize); sizeForge = ViewForgeSupport.ValidateSizeParam(ViewName, validated[indexNumericSize], indexNumericSize); // compile unique expressions criteriaExpressions = new ExprNode[indexNumericSize]; Array.Copy(validated, 0, criteriaExpressions, 0, indexNumericSize); // compile sort expressions sortCriteriaExpressions = new ExprNode[validated.Length - indexNumericSize - 1]; isDescendingValues = new bool[sortCriteriaExpressions.Length]; var count = 0; for (var i = indexNumericSize + 1; i < validated.Length; i++) { if (validated[i] is ExprOrderedExpr) { isDescendingValues[count] = ((ExprOrderedExpr) validated[i]).IsDescending; sortCriteriaExpressions[count] = validated[i].ChildNodes[0]; } else { sortCriteriaExpressions[count] = validated[i]; } count++; } sortSerdes = viewForgeEnv.SerdeResolver.SerdeForDataWindowSortCriteria( ExprNodeUtilityQuery.GetExprResultTypes(sortCriteriaExpressions), viewForgeEnv.StatementRawInfo); }