Beispiel #1
0
 private GraphModelImpl(IGraphElementModel verticesModel, IGraphElementModel edgesModel, IGraphElementPropertyModel propertiesModel, IImmutableSet <Type> nativeTypes)
 {
     VerticesModel   = verticesModel;
     EdgesModel      = edgesModel;
     PropertiesModel = propertiesModel;
     NativeTypes     = nativeTypes;
 }
Beispiel #2
0
 internal static object GetIdentifier(this IGraphElementPropertyModel model, PropertyMetadata metadata)
 {
     return(model.SpecialNames
            .TryGetValue(metadata.Name)
            .Map(x => (object)x)
            .IfNone(metadata.Name));
 }
 public KeyLookup(IGraphElementPropertyModel model)
 {
     _model        = model;
     _configuredTs = new HashSet <T>(model.MemberMetadata
                                     .Where(kvp => kvp.Value.Key.RawKey is T)
                                     .ToDictionary(kvp => (T)kvp.Value.Key.RawKey, kvp => kvp.Key)
                                     .Keys);
 }
 internal static Key GetKey(this IGraphElementPropertyModel model, MemberInfo member)
 {
     return(KeyLookups
            .GetValue(
                model,
                closureModel => new KeyLookup(closureModel))
            .GetKey(member));
 }
Beispiel #5
0
        internal static object GetIdentifier(this IGraphElementPropertyModel model, MemberInfo member)
        {
            return(IdentifierDict
                   .GetOrCreateValue(model)
                   .GetOrAdd(
                       member,
                       closureMember =>
            {
                if (closureMember.DeclaringType != null && closureMember.DeclaringType.IsInterface)
                {
                    var interfaceGetter = ((PropertyInfo)closureMember).GetMethod;

                    var implementingGetters = model.Metadata.Keys
                                              .Select(x => x.DeclaringType)
                                              .Distinct()
                                              .Where(declaringType => closureMember.DeclaringType.IsAssignableFrom(declaringType))
                                              .Select(declaringType =>
                    {
                        var interfaceMap = declaringType
                                           .GetInterfaceMap(closureMember.DeclaringType);

                        var index = Array.IndexOf(
                            interfaceMap.InterfaceMethods,
                            interfaceGetter);

                        return interfaceMap.TargetMethods[index];
                    })
                                              .ToArray();

                    if (implementingGetters.Length > 0)
                    {
                        var identifiers = model.Metadata.Keys
                                          .Where(m => closureMember.DeclaringType.IsAssignableFrom(m.DeclaringType))
                                          .OfType <PropertyInfo>()
                                          .Where(p => implementingGetters.Contains(p.GetMethod, MemberInfoEqualityComparer.Instance))
                                          .Select(model.GetIdentifier)
                                          .Distinct()
                                          .ToArray();

                        if (identifiers.Length > 1)
                        {
                            throw new InvalidOperationException($"Contradicting identifiers found for member {closureMember}.");
                        }

                        if (identifiers.Length == 1)
                        {
                            return identifiers[0];
                        }
                    }
                }

                return model.GetIdentifier(model.Metadata
                                           .TryGetValue(closureMember)
                                           .IfNone(new PropertyMetadata(closureMember.Name)));
            }));
        }
        internal static Key GetKey(this IGraphElementPropertyModel model, Expression expression)
        {
            if (expression is LambdaExpression lambdaExpression)
            {
                return(model.GetKey(lambdaExpression.Body));
            }

            if (expression.Strip() is MemberExpression memberExpression)
            {
                return(memberExpression.TryGetWellKnownMember() == WellKnownMember.PropertyValue && memberExpression.Expression is MemberExpression sourceMemberExpression
                    ? model.GetKey(sourceMemberExpression.Member)
                    : model.GetKey(memberExpression.Member));
            }

            throw new ExpressionNotSupportedException(expression);
        }
Beispiel #7
0
 public static IGraphElementPropertyModel ConfigureElement <TElement>(this IGraphElementPropertyModel model, Func <IPropertyMetadataConfigurator <TElement>, IImmutableDictionary <MemberInfo, PropertyMetadata> > action)
     where TElement : class
 {
     return(model.ConfigureMetadata(
                metadata => action(new PropertyMetadataConfigurator <TElement>(metadata))));
 }
Beispiel #8
0
 public static IGraphElementPropertyModel WithLowerCaseNames(this IGraphElementPropertyModel model)
 {
     return(model.ConfigureNames((member, name) => name.ToLower()));
 }
Beispiel #9
0
 public static IGraphElementPropertyModel UseCamelCaseNames(this IGraphElementPropertyModel model)
 {
     return(model.ConfigureNames((member, name) => name.ToCamelCase()));
 }
Beispiel #10
0
 public static IGraphElementPropertyModel ConfigureNames(this IGraphElementPropertyModel model, Func <MemberInfo, string, string> overrideTransformation)
 {
     return(model.ConfigureMetadata(_ => _.ConfigureNames(overrideTransformation)));
 }
Beispiel #11
0
 private static IGraphElementPropertyModel ConfigureMetadata(this IGraphElementPropertyModel model, Func <IImmutableDictionary <MemberInfo, PropertyMetadata>, IImmutableDictionary <MemberInfo, PropertyMetadata> > transformation)
 {
     return(new GraphElementPropertyModelImpl(
                transformation(model.Metadata),
                model.SpecialNames));
 }
Beispiel #12
0
 //TODO: Honor Mask.
 internal override IDictionary <string, object> GetMetaProperties(IGraphElementPropertyModel model) => Properties?
 .Serialize(model, SerializationBehaviour.Default)
 .Where(x => x.identifier is string)
 .ToDictionary(x => (string)x.identifier, x => x.value) ?? (IDictionary <string, object>)ImmutableDictionary <string, object> .Empty;
 public GremlinContractResolver(IGraphElementPropertyModel model)
 {
     _model = model;
 }
Beispiel #14
0
 public GraphModelImpl(
     IGraphElementModel verticesModel,
     IGraphElementModel edgesModel,
     IGraphElementPropertyModel propertiesModel) : this(verticesModel, edgesModel, propertiesModel, DefaultNativeTypes)
 {
 }
Beispiel #15
0
 internal override IDictionary <string, object> GetMetaProperties(IGraphElementPropertyModel model) => Properties;
Beispiel #16
0
 internal abstract IDictionary <string, object> GetMetaProperties(IGraphElementPropertyModel model);
Beispiel #17
0
 public GraphModelImpl(IGraphElementModel verticesModel, IGraphElementModel edgesModel, IGraphElementPropertyModel propertiesModel)
 {
     VerticesModel   = verticesModel;
     EdgesModel      = edgesModel;
     PropertiesModel = propertiesModel;
 }
Beispiel #18
0
 public static IGraphElementPropertyModel ConfigureElement <TElement>(this IGraphElementPropertyModel model, Func <IMemberMetadataConfigurator <TElement>, IImmutableDictionary <MemberInfo, MemberMetadata> > transformation)
 {
     return(model.ConfigureMemberMetadata(
                metadata => transformation(new MemberMetadataConfigurator <TElement>(metadata))));
 }