예제 #1
0
        public async Task <string[]> UnloadToLocalFolder(PivotRequest request, string destinationFolder)
        {
            var unloadResult = await Unload(request);

            var files       = unloadResult.Files.ToArray();
            var fileNames   = new string[files.Length];
            var urls        = new string[files.Length];
            var fileStreams = new Stream[files.Length];

            bool succeeded = false;

            try
            {
                for (var i = 0; i < files.Length; i++)
                {
                    var file = files[i];
                    fileStreams[i] = File.Create(Path.Combine(destinationFolder, file.Name));
                    fileNames[i]   = file.Name;
                    urls[i]        = file.Url;
                }

                var copyTasks = await Task.WhenAll(GetFilesAfterUnload(urls, fileStreams));

                await Task.WhenAll(copyTasks);

                succeeded = true;
            }
            finally
            {
                if (fileStreams != null)
                {
                    for (var i = 0; i < fileStreams.Length; i++)
                    {
                        if (fileStreams[i] != null)
                        {
                            fileStreams[i].Dispose();
                        }
                    }
                }

                if (!succeeded && fileNames != null)
                {
                    for (var i = 0; i < fileNames.Length; i++)
                    {
                        if (!string.IsNullOrEmpty(fileNames[i]))
                        {
                            try
                            {
                                File.Delete(destinationFolder + '\\' + fileNames[i]);
                            }
                            catch { }
                        }
                    }

                    fileNames = null;
                }
            }

            return(fileNames);
        }
예제 #2
0
        public PivotLevel ComputePivot(OrQuery filter, IEnumerable <int> axis, IEnumerable <int> values)
        {
            if (filter == null)
            {
                throw new ArgumentNullException(nameof(filter));
            }

            var request = new PivotRequest(filter);

            request.AxisList.AddRange(axis);
            request.ValuesList.AddRange(values);

            var response = Channel.SendRequest(request);

            if (response is ExceptionResponse exResponse)
            {
                throw new CacheException("Error in ComputePivot", exResponse.Message, exResponse.CallStack);
            }

            if (!(response is PivotResponse pivotResponse))
            {
                throw new CacheException("Invalid type of response received in ComputePivot()");
            }

            return(pivotResponse.Root);
        }
예제 #3
0
        private async Task <DatasetUnloadTaskResultData> Unload(PivotRequest request, int spinDelayInSeconds = 10, int maxWaitCount = 360)
        {
            var unloadTaskResponse = await StartUnload(request);

            var taskResult = await WaitTaskResult <DatasetUnloadTaskResult>(unloadTaskResponse, spinDelayInSeconds, maxWaitCount);

            return(taskResult.Data);
        }
예제 #4
0
        public void GetDataBegin()
        {
            var client  = new Client("knoema.com");
            var request = new PivotRequest
            {
                Dataset = "fzoaozc",
                Header  = new List <PivotRequestItem> {
                    new PivotRequestItem {
                        DimensionId = "Time", UiMode = "AllData"
                    }
                },
                Stub = new List <PivotRequestItem> {
                    new PivotRequestItem {
                        DimensionId = "country", Members = new List <object> {
                            1000010
                        }
                    }
                },
                Filter = new List <PivotRequestItem> {
                    new PivotRequestItem {
                        DimensionId = "indicator", Members = new List <object> {
                            1000000
                        }
                    }
                },
                Frequencies = new List <string> {
                    "A"
                },
                DetailColumns = new[] { "*" }
            };

            var result = client.GetDataBegin(request).GetAwaiter().GetResult();

            Assert.IsNotNull(result.Descriptor);
            Assert.AreEqual(2, result.Descriptor.DetailColumns.Count());
            Assert.AreEqual("EndPeriod", result.Descriptor.DetailColumns.ElementAt(0).Name);

            var detailColumns = result.Descriptor.DetailColumns.Select(c => c.Name).OrderBy(c => c).ToArray();
            var detailValues  = result.Data.First().DetailValues;
            var valuesColumns = detailValues.Keys.OrderBy(k => k).ToArray();

            Assert.IsTrue(Enumerable.SequenceEqual(detailColumns, valuesColumns));
            Assert.AreEqual(29, detailValues["EndPeriod"].Count());
            Assert.AreEqual(29, detailValues["Annotation"].Count());
        }
예제 #5
0
        private async IAsyncEnumerable <T> GetDataStreamingResponseAsync <T>(PivotRequest pivot)
        {
            var response = await ApiPost <StreamingDataResponse <T> >("/api/1.0/data/raw/", pivot);

            foreach (var dataItem in response.Data)
            {
                yield return(dataItem);
            }

            var token = response.ContinuationToken;

            while (!string.IsNullOrEmpty(token))
            {
                response = await ApiGet <StreamingDataResponse <T> >("/api/1.0/data/raw/", new Dictionary <string, string> {
                    { "continuationToken", token }
                });

                foreach (var dataItem in response.Data)
                {
                    yield return(dataItem);
                }
                token = response.ContinuationToken;
            }
        }
