/// <summary>
        /// Represents an item that supports search according to DASL standard.
        /// </summary>
        public async Task <PageResults> SearchAsync(string searchString, SearchOptions options, List <PropertyName> propNames, long?offset, long?nResults)
        {
            bool includeSnippet = propNames.Any(s => s.Name == snippetProperty);
            List <IHierarchyItemAsync> searchResponse = new List <IHierarchyItemAsync>();
            IList <SearchResult>       searchResults  = await context.CognitiveSearchService.SearchAsync(searchString, options, includeSnippet);

            long totalItems = searchResults.Count;

            if (offset.HasValue && nResults.HasValue)
            {
                searchResults = searchResults.Skip((int)offset.Value).Take((int)nResults.Value).ToArray();
            }
            foreach (SearchResult searchResult in searchResults)
            {
                DataCloudItem dataLakeItem = await context.DataLakeStoreService.GetItemAsync(searchResult.Path);

                dataLakeItem.Snippet = searchResult.Snippet;
                IHierarchyItemAsync child;
                if (dataLakeItem.IsDirectory)
                {
                    child = new DavFolder(dataLakeItem, context, dataLakeItem.Path);
                }
                else
                {
                    child = new DavFile(dataLakeItem, context, dataLakeItem.Path);
                    if (includeSnippet)
                    {
                        (child as DavFile).Snippet = dataLakeItem.Snippet;
                    }
                }
                searchResponse.Add(child);
            }
            return(new PageResults(searchResponse, totalItems));
        }
        /// <summary>
        /// Returns file that corresponds to path.
        /// </summary>
        /// <param name="context">WebDAV Context.</param>
        /// <param name="path">Encoded path relative to WebDAV root folder.</param>
        /// <returns>File instance or null if physical file is not found in file system.</returns>
        public static async Task <DavFile> GetFileAsync(DavContext context, string path)
        {
            DataCloudItem dlItem = await context.DataLakeStoreService.GetItemAsync(path);

            DavFile davFile = new DavFile(dlItem, context, path)
            {
                serialNumber       = dlItem.Properties.TryGetValue("SerialNumber", out var sNumber) ? int.Parse(sNumber) : 0,
                TotalContentLength = dlItem.Properties.TryGetValue("TotalContentLength", out var value)
                    ? long.Parse(value)
                    : 0
            };

            return(davFile);
        }
        /// <summary>
        /// Called when children of this folder with paging information are being listed.
        /// </summary>
        /// <param name="propNames">List of properties to retrieve with the children. They will be queried by the engine later.</param>
        /// <param name="offset">The number of children to skip before returning the remaining items. Start listing from from next item.</param>
        /// <param name="nResults">The number of items to return.</param>
        /// <param name="orderProps">List of order properties requested by the client.</param>
        /// <returns>Items requested by the client and a total number of items in this folder.</returns>
        public virtual async Task <PageResults> GetChildrenAsync(IList <PropertyName> propNames, long?offset, long?nResults, IList <OrderProperty> orderProps)
        {
            // Enumerates all child files and folders.
            // You can filter children items in this implementation and
            // return only items that you want to be visible for this
            // particular user.
            IList <IHierarchyItemAsync> children  = new List <IHierarchyItemAsync>();
            IList <DataCloudItem>       childData = await context.DataLakeStoreService.GetChildrenAsync(Path);

            long totalItems = childData.Count;

            // Apply sorting.
            childData = SortChildren(childData, orderProps);
            // Apply paging.
            if (offset.HasValue && nResults.HasValue)
            {
                childData = childData.Skip((int)offset.Value).Take((int)nResults.Value).ToArray();
            }
            foreach (DataCloudItem dataLakeItem in childData)
            {
                IHierarchyItemAsync child;
                if (dataLakeItem.IsDirectory)
                {
                    child = new DavFolder(dataLakeItem, context, dataLakeItem.Path);
                }
                else
                {
                    DataCloudItem item = await context.DataLakeStoreService.GetItemAsync(dataLakeItem.Path);

                    dataLakeItem.Properties  = item.Properties;
                    dataLakeItem.ContentType = item.ContentType;
                    child = new DavFile(dataLakeItem, context, dataLakeItem.Path);
                }
                children.Add(child);
            }
            return(new PageResults(children, totalItems));
        }
 /// <summary>
 /// Initializes a new instance of this class.
 /// </summary>
 /// <param name="dataCloudItem">Corresponding DLItem.</param>
 /// <param name="context">WebDAV Context.</param>
 /// <param name="path">Encoded path relative to WebDAV root folder.</param>
 private DavFolder(DataCloudItem dataCloudItem, DavContext context, string path)
     : base(dataCloudItem, context, path.TrimEnd('/') + "/")
 {
 }
        /// <summary>
        /// Returns folder that corresponds to path.
        /// </summary>
        /// <param name="context">WebDAV Context.</param>
        /// <param name="path">Encoded path relative to WebDAV root folder.</param>
        /// <returns>Folder instance or null if physical folder not found in file system.</returns>
        public static async Task <DavFolder> GetFolderAsync(DavContext context, string path)
        {
            DataCloudItem dlItem = await context.DataLakeStoreService.GetItemAsync(path);

            return(new DavFolder(dlItem, context, path));
        }
 /// <summary>
 /// Initializes a new instance of this class.
 /// </summary>
 /// <param name="dataCloudItem">Corresponding DLItem.</param>
 /// <param name="context">WebDAV Context.</param>
 /// <param name="path">Encoded path relative to WebDAV root folder.</param>
 protected DavHierarchyItem(DataCloudItem dataCloudItem, DavContext context, string path)
 {
     this.dataCloudItem = dataCloudItem;
     this.context       = context;
     this.Path          = path;
 }
 /// <summary>
 /// Initializes a new instance of this class.
 /// </summary>
 /// <param name="dataCloudItem">Corresponding data lake item.</param>
 /// <param name="context">WebDAV Context.</param>
 /// <param name="path">Encoded path relative to WebDAV root folder.</param>
 internal DavFile(DataCloudItem dataCloudItem, DavContext context, string path)
     : base(dataCloudItem, context, path)
 {
     this.dataCloudItem = dataCloudItem;
 }