/// <summary>
 /// Retrieves the properties of in the EdmType underlying the input type usage,
 ///  if that EdmType is a structured type (EntityType, RowType).
 /// </summary>
 /// <param name="typeUsage"></param>
 /// <returns></returns>
 internal static IList <EdmProperty> GetProperties(TypeUsage typeUsage)
 {
     return(MetadataHelpers.GetProperties(typeUsage.EdmType));
 }
 internal static bool IsFacetValueConstant(TypeUsage type, string facetName)
 {
     return(MetadataHelpers.GetFacet(((PrimitiveType)type.EdmType).FacetDescriptions, facetName).IsConstant);
 }
 /// <summary>
 /// Is the given type usage over an entity type
 /// </summary>
 /// <param name="type"></param>
 /// <returns></returns>
 internal static bool IsEntityType(TypeUsage type)
 {
     return(MetadataHelpers.IsEntityType(type.EdmType));
 }
        /// <summary>
        /// Returns the sql primitive/native type name.
        /// It will include size, precision or scale depending on type information present in the
        /// type facets
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static string GetSqlPrimitiveType(TypeUsage type)
        {
            var primitiveType = MetadataHelpers.GetEdmType <PrimitiveType>(type);

            switch (primitiveType.PrimitiveTypeKind)
            {
            case PrimitiveTypeKind.Boolean:
                return("tinyint");

            case PrimitiveTypeKind.Byte:
                return("tinyint");

            case PrimitiveTypeKind.SByte:
                return("smallint");

            case PrimitiveTypeKind.Int16:
                return("smallint");

            case PrimitiveTypeKind.Int32:
                return("integer");

            case PrimitiveTypeKind.Int64:
                return("bigint");

            case PrimitiveTypeKind.Single:
                return("real");

            case PrimitiveTypeKind.Double:
                return("float");

            case PrimitiveTypeKind.Time:
                return("time");

            case PrimitiveTypeKind.DateTime:
                return("ingresdate");

            case PrimitiveTypeKind.Decimal:
                var decimalPrecision = MetadataHelpers.GetFacetValueOrDefault <byte>(type, MetadataHelpers.PrecisionFacetName, 18);
                var decimalScale     = MetadataHelpers.GetFacetValueOrDefault <byte>(type, MetadataHelpers.ScaleFacetName, 0);
                return(string.Format("decimal({0}, {1})", decimalPrecision, decimalScale));

            case PrimitiveTypeKind.String:
                var isUnicode           = MetadataHelpers.GetFacetValueOrDefault <bool>(type, MetadataHelpers.UnicodeFacetName, false);
                var isStringFixedLength = MetadataHelpers.GetFacetValueOrDefault <bool>(type, MetadataHelpers.FixedLengthFacetName, false);
                var stringLength        = MetadataHelpers.GetFacetValueOrDefault <int?>(type, MetadataHelpers.MaxLengthFacetName, 4000);
                var isStringLong        = (stringLength == null) || (isUnicode && !isStringFixedLength && (stringLength > 4000)) || (!isUnicode && !isStringFixedLength && (stringLength > 8000));
                var stringType          = isStringFixedLength && !isStringLong ? "char" : "varchar";
                if (isUnicode)
                {
                    stringType = "n" + stringType;
                }
                if (isStringLong)
                {
                    return("long " + stringType);
                }
                return(string.Format("{0}({1})", stringType, stringLength));

            case PrimitiveTypeKind.Binary:
                var isBinaryFixedLength = MetadataHelpers.GetFacetValueOrDefault <bool>(type, MetadataHelpers.FixedLengthFacetName, false);
                var binaryLength        = MetadataHelpers.GetFacetValueOrDefault <int?>(type, MetadataHelpers.MaxLengthFacetName, null);
                var isBinaryLong        = (binaryLength == null) || (!isBinaryFixedLength && (binaryLength > 8000));
                if (isBinaryLong)
                {
                    return("long byte");
                }
                return(string.Format("byte{0}({1})", isBinaryFixedLength ? " varying" : "", binaryLength));

            default:
                throw new NotSupportedException("Unsupported EdmType: " + primitiveType.PrimitiveTypeKind);
            }
        }
 /// <summary>
 /// Is the given type usage over a primitive type
 /// </summary>
 /// <param name="type"></param>
 /// <returns></returns>
 internal static bool IsPrimitiveType(TypeUsage type)
 {
     return(MetadataHelpers.IsPrimitiveType(type.EdmType));
 }