private static QueryArchiveOptions GetLocalArchiveOptions(Action <QueryArchiveOptions> archive, ArchiveOptions archiveOptions)
        {
            if (archive == null)
            {
                return(null);
            }

            var result = new QueryArchiveOptions(archiveOptions?.Name ?? "Data");

            result.GroupedBy(archiveOptions?.GroupName ?? "Perfion");

            if (archiveOptions != null)
            {
                if (archiveOptions.Expires.HasValue)
                {
                    result.ExpiresOn(archiveOptions.Expires.Value);
                }
            }
            else
            {
                result.ExpiresAfterMonths(1);
            }

            archive(result);
            return(result);
        }
        public PerfionXml Query(string query, Action <QueryArchiveOptions> archive = null)
        {
            return(Client(client =>
            {
                string xml = client.ExecuteQuery(new ExecuteQueryRequest {
                    Body = new ExecuteQueryRequestBody(query)
                }).Body.ExecuteQueryResult;

                ArchiveCreated archiveCreated = null;

                ArchiveOptions globalArchiveOptions = _configuration.ArchiveOptions;
                QueryArchiveOptions localArchiveOptions = GetLocalArchiveOptions(archive, globalArchiveOptions);

                ArchiveOptions finalArchiveOptions = localArchiveOptions ?? globalArchiveOptions;

                if (localArchiveOptions != null && localArchiveOptions.Disabled)
                {
                    finalArchiveOptions = null;
                }

                if (finalArchiveOptions != null)
                {
                    archiveCreated = _kernel.Resolve <IArchiveService>().Archive(finalArchiveOptions.Name, newArchive =>
                    {
                        newArchive.Options.GroupedBy(finalArchiveOptions.GroupName);

                        if (finalArchiveOptions.Expires.HasValue)
                        {
                            newArchive.Options.ExpiresOn(finalArchiveOptions.Expires.Value);
                        }

                        if (finalArchiveOptions.CompressionLevel.HasValue)
                        {
                            newArchive.Options.Compression(finalArchiveOptions.CompressionLevel.Value);
                        }

                        newArchive
                        .IncludeContent("Query.xml", query)
                        .IncludeContent("Data.xml", xml);
                    });
                }

                return new PerfionXml(this, XDocument.Parse(xml))
                {
                    Archive = archiveCreated
                };
            }));
        }