예제 #1
0
        internal bool TryGetFunctionFromMetadata(
            string namespaceName,
            string functionName,
            out MetadataFunctionGroup functionGroup)
        {
            IList <EdmFunction> functionOverloads;

            if (this._perspective.TryGetFunctionByName(namespaceName, functionName, this._parserOptions.NameComparisonCaseInsensitive, out functionOverloads))
            {
                functionGroup = new MetadataFunctionGroup(TypeResolver.GetFullName(namespaceName, functionName), functionOverloads);
                return(true);
            }
            functionGroup = (MetadataFunctionGroup)null;
            return(false);
        }
예제 #2
0
        internal MetadataMember ResolveMetadataMemberAccess(
            MetadataMember qualifier,
            string name,
            ErrorContext errCtx)
        {
            string fullName = TypeResolver.GetFullName(qualifier.Name, name);

            if (qualifier.MetadataMemberClass == MetadataMemberClass.Namespace)
            {
                MetadataType type;
                if (this.TryGetTypeFromMetadata(fullName, out type))
                {
                    return((MetadataMember)type);
                }
                MetadataFunctionGroup functionGroup;
                if (this.TryGetFunctionFromMetadata(qualifier.Name, name, out functionGroup))
                {
                    return((MetadataMember)functionGroup);
                }
                return((MetadataMember) new MetadataNamespace(fullName));
            }
            if (qualifier.MetadataMemberClass == MetadataMemberClass.Type)
            {
                MetadataType metadataType = (MetadataType)qualifier;
                if (TypeSemantics.IsEnumerationType(metadataType.TypeUsage))
                {
                    EnumMember outMember;
                    if (this._perspective.TryGetEnumMember((EnumType)metadataType.TypeUsage.EdmType, name, this._parserOptions.NameComparisonCaseInsensitive, out outMember))
                    {
                        return((MetadataMember) new MetadataEnumMember(fullName, metadataType.TypeUsage, outMember));
                    }
                    string errorMessage = Strings.NotAMemberOfType((object)name, (object)qualifier.Name);
                    throw EntitySqlException.Create(errCtx, errorMessage, (Exception)null);
                }
            }
            string errorMessage1 = Strings.InvalidMetadataMemberClassResolution((object)qualifier.Name, (object)qualifier.MetadataMemberClassName, (object)MetadataNamespace.NamespaceClassName);

            throw EntitySqlException.Create(errCtx, errorMessage1, (Exception)null);
        }
        /// <summary>
        ///     Try resolving multipart identifier as an alternative name of a group key (see SemanticAnalyzer.ProcessGroupByClause(...) for more info).
        /// </summary>
        internal bool TryResolveDotExprAsGroupKeyAlternativeName(DotExpr dotExpr, out ValueExpression groupKeyResolution)
        {
            groupKeyResolution = null;

            string[]   names;
            ScopeEntry scopeEntry;
            int        scopeIndex;

            if (IsInAnyGroupScope()
                &&
                dotExpr.IsMultipartIdentifier(out names)
                &&
                TryScopeLookup(TypeResolver.GetFullName(names), out scopeEntry, out scopeIndex))
            {
                var iGetAlternativeName = scopeEntry as IGetAlternativeName;

                //
                // Accept only if names[] match alternative name part by part.
                //
                if (iGetAlternativeName != null &&
                    iGetAlternativeName.AlternativeName != null
                    &&
                    names.SequenceEqual(iGetAlternativeName.AlternativeName, NameComparer))
                {
                    //
                    // Set correlation flag
                    //
                    SetScopeRegionCorrelationFlag(scopeIndex);

                    groupKeyResolution =
                        new ValueExpression(
                            GetExpressionFromScopeEntry(scopeEntry, scopeIndex, TypeResolver.GetFullName(names), dotExpr.ErrCtx));
                    return(true);
                }
            }
            return(false);
        }
