Exemple #1
0
        public ExprTableIdentNode GetTableIdentNode(StreamTypeService streamTypeService, string unresolvedPropertyName, string streamOrPropertyName)
        {
            var propertyPrefixed = unresolvedPropertyName;

            if (streamOrPropertyName != null)
            {
                propertyPrefixed = streamOrPropertyName + "." + unresolvedPropertyName;
            }
            var col = FindTableColumnMayByPrefixed(streamTypeService, propertyPrefixed);

            if (col == null)
            {
                return(null);
            }
            var pair = col.Pair;

            if (pair.Column is TableMetadataColumnAggregation)
            {
                var agg  = (TableMetadataColumnAggregation)pair.Column;
                var node = new ExprTableIdentNode(streamOrPropertyName, unresolvedPropertyName);
                var eval = ExprTableEvalStrategyFactory.GetTableAccessEvalStrategy(node, pair.TableMetadata.TableName, pair.StreamNum, agg);
                node.Eval = eval;
                return(node);
            }
            return(null);
        }
Exemple #2
0
        public override ExprNode Validate(ExprValidationContext validationContext)
        {
            // rewrite expression into a table-access expression
            if (validationContext.StreamTypeService.HasTableTypes)
            {
                ExprTableIdentNode tableIdentNode = validationContext.TableService.GetTableIdentNode(validationContext.StreamTypeService, _unresolvedPropertyName, _streamOrPropertyName);
                if (tableIdentNode != null)
                {
                    return(tableIdentNode);
                }
            }

            string unescapedPropertyName = PropertyParser.UnescapeBacktick(_unresolvedPropertyName);
            Pair <PropertyResolutionDescriptor, string> propertyInfoPair = ExprIdentNodeUtil.GetTypeFromStream(validationContext.StreamTypeService, unescapedPropertyName, _streamOrPropertyName, false);

            _resolvedStreamName = propertyInfoPair.Second;
            int  streamNum    = propertyInfoPair.First.StreamNum;
            Type propertyType = propertyInfoPair.First.PropertyType;

            _resolvedPropertyName = propertyInfoPair.First.PropertyName;
            EventPropertyGetter propertyGetter;

            try {
                propertyGetter = propertyInfoPair.First.StreamEventType.GetGetter(_resolvedPropertyName);
            }
            catch (PropertyAccessException ex) {
                throw new ExprValidationException("Property '" + _unresolvedPropertyName + "' is not valid: " + ex.Message, ex);
            }

            if (propertyGetter == null)
            {
                throw new ExprValidationException("Property getter returned was invalid for property '" + _unresolvedPropertyName + "'");
            }

            var audit = AuditEnum.PROPERTY.GetAudit(validationContext.Annotations);

            if (audit != null)
            {
                _evaluator = new ExprIdentNodeEvaluatorLogging(streamNum, propertyGetter, propertyType, this, _resolvedPropertyName, validationContext.StatementName, validationContext.StreamTypeService.EngineURIQualifier);
            }
            else
            {
                _evaluator = new ExprIdentNodeEvaluatorImpl(streamNum, propertyGetter, propertyType, this);
            }

            // if running in a context, take the property value from context
            if (validationContext.ContextDescriptor != null && !validationContext.IsFilterExpression)
            {
                EventType fromType            = validationContext.StreamTypeService.EventTypes[streamNum];
                string    contextPropertyName = validationContext.ContextDescriptor.ContextPropertyRegistry.GetPartitionContextPropertyName(fromType, _resolvedPropertyName);
                if (contextPropertyName != null)
                {
                    EventType contextType = validationContext.ContextDescriptor.ContextPropertyRegistry.ContextEventType;
                    _evaluator = new ExprIdentNodeEvaluatorContext(streamNum, contextType.GetPropertyType(contextPropertyName), contextType.GetGetter(contextPropertyName));
                }
            }
            return(null);
        }
        public static Pair <ExprNode, IList <Chainable> > GetTableNodeChainable(
            StreamTypeService streamTypeService,
            IList <Chainable> chainSpec,
            bool allowTableAggReset,
            TableCompileTimeResolver tableCompileTimeResolver)
        {
            chainSpec = new List <Chainable>(chainSpec);

            var unresolvedPropertyName = chainSpec[0].GetRootNameOrEmptyString();
            var tableStreamNum         = streamTypeService.GetStreamNumForStreamName(unresolvedPropertyName);

            if (chainSpec.Count == 2 && tableStreamNum != -1)
            {
                var tableMetadata = tableCompileTimeResolver.ResolveTableFromEventType(streamTypeService.EventTypes[tableStreamNum]);
                if (tableMetadata != null && chainSpec[1].GetRootNameOrEmptyString().Equals("reset", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (!allowTableAggReset)
                    {
                        throw new ExprValidationException(INVALID_TABLE_AGG_RESET);
                    }

                    if (!chainSpec[1].GetParametersOrEmpty().IsEmpty())
                    {
                        throw new ExprValidationException(INVALID_TABLE_AGG_RESET_PARAMS);
                    }

                    var node = new ExprTableResetRowAggNode(tableMetadata, tableStreamNum);
                    chainSpec.Clear();
                    return(new Pair <ExprNode, IList <Chainable> >(node, chainSpec));
                }
            }

            var col = FindTableColumnMayByPrefixed(streamTypeService, unresolvedPropertyName, tableCompileTimeResolver);

            var pair = col?.Pair;

            if (pair?.Column is TableMetadataColumnAggregation)
            {
                var agg        = (TableMetadataColumnAggregation)pair.Column;
                var returnType = pair.TableMetadata.PublicEventType.GetPropertyType(pair.Column.ColumnName);
                var node       = new ExprTableIdentNode(
                    pair.TableMetadata,
                    null,
                    unresolvedPropertyName,
                    returnType,
                    pair.StreamNum,
                    agg.ColumnName,
                    agg.Column);
                chainSpec.RemoveAt(0);
                return(new Pair <ExprNode, IList <Chainable> >(node, chainSpec));
            }

            return(null);
        }
 public ExprDotNodeAggregationMethodForgeTableReset(
     ExprDotNodeImpl parent,
     string aggregationMethodName,
     ExprNode[] parameters,
     AggregationPortableValidation validation,
     ExprTableIdentNode identNode,
     TableMetadataColumnAggregation column)
     : base(parent, aggregationMethodName, parameters, validation)
 {
     this.identNode = identNode;
     this.column = column;
 }
Exemple #5
0
        public Pair <ExprNode, IList <ExprChainedSpec> > GetTableNodeChainable(
            StreamTypeService streamTypeService,
            IList <ExprChainedSpec> chainSpec,
            EngineImportService engineImportService)
        {
            chainSpec = new List <ExprChainedSpec>(chainSpec);

            var unresolvedPropertyName = chainSpec[0].Name;
            var col = FindTableColumnMayByPrefixed(streamTypeService, unresolvedPropertyName);

            if (col == null)
            {
                return(null);
            }
            var pair = col.Pair;

            if (pair.Column is TableMetadataColumnAggregation)
            {
                var agg = (TableMetadataColumnAggregation)pair.Column;

                if (chainSpec.Count > 1)
                {
                    var candidateAccessor = chainSpec[1].Name;
                    var exprNode          = (ExprAggregateNodeBase)ASTAggregationHelper.TryResolveAsAggregation(engineImportService, false, candidateAccessor, new LazyAllocatedMap <ConfigurationPlugInAggregationMultiFunction, PlugInAggregationMultiFunctionFactory>(), streamTypeService.EngineURIQualifier);
                    if (exprNode != null)
                    {
                        var identNode = new ExprTableIdentNodeSubpropAccessor(pair.StreamNum, col.OptionalStreamName, agg, exprNode);
                        exprNode.AddChildNodes(chainSpec[1].Parameters);
                        chainSpec.RemoveAt(0);
                        chainSpec.RemoveAt(0);
                        return(new Pair <ExprNode, IList <ExprChainedSpec> >(identNode, chainSpec));
                    }
                }

                var node = new ExprTableIdentNode(null, unresolvedPropertyName);
                var eval = ExprTableEvalStrategyFactory.GetTableAccessEvalStrategy(node, pair.TableMetadata.TableName, pair.StreamNum, agg);
                node.Eval = eval;
                chainSpec.RemoveAt(0);
                return(new Pair <ExprNode, IList <ExprChainedSpec> >(node, chainSpec));
            }
            return(null);
        }