Esempio n. 1
0
        public static CreateIndexDesc Walk(EsperEPL2GrammarParser.CreateIndexExprContext ctx, IDictionary <ITree, ExprNode> astExprNodeMap)
        {
            var indexName  = ctx.n.Text;
            var windowName = ctx.w.Text;

            var unique = false;

            if (ctx.u != null)
            {
                string ident = ctx.u.Text;
                if (ident.ToLowerInvariant().Trim() == "unique")
                {
                    unique = true;
                }
                else
                {
                    throw ASTWalkException.From("Invalid keyword '" + ident + "' in create-index encountered, expected 'unique'");
                }
            }

            var columns = new List <CreateIndexItem>();
            var cols    = ctx.createIndexColumnList().createIndexColumn();

            foreach (var col in cols)
            {
                CreateIndexItem item = Walk(col, astExprNodeMap);
                columns.Add(item);
            }
            return(new CreateIndexDesc(unique, indexName, windowName, columns));
        }
Esempio n. 2
0
        private static void ValidateBuiltin(
            CreateIndexItem columnDesc,
            EventType eventType,
            IList <IndexedPropDesc> hashProps,
            IList <IndexedPropDesc> btreeProps,
            ISet <string> indexedColumns)
        {
            if (columnDesc.Expressions.IsEmpty())
            {
                throw new ExprValidationException("Invalid empty list of index expressions");
            }
            if (columnDesc.Expressions.Count > 1)
            {
                throw new ExprValidationException("Invalid multiple index expressions for index type '" + columnDesc.IndexType + "'");
            }
            ExprNode expression = columnDesc.Expressions[0];

            if (!(expression is ExprIdentNode))
            {
                throw new ExprValidationException("Invalid index expression '" + expression.ToExpressionStringMinPrecedenceSafe() + "'");
            }
            ExprIdentNode identNode = (ExprIdentNode)expression;

            if (identNode.FullUnresolvedName.Contains("."))
            {
                throw new ExprValidationException("Invalid index expression '" + expression.ToExpressionStringMinPrecedenceSafe() + "'");
            }

            string columnName = identNode.FullUnresolvedName;
            Type   type       = eventType.GetPropertyType(columnName).GetBoxedType();

            if (type == null)
            {
                throw new ExprValidationException("Property named '" + columnName + "' not found");
            }
            if (!indexedColumns.Add(columnName))
            {
                throw new ExprValidationException("Property named '" + columnName + "' has been declared more then once");
            }

            var    desc      = new IndexedPropDesc(columnName, type);
            string indexType = columnDesc.IndexType;

            if (string.Equals(indexType, CreateIndexType.HASH.ToString(), StringComparison.InvariantCultureIgnoreCase))
            {
                hashProps.Add(desc);
            }
            else
            {
                btreeProps.Add(desc);
            }
        }
Esempio n. 3
0
        private static EventAdvancedIndexProvisionCompileTime ValidateAdvanced(
            string indexName,
            string indexType,
            CreateIndexItem columnDesc,
            EventType eventType,
            StatementRawInfo statementRawInfo,
            StatementCompileTimeServices services)
        {
            // validate index expressions: valid and plain expressions
            StreamTypeService streamTypeService = new StreamTypeServiceImpl(eventType, null, false);
            var validationContextColumns =
                new ExprValidationContextBuilder(streamTypeService, statementRawInfo, services)
                    .WithDisablePropertyExpressionEventCollCache(true)
                    .Build();
            var columns = columnDesc.Expressions.ToArray();
            ExprNodeUtilityValidate.GetValidatedSubtree(
                ExprNodeOrigin.CREATEINDEXCOLUMN,
                columns,
                validationContextColumns);
            ExprNodeUtilityValidate.ValidatePlainExpression(ExprNodeOrigin.CREATEINDEXCOLUMN, columns);

            // validate parameters, may not depend on props
            ExprNode[] parameters = null;
            if (columnDesc.Parameters != null && !columnDesc.Parameters.IsEmpty()) {
                parameters = columnDesc.Parameters.ToArray();
                ExprNodeUtilityValidate.GetValidatedSubtree(
                    ExprNodeOrigin.CREATEINDEXPARAMETER,
                    parameters,
                    validationContextColumns);
                ExprNodeUtilityValidate.ValidatePlainExpression(ExprNodeOrigin.CREATEINDEXPARAMETER, parameters);

                // validate no stream dependency of parameters
                var visitor = new ExprNodeIdentifierAndStreamRefVisitor(false);
                foreach (var param in columnDesc.Parameters) {
                    param.Accept(visitor);
                    if (!visitor.Refs.IsEmpty()) {
                        throw new ExprValidationException("Index parameters may not refer to event properties");
                    }
                }
            }

            // obtain provider
            AdvancedIndexFactoryProvider provider;
            try {
                provider = services.ImportServiceCompileTime.ResolveAdvancedIndexProvider(indexType);
            }
            catch (ImportException ex) {
                throw new ExprValidationException(ex.Message, ex);
            }

            return provider.ValidateEventIndex(indexName, indexType, columns, parameters);
        }
Esempio n. 4
0
        private static EventAdvancedIndexProvisionDesc ValidateAdvanced(
            string indexName,
            string indexType,
            CreateIndexItem columnDesc,
            EventType eventType,
            StatementContext statementContext)
        {
            // validate index expressions: valid and plain expressions
            ExprValidationContext validationContextColumns = GetValidationContext(eventType, statementContext);

            ExprNode[] columns = columnDesc.Expressions.ToArray();
            ExprNodeUtility.GetValidatedSubtree(ExprNodeOrigin.CREATEINDEXCOLUMN, columns, validationContextColumns);
            ExprNodeUtility.ValidatePlainExpression(ExprNodeOrigin.CREATEINDEXCOLUMN, columns);

            // validate parameters, may not depend on props
            ExprNode[] parameters = null;
            if (columnDesc.Parameters != null && !columnDesc.Parameters.IsEmpty())
            {
                parameters = columnDesc.Parameters.ToArray();
                ExprNodeUtility.GetValidatedSubtree(ExprNodeOrigin.CREATEINDEXPARAMETER, parameters, validationContextColumns);
                ExprNodeUtility.ValidatePlainExpression(ExprNodeOrigin.CREATEINDEXPARAMETER, parameters);

                // validate no stream dependency of parameters
                var visitor = new ExprNodeIdentifierAndStreamRefVisitor(false);
                foreach (ExprNode param in columnDesc.Parameters)
                {
                    param.Accept(visitor);
                    if (!visitor.GetRefs().IsEmpty())
                    {
                        throw new ExprValidationException("Index parameters may not refer to event properties");
                    }
                }
            }

            // obtain provider
            AdvancedIndexFactoryProvider provider;

            try {
                provider = statementContext.EngineImportService.ResolveAdvancedIndexProvider(indexType);
            } catch (EngineImportException ex) {
                throw new ExprValidationException(ex.Message, ex);
            }

            return(provider.ValidateEventIndex(indexName, indexType, columns, parameters));
        }