/// <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)); } }