private void ValidateIndexNamedParameter(ExprValidationContext validationContext)
        {
            if (_indexNamedParameter.Count != 1 || !(_indexNamedParameter[0] is ExprDeclaredNode))
            {
                throw GetIndexNameMessage("requires an expression name");
            }

            ExprDeclaredNode node = (ExprDeclaredNode)_indexNamedParameter[0];

            if (!(node.Body is ExprDotNode))
            {
                throw GetIndexNameMessage("requires an index expression");
            }

            ExprDotNode dotNode = (ExprDotNode)node.Body;

            if (dotNode.ChainSpec.Count > 1)
            {
                throw GetIndexNameMessage("invalid chained index expression");
            }

            IList <ExprNode> @params       = dotNode.ChainSpec[0].Parameters;
            string           indexTypeName = dotNode.ChainSpec[0].Name;

            _optionalIndexName = node.Prototype.Name;

            AdvancedIndexFactoryProvider provider;

            try
            {
                provider = validationContext.EngineImportService.ResolveAdvancedIndexProvider(indexTypeName);
            }
            catch (EngineImportException e)
            {
                throw new ExprValidationException(e.Message, e);
            }

            if (indexTypeName.ToLowerInvariant() != IndexTypeName)
            {
                throw new ExprValidationException("Invalid index type '" + indexTypeName + "', expected '" +
                                                  IndexTypeName + "'");
            }

            _optionalIndexConfig = provider.ValidateConfigureFilterIndex(_optionalIndexName, indexTypeName,
                                                                         ExprNodeUtility.ToArray(@params), validationContext);
        }
Example #2
0
 /// <summary>Ctor. </summary>
 /// <param name="declaration"></param>
 public ExprNodeSubselectDeclaredNoTraverseVisitor(ExprDeclaredNode declaration)
 {
     _declaration = declaration;
     _subselects  = new List <ExprSubselectNode>(1);
 }