예제 #1
0
        /// <summary>
        /// Handles a UXF Data Table. Should not normally be called by the user. Instead, call session.SaveDataTable() or trial.SaveDataTable().
        /// </summary>
        /// <param name="table"></param>
        /// <param name="experiment"></param>
        /// <param name="ppid"></param>
        /// <param name="sessionNum"></param>
        /// <param name="dataName"></param>
        /// <param name="dataType"></param>
        /// <param name="optionalTrialNum"></param>
        public override string HandleDataTable(UXFDataTable table, string experiment, string ppid, int sessionNum, string dataName, UXFDataType dataType, int optionalTrialNum)
        {
            if (!CheckCurrentTargetOK())
            {
                return("not supported in editor");
            }
            if (dataType == UXFDataType.TrialResults)
            {
                // special case, one item per trial, but multiple items
                // so we need BatchWriteItem
                string primaryKeyValue = GetFormattedPrimaryKeyValue(ppid, sessionNum, dataName);
                string tableName       = GetTableName(experiment, dataType);

                if (!table.Headers.Contains("trial_num"))
                {
                    Debug.LogError("Data supplied is supposed to be per-trial but does not contain 'trial_num' column!");
                    return("error");
                }
                var dataList = table.GetAsListOfDict()
                               .Select(item => {
                    item[primaryKey] = primaryKeyValue;
                    return(item);
                })
                               .Cast <object>()
                               .ToList();

                if (dataList.Count <= 25)
                {
                    string req = MiniJSON.Json.Serialize(dataList);
                    DDB_BatchWriteItem(tableName, req, gameObject.name);
                }
                else
                {
                    // BatchWriteItem accepts 25 items at most
                    while (dataList.Any())
                    {
                        var dataListChunk = dataList.Take(25).ToList();
                        dataList = dataList.Skip(25).ToList();
                        string req = MiniJSON.Json.Serialize(dataListChunk);
                        DDB_BatchWriteItem(tableName, req, gameObject.name);
                    }
                }
                return(string.Format("dynamodb:{0}:{1}", tableName, primaryKeyValue));
            }
            else
            {
                Dictionary <string, object> dataDict = table
                                                       .GetAsDictOfList()
                                                       .ToDictionary(kvp => kvp.Key,
                                                                     kvp => (object)kvp.Value);

                return(HandleJSONSerializableObject(dataDict, experiment, ppid, sessionNum, dataName, dataType, optionalTrialNum));
            }
        }
        /// <summary>
        /// Handles a UXF Data Table. Should not normally be called by the user. Instead, call session.SaveDataTable() or trial.SaveDataTable().
        /// </summary>
        /// <param name="table"></param>
        /// <param name="experiment"></param>
        /// <param name="ppid"></param>
        /// <param name="sessionNum"></param>
        /// <param name="dataName"></param>
        /// <param name="dataType"></param>
        /// <param name="optionalTrialNum"></param>
        public override string HandleDataTable(UXFDataTable table, string experiment, string ppid, int sessionNum, string dataName, UXFDataType dataType, int optionalTrialNum)
        {
            if (!CheckCurrentTargetOK())
            {
                return("not supported in editor");
            }
            if (dataType == UXFDataType.TrialResults)
            {
                // special case, one item per trial, but multiple items
                // so we need BatchWriteItem
                string primaryKeyValue = GetFormattedPrimaryKeyValue(ppid, sessionNum, dataName);
                string tableName       = GetTableName(experiment, dataType);

                if (!table.Headers.Contains("trial_num"))
                {
                    Utilities.UXFDebugLogError("Data supplied is supposed to be per-trial but does not contain 'trial_num' column!");
                    return("error");
                }
                var dataList = table.GetAsListOfDict()
                               .Select(item => {
                    item[primaryKey] = primaryKeyValue;
                    return(item);
                })
                               .Cast <object>();

                // split the request into batches of 25 because of limit in DynamoDB BatchWriteItem
                var batches = dataList.Batch(25);
                foreach (var batch in batches)
                {
                    string req = MiniJSON.Json.Serialize(batch.ToList());
                    DDB_BatchWriteItem(tableName, req, gameObject.name);
                }
                return(string.Format("dynamodb:{0}:{1}", tableName, primaryKeyValue));
            }
            else
            {
                Dictionary <string, object> dataDict = table
                                                       .GetAsDictOfList()
                                                       .ToDictionary(kvp => kvp.Key,
                                                                     kvp => (object)kvp.Value);

                return(HandleJSONSerializableObject(dataDict, experiment, ppid, sessionNum, dataName, dataType, optionalTrialNum));
            }
        }