예제 #4
0
        internal bool TryResolveDotExprAsGroupKeyAlternativeName(
            DotExpr dotExpr,
            out ValueExpression groupKeyResolution)
        {
            groupKeyResolution = (ValueExpression)null;
            string[]   names;
            ScopeEntry scopeEntry;
            int        scopeIndex;

            if (this.IsInAnyGroupScope() && dotExpr.IsMultipartIdentifier(out names) && this.TryScopeLookup(TypeResolver.GetFullName(names), out scopeEntry, out scopeIndex))
            {
                IGetAlternativeName getAlternativeName = scopeEntry as IGetAlternativeName;
                if (getAlternativeName != null && getAlternativeName.AlternativeName != null && ((IEnumerable <string>)names).SequenceEqual <string>((IEnumerable <string>)getAlternativeName.AlternativeName, (IEqualityComparer <string>) this.NameComparer))
                {
                    this.SetScopeRegionCorrelationFlag(scopeIndex);
                    groupKeyResolution = new ValueExpression(this.GetExpressionFromScopeEntry(scopeEntry, scopeIndex, TypeResolver.GetFullName(names), dotExpr.ErrCtx));
                    return(true);
                }
            }
            return(false);
        }
예제 #5
0
        internal MetadataMember ResolveUnqualifiedName(
            string name,
            bool partOfQualifiedName,
            ErrorContext errCtx)
        {
            bool flag1 = partOfQualifiedName && this._resolveLeftMostUnqualifiedNameAsNamespaceOnly;
            bool flag2 = !partOfQualifiedName;
            InlineFunctionGroup inlineFunctionGroup;

            if (!flag1 && flag2 && this.TryGetInlineFunction(name, out inlineFunctionGroup))
            {
                return((MetadataMember)inlineFunctionGroup);
            }
            MetadataNamespace metadataNamespace;

            if (this._aliasedNamespaces.TryGetValue(name, out metadataNamespace))
            {
                return((MetadataMember)metadataNamespace);
            }
            if (!flag1)
            {
                MetadataType          type1          = (MetadataType)null;
                MetadataFunctionGroup functionGroup1 = (MetadataFunctionGroup)null;
                if (!this.TryGetTypeFromMetadata(name, out type1) && flag2)
                {
                    string[] strArray = name.Split('.');
                    if (strArray.Length > 1 && ((IEnumerable <string>)strArray).All <string>((Func <string, bool>)(p => p.Length > 0)))
                    {
                        string functionName = strArray[strArray.Length - 1];
                        this.TryGetFunctionFromMetadata(name.Substring(0, name.Length - functionName.Length - 1), functionName, out functionGroup1);
                    }
                }
                MetadataNamespace ns2 = (MetadataNamespace)null;
                foreach (MetadataNamespace ns1 in this._namespaces)
                {
                    MetadataType type2;
                    if (this.TryGetTypeFromMetadata(TypeResolver.GetFullName(ns1.Name, name), out type2))
                    {
                        if (type1 != null || functionGroup1 != null)
                        {
                            throw TypeResolver.AmbiguousMetadataMemberName(errCtx, name, ns1, ns2);
                        }
                        type1 = type2;
                        ns2   = ns1;
                    }
                    MetadataFunctionGroup functionGroup2;
                    if (flag2 && this.TryGetFunctionFromMetadata(ns1.Name, name, out functionGroup2))
                    {
                        if (type1 != null || functionGroup1 != null)
                        {
                            throw TypeResolver.AmbiguousMetadataMemberName(errCtx, name, ns1, ns2);
                        }
                        functionGroup1 = functionGroup2;
                        ns2            = ns1;
                    }
                }
                if (type1 != null)
                {
                    return((MetadataMember)type1);
                }
                if (functionGroup1 != null)
                {
                    return((MetadataMember)functionGroup1);
                }
            }
            return((MetadataMember) new MetadataNamespace(name));
        }