예제 #1
0
 private GraphResultSet CreateGraphResultSet(RowSet rs, IGraphTypeSerializer serializer)
 {
     return(GraphResultSet.CreateNew(
                rs,
                serializer.GraphProtocol,
                serializer.GetGraphRowParser()));
 }
예제 #2
0
        internal object ToObject(IGraphTypeSerializer serializer, UdtMap map, IEnumerable <JToken> valuesArr)
        {
            var obj = Activator.CreateInstance(map.NetType);
            var i   = 0;

            foreach (var value in valuesArr)
            {
                if (i >= map.Definition.Fields.Count)
                {
                    break;
                }

                var field = map.Definition.Fields[i];
                i++;

                var prop = map.GetPropertyForUdtField(field.Name);

                if (prop == null)
                {
                    continue;
                }

                var convertedValue = serializer.FromDb(value, prop.PropertyType, false);
                prop.SetValue(obj, convertedValue, null);
            }

            return(obj);
        }
예제 #3
0
        /// <inheritdoc />
        public dynamic Objectify(
            JToken graphsonObject, Type type, IGraphTypeSerializer serializer, IGenericSerializer genericSerializer)
        {
            if (!Utils.IsTuple(type))
            {
                throw new InvalidOperationException($"Can not deserialize a tuple to {type.FullName}.");
            }

            var values = (JArray)graphsonObject["value"];

            var genericArguments = type.GetGenericArguments();

            if (genericArguments.Length != values.Count)
            {
                throw new InvalidOperationException(
                          "Could not deserialize tuple, number of elements don't match " +
                          $"(expected {genericArguments.Length} but the server returned {values.Count}).");
            }
            var tupleValues = new object[values.Count];

            for (var i = 0; i < tupleValues.Length; i++)
            {
                tupleValues[i] = serializer.FromDb(values[i], genericArguments[i], false);
            }

            return(Activator.CreateInstance(type, tupleValues));
        }
예제 #4
0
        /// <inheritdoc />
        public dynamic Objectify(
            JToken graphsonObject, Type type, IGraphTypeSerializer serializer, IGenericSerializer genericSerializer)
        {
            var keyspace = serializer.FromDb <string>(graphsonObject["keyspace"]);
            var name     = serializer.FromDb <string>(graphsonObject["name"]);
            var values   = (JArray)graphsonObject["value"];

            var  targetTypeIsDictionary = false;
            Type elementType            = null;

            if (type.GetTypeInfo().IsGenericType &&
                (type.GetGenericTypeDefinition() == typeof(IReadOnlyDictionary <,>) ||
                 type.GetGenericTypeDefinition() == typeof(Dictionary <,>) ||
                 type.GetGenericTypeDefinition() == typeof(IDictionary <,>)))
            {
                targetTypeIsDictionary = true;
                var genericArgs = type.GetTypeInfo().GetGenericArguments();
                if (genericArgs[0] != typeof(string))
                {
                    throw new InvalidOperationException(
                              "Deserializing UDT to Dictionary is only supported when the dictionary key is of type \"string\".");
                }
                elementType = genericArgs[1];
            }

            UdtMap udtMap = null;
            bool   readToDictionary;

            if (targetTypeIsDictionary)
            {
                readToDictionary = true;
            }
            else
            {
                udtMap = genericSerializer.GetUdtMapByName($"{keyspace}.{name}");
                if (udtMap != null)
                {
                    readToDictionary = false;
                }
                else
                {
                    readToDictionary = true;
                    elementType      = typeof(object);
                }
            }

            var obj = readToDictionary
                ? ToDictionary(serializer, elementType, (JArray)graphsonObject["definition"], values)
                : ToObject(serializer, udtMap, values);

            if (!serializer.ConvertFromDb(obj, type, out var result))
            {
                throw new InvalidOperationException($"Could not convert UDT from type {obj.GetType().FullName} to {type.FullName}");
            }

            return(result);
        }
예제 #5
0
        internal object ToDictionary(
            IGraphTypeSerializer serializer, Type elementType, IEnumerable <JToken> definitions, IEnumerable <JToken> valuesArr)
        {
            var fieldNames         = definitions.Select(def => (string)def["fieldName"]).ToArray();
            var newDictionary      = (IDictionary)Activator.CreateInstance(typeof(Dictionary <,>).MakeGenericType(typeof(string), elementType));
            var elementIsGraphNode = elementType == typeof(GraphNode) || elementType == typeof(IGraphNode);

            var i = 0;

            foreach (var value in valuesArr)
            {
                var newValue = elementIsGraphNode
                    ? new GraphNode(new GraphSONNode(serializer, value))
                    : serializer.FromDb(value, elementType, false);
                var key = fieldNames[i];
                i++;

                newDictionary.Add(key, newValue);
            }

            return(newDictionary);
        }