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