예제 #6
0
 private Task <TaskResponse> StartUnload(PivotRequest request)
 {
     return(ApiPost <TaskResponse>("/api/1.0/data/unload", request));
 }
예제 #7
0
 public IAsyncEnumerable <FlatTimeSeriesRawData> GetFlatDataStreamingAsync(PivotRequest pivot)
 {
     return(GetDataStreamingResponseAsync <FlatTimeSeriesRawData>(pivot));
 }
예제 #8
0
 public Task <FlatTimeSeriesRawDataResponse> GetFlatDataBegin(PivotRequest pivot)
 {
     return(ApiPost <FlatTimeSeriesRawDataResponse>("/api/1.0/data/raw/", pivot));
 }
예제 #9
0
 public Task <PivotResponse> GetData(PivotRequest pivot)
 {
     return(ApiPost <PivotResponse>("/api/1.0/data/pivot/", pivot));
 }
예제 #10
0
 public Task <RegularTimeSeriesRawDataResponse> GetDataBegin(PivotRequest pivot)
 {
     return(ApiPost <RegularTimeSeriesRawDataResponse>("/api/1.0/data/raw/", pivot, 600000)); // 10 minutes timeout
 }
예제 #11
0
        public void UnloadData()
        {
            var clientId = ConfigurationManager.AppSettings["ClientId"];

            if (string.IsNullOrEmpty(clientId))
            {
                return;
            }

            var client  = new Client("knoema.org", clientId, "");
            var request = new PivotRequest()
            {
                Dataset     = "COMTRADE2015R1",
                Frequencies = new List <string> {
                    "A"
                }
            };

            request.Header.Add(new PivotRequestItem
            {
                DimensionId = "Time",
                Members     = { "2010-2011" },
                UiMode      = "range",
            });
            request.Stub.Add(new PivotRequestItem
            {
                DimensionId = "reporter",
                Members     = { 1000000, 1000100 }
            });
            request.Stub.Add(new PivotRequestItem
            {
                DimensionId = "indicator",
                Members     = { 1000010, 1000020 }
            });
            request.Stub.Add(new PivotRequestItem
            {
                DimensionId = "partner",
                Members     = { 1000000, 1000100 }
            });
            request.Stub.Add(new PivotRequestItem
            {
                DimensionId = "commodity",
                Members     = { 1000110, 1000100 }
            });

            var tempFolder = Path.GetTempPath() + "KNunload_" + Guid.NewGuid().ToString();

            Directory.CreateDirectory(tempFolder);
            try
            {
                var files = client.UnloadToLocalFolder(request, tempFolder).GetAwaiter().GetResult();
                if (files != null)
                {
                    for (var i = 0; i < files.Length; i++)
                    {
                        var fileName = tempFolder + '\\' + files[i];
                        if (File.Exists(fileName))
                        {
                            try
                            {
                                File.Delete(fileName);
                            }
                            catch (Exception)
                            {
                            }
                        }
                    }
                }
            }
            finally
            {
                Directory.Delete(tempFolder, recursive: true);
            }
        }
        public PivotRequest GetRequest()
        {
            var request = new PivotRequest();

            request.Dataset = _dataset.Id;
            if (_frequencies != null)
            {
                request.Frequencies = _frequencies.ToList();
            }

            var timeItem = new PivotRequestItem {
                DimensionId = "Time"
            };

            if (string.IsNullOrEmpty(TimeRange))
            {
                timeItem.UiMode  = "allData";
                timeItem.Members = null;
            }
            else
            {
                timeItem.UiMode = "range";
                timeItem.Members.Add(TimeRange);
            }
            request.Header.Add(timeItem);

            foreach (var dimPair in _dimensions)
            {
                var dimId   = dimPair.Key;
                var dimKeys = dimPair.Value;
                if (dimKeys == null || dimKeys.Count == 0)
                {
                    continue;
                }

                var    dimMeta = _client.GetDatasetDimension(_dataset.Id, dimId).GetAwaiter().GetResult();
                object idVal;
                string keyVal;
                foreach (var member in dimMeta.Items)
                {
                    if (member.Fields != null && member.Fields.TryGetValue("id", out idVal) && idVal != null && dimKeys.ContainsKey(idVal.ToString()))
                    {
                        keyVal = idVal.ToString();
                    }
                    else if (dimKeys.ContainsKey(member.Name))
                    {
                        keyVal = member.Name;
                    }
                    else if (dimKeys.ContainsKey(member.Key.ToString()))
                    {
                        keyVal = member.Key.ToString();
                    }
                    else
                    {
                        keyVal = null;
                    }

                    if (!string.IsNullOrEmpty(keyVal))
                    {
                        dimKeys[keyVal] = member.Key;
                    }
                }

                PivotRequestItem dimItem = null;
                foreach (var memberKey in dimKeys.Values)
                {
                    if (memberKey != 0)
                    {
                        if (dimItem == null)
                        {
                            dimItem = new PivotRequestItem {
                                DimensionId = dimId
                            };
                            request.Stub.Add(dimItem);
                        }
                        dimItem.Members.Add(memberKey);
                    }
                }
            }

            return(request);
        }
예제 #13
0
        public async Task GetDataBeginExternalDataset()
        {
            var appId = ConfigurationManager.AppSettings["AppId"];

            if (string.IsNullOrEmpty(appId))
            {
                throw new ArgumentException("Please add app id to configuration");
            }

            var appSecret = ConfigurationManager.AppSettings["AppSecret"];

            if (string.IsNullOrEmpty(appSecret))
            {
                throw new ArgumentException("Please add app secret to configuration");
            }

            var host = ConfigurationManager.AppSettings["HostWithExternalDataset"];

            if (string.IsNullOrEmpty(host))
            {
                throw new ArgumentException("Please add HostWithExternalDataset to configuration");
            }

            var datasetId = ConfigurationManager.AppSettings["ExternalDatasetId"];

            if (string.IsNullOrEmpty(datasetId))
            {
                throw new ArgumentException("Please add ExternalDatasetId to configuration");
            }

            var client  = new Client(host, appId, appSecret);
            var request = new PivotRequest
            {
                Dataset = datasetId,
                Header  = new List <PivotRequestItem> {
                    new PivotRequestItem {
                        DimensionId = "Time", UiMode = "AllData"
                    }
                },
                Stub = new List <PivotRequestItem>
                {
                    new PivotRequestItem {
                        DimensionId = "INDICATOR", Members = new List <object> {
                            "Number Of Applications Completed"
                        }
                    },
                },
                Filter = new List <PivotRequestItem>
                {
                    new PivotRequestItem {
                        DimensionId = "PRODUCTNAME", Members = new List <object> {
                            "Universal Life"
                        }
                    },
                    new PivotRequestItem {
                        DimensionId = "RESIDENCYSTATE", Members = new List <object> {
                            "NA"
                        }
                    },
                    new PivotRequestItem {
                        DimensionId = "AGEGROUP", Members = new List <object> {
                            "40-44"
                        }
                    },
                    new PivotRequestItem {
                        DimensionId = "GENDER", Members = new List <object> {
                            "FEMALE"
                        }
                    },
                    new PivotRequestItem {
                        DimensionId = "HOUSEHOLDINCOME", Members = new List <object> {
                            "Over $250,000"
                        }
                    },
                    new PivotRequestItem {
                        DimensionId = "RISKCLASS", Members = new List <object> {
                            "NA"
                        }
                    }
                },
                Frequencies = new List <string> {
                    "D"
                },
                DetailColumns = new[] { "*" }
            };
            var result = await client.GetDataBegin(request);

            Assert.IsTrue(result.Data.Any());
        }
예제 #14
0
        static void Main(string[] args)
        {
            var client = new Knoema.Client(
                ConfigurationManager.AppSettings["host"], ConfigurationManager.AppSettings["clientId"], ConfigurationManager.AppSettings["appSecret"]);

            Console.WriteLine("Getting dataset metadata...");

            client.GetDataset("gquvbhe").ContinueWith(d =>
            {
                Console.WriteLine("Dataset has {0} dimensions: {1}.", d.Result.Dimensions.Count(), string.Join(", ", d.Result.Dimensions.Select(x => x.Name).ToArray()));

                var stub = new List <PivotRequestItem>();
                foreach (var dim in d.Result.Dimensions)
                {
                    Console.WriteLine(string.Format("Getting \"{0}\" dataset dimension details...", dim.Name));

                    client.GetDatasetDimension(d.Result.Id, dim.Id).ContinueWith(t =>
                    {
                        Console.WriteLine(string.Format("Dimension \"{0}\" has {1} members: {2}.",
                                                        t.Result.Name, t.Result.Items.Count(), string.Join(", ", t.Result.Items.Select(x => x.Name.ToString()).ToArray())));

                        stub.Add(new PivotRequestItem()
                        {
                            DimensionId = t.Result.Id,
                            Members     = t.Result.Items.Where(x => x.HasData).Select(x => x.Key).Take(10).Cast <object>().ToList()
                        });
                    }).Wait();
                }

                var header = new PivotRequestItem()
                {
                    DimensionId = "Time"
                };
                for (var i = 1990; i < 2010; i++)
                {
                    header.Members.Add(i);
                }

                Console.WriteLine("Getting dataset data...");

                var pivotRequest = new PivotRequest()
                {
                    Dataset     = "gquvbhe",
                    Frequencies = new List <string>()
                    {
                        "A"
                    },
                    Stub   = stub,
                    Header = new List <PivotRequestItem>()
                    {
                        header
                    }
                };

                client.GetData(pivotRequest).ContinueWith(t =>
                {
                    t.Result.Tuples.Take(10).ToList().ForEach(x =>
                                                              Console.WriteLine(string.Join(", ", x.Select(y => y.Key + ":" + y.Value).ToList()))
                                                              );

                    Console.WriteLine(string.Format("{0} rows of data have been received.", t.Result.Tuples.Count));
                    Console.WriteLine("Press any key to exit.");
                    Console.ReadKey();
                }).Wait();
            }).Wait();
        }