Skip to content

Commit

Permalink
TSI-3231 : Added Search Provider
Browse files Browse the repository at this point in the history
  • Loading branch information
majiccode committed Aug 8, 2018
1 parent bed6a70 commit d06bb5c
Show file tree
Hide file tree
Showing 11 changed files with 217 additions and 82 deletions.
11 changes: 11 additions & 0 deletions Sdl.Web.Common/Interfaces/IQueryProvider.cs
@@ -0,0 +1,11 @@
using System.Collections.Generic;
using Sdl.Web.Common.Models;

namespace Sdl.Web.Common.Interfaces
{
public interface IQueryProvider
{
bool HasMore { get; }
IEnumerable<string> ExecuteQuery(SimpleBrokerQuery queryParams);
}
}
1 change: 1 addition & 0 deletions Sdl.Web.Common/Models/Query/Query.cs
Expand Up @@ -7,6 +7,7 @@ public abstract class Query
public ILocalization Localization { get; set; }
public int MaxResults { get; set; }
public int Start { get; set; }
public string Cursor { get; set; }
public int PageSize { get; set; }
}
}
1 change: 1 addition & 0 deletions Sdl.Web.Common/Sdl.Web.Common.csproj
Expand Up @@ -106,6 +106,7 @@
<Compile Include="Interfaces\IModelServiceProvider.cs" />
<Compile Include="Interfaces\INavigationProvider.cs" />
<Compile Include="Interfaces\IOnDemandNavigationProvider.cs" />
<Compile Include="Interfaces\IQueryProvider.cs" />
<Compile Include="Interfaces\IRichTextProcessor.cs" />
<Compile Include="Interfaces\IUnknownLocalizationHandler.cs" />
<Compile Include="Logging\Log4NetLogger.cs" />
Expand Down
12 changes: 8 additions & 4 deletions Sdl.Web.Tridion/Providers/Binary/GraphQLBinaryProvider.cs
Expand Up @@ -4,36 +4,40 @@
using Sdl.Web.PublicContentApi.ContentModel;
using Sdl.Web.Tridion.PCAClient;
using Sdl.Web.HttpClient.Request;
using Sdl.Web.PublicContentApi.Utils;

namespace Sdl.Web.Tridion.Providers.Binary
{
public class GraphQLBinaryProvider : IBinaryProvider
{
protected ContentNamespace GetNamespace(ILocalization localization)
=> CmUri.NamespaceIdentiferToId(localization.CmUriScheme);

public DateTime GetBinaryLastPublishedDate(ILocalization localization, string urlPath)
{
var client = PCAClientFactory.Instance.CreateClient();
var binary = client.GetBinaryComponent(ContentNamespace.Sites, int.Parse(localization.Id), urlPath, null);
var binary = client.GetBinaryComponent(GetNamespace(localization), int.Parse(localization.Id), urlPath, null);
return DateTime.ParseExact(binary.InitialPublishDate, "MM/dd/yyyy HH:mm:ss", null);
}

public DateTime GetBinaryLastPublishedDate(ILocalization localization, int binaryId)
{
var client = PCAClientFactory.Instance.CreateClient();
var binary = client.GetBinaryComponent(ContentNamespace.Sites, int.Parse(localization.Id), binaryId, null);
var binary = client.GetBinaryComponent(GetNamespace(localization), int.Parse(localization.Id), binaryId, null);
return DateTime.ParseExact(binary.InitialPublishDate, "MM/dd/yyyy HH:mm:ss", null);
}

public byte[] GetBinary(ILocalization localization, int binaryId, out string binaryPath)
{
var client = PCAClientFactory.Instance.CreateClient();
var binary = client.GetBinaryComponent(ContentNamespace.Sites, int.Parse(localization.Id), binaryId, null);
var binary = client.GetBinaryComponent(GetNamespace(localization), int.Parse(localization.Id), binaryId, null);
return GetBinaryData(client, binary, out binaryPath);
}

public byte[] GetBinary(ILocalization localization, string urlPath, out string binaryPath)
{
var client = PCAClientFactory.Instance.CreateClient();
var binary = client.GetBinaryComponent(ContentNamespace.Sites, int.Parse(localization.Id), urlPath, null);
var binary = client.GetBinaryComponent(GetNamespace(localization), int.Parse(localization.Id), urlPath, null);
return GetBinaryData(client, binary, out binaryPath);
}

Expand Down
6 changes: 3 additions & 3 deletions Sdl.Web.Tridion/Providers/DefaultContentProvider.cs
Expand Up @@ -9,7 +9,7 @@
using Sdl.Web.Common.Logging;
using Sdl.Web.Common.Models;
using Sdl.Web.DataModel;
using Sdl.Web.Tridion.Query;
using Sdl.Web.Tridion.Providers.Query;
using Sdl.Web.Tridion.Statics;
using Tridion.ContentDelivery.DynamicContent;
using Tridion.ContentDelivery.DynamicContent.Query;
Expand Down Expand Up @@ -119,8 +119,8 @@ public virtual void PopulateDynamicList(DynamicList dynamicList, ILocalization l
throw new DxaException($"Unexpected result from {dynamicList.GetType().Name}.GetQuery: {dynamicList.GetQuery(localization)}");
}

BrokerQuery brokerQuery = new BrokerQuery(simpleBrokerQuery);
string[] componentUris = brokerQuery.ExecuteQuery().ToArray();
Common.Interfaces.IQueryProvider brokerQuery = new BrokerQueryProvider();
string[] componentUris = brokerQuery.ExecuteQuery(simpleBrokerQuery).ToArray();
Log.Debug($"Broker Query returned {componentUris.Length} results. HasMore={brokerQuery.HasMore}");

if (componentUris.Length > 0)
Expand Down
70 changes: 65 additions & 5 deletions Sdl.Web.Tridion/Providers/GraphQLContentProvider.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
Expand All @@ -9,7 +10,7 @@
using Sdl.Web.Common.Logging;
using Sdl.Web.Common.Models;
using Sdl.Web.DataModel;
using Sdl.Web.Tridion.Query;
using Sdl.Web.Tridion.Providers.Query;
using Sdl.Web.Tridion.Statics;
using Tridion.ContentDelivery.DynamicContent;
using Tridion.ContentDelivery.DynamicContent.Query;
Expand All @@ -22,6 +23,54 @@ namespace Sdl.Web.Tridion.Mapping
/// </summary>
public class GraphQLContentProvider : IContentProvider, IRawDataProvider
{
#region Cursor
internal class CursorMap : Dictionary<int, string>
{
private const string SessionKey = "dxa_cursors";

private static CursorMap GetCursorMap(string id)
{
var cursors = (Dictionary<string, CursorMap>)HttpContext.Current.Session[SessionKey] ?? new Dictionary<string, CursorMap>();
if (!cursors.ContainsKey(id))
{
cursors.Add(id, new CursorMap());
}
HttpContext.Current.Session[SessionKey] = cursors;
return cursors[id];
}

public static string GetCursor(string id, ref int start)
{
if (start == 0) return null;

CursorMap cursorMap = GetCursorMap(id);

if(cursorMap.ContainsKey(start)) return cursorMap[start];

if (cursorMap.Count == 0)
{
start = 0;
return null;
}

int min = 0;
foreach (var x in cursorMap.Keys)
{
if (x >= min && x < start)
min = x;
}
start = min;
return start == 0 ? null : cursorMap[start];
}

public static void SetCursor(string id, int start, string cursor)
{
var cursorMap = GetCursorMap(id);
cursorMap[start] = cursor;
}
}
#endregion

private readonly IModelService _modelService;

public GraphQLContentProvider()
Expand Down Expand Up @@ -112,15 +161,20 @@ public virtual StaticContentItem GetStaticContentItem(int binaryId, ILocalizatio
public virtual void PopulateDynamicList(DynamicList dynamicList, ILocalization localization)
{
using (new Tracer(dynamicList, localization))
{
{
SimpleBrokerQuery simpleBrokerQuery = dynamicList.GetQuery(localization) as SimpleBrokerQuery;
if (simpleBrokerQuery == null)
{
throw new DxaException($"Unexpected result from {dynamicList.GetType().Name}.GetQuery: {dynamicList.GetQuery(localization)}");
}

BrokerQuery brokerQuery = new BrokerQuery(simpleBrokerQuery);
string[] componentUris = brokerQuery.ExecuteQuery().ToArray();

int start = simpleBrokerQuery.Start;
simpleBrokerQuery.Cursor = CursorMap.GetCursor(dynamicList.Id, ref start);
simpleBrokerQuery.Start = start;
dynamicList.Start = start;

var brokerQuery = new GraphQLQueryProvider();
string[] componentUris = brokerQuery.ExecuteQuery(simpleBrokerQuery).ToArray();
Log.Debug($"Broker Query returned {componentUris.Length} results. HasMore={brokerQuery.HasMore}");

if (componentUris.Length > 0)
Expand All @@ -133,6 +187,12 @@ public virtual void PopulateDynamicList(DynamicList dynamicList, ILocalization l
}

dynamicList.HasMore = brokerQuery.HasMore;

if (brokerQuery.HasMore)
{
CursorMap.SetCursor(dynamicList.Id, simpleBrokerQuery.Start + simpleBrokerQuery.PageSize,
brokerQuery.Cursor);
}
}
}

Expand Down
Expand Up @@ -9,6 +9,7 @@
using Sdl.Web.PublicContentApi.ContentModel;
using Sdl.Web.PublicContentApi.Exceptions;
using Sdl.Web.PublicContentApi.ModelServicePlugin;
using Sdl.Web.PublicContentApi.Utils;
using Sdl.Web.Tridion.PCAClient;

namespace Sdl.Web.Tridion.ModelService
Expand All @@ -29,11 +30,14 @@ public void AddDataModelExtension(IDataModelExtension extension)

protected PublicContentApi.PublicContentApi Client => PCAClientFactory.Instance.CreateClient();

protected ContentNamespace GetNamespace(ILocalization localization)
=> CmUri.NamespaceIdentiferToId(localization.CmUriScheme);

public EntityModelData GetEntityModelData(string entityId, ILocalization localization)
{
try
{
var json = Client.GetEntityModelData(ContentNamespace.Sites, int.Parse(localization.Id),
var json = Client.GetEntityModelData(GetNamespace(localization), int.Parse(localization.Id),
int.Parse(entityId),
ContentType.MODEL, DataModelType.R2, DcpType.DEFAULT,
false, null);
Expand All @@ -49,7 +53,7 @@ public PageModelData GetPageModelData(int pageId, ILocalization localization, bo
{
try
{
var json = Client.GetPageModelData(ContentNamespace.Sites, int.Parse(localization.Id), pageId,
var json = Client.GetPageModelData(GetNamespace(localization), int.Parse(localization.Id), pageId,
ContentType.MODEL, DataModelType.R2, addIncludes ? PageInclusion.INCLUDE : PageInclusion.EXCLUDE,
false, null);
return LoadModel<PageModelData>(json);
Expand All @@ -64,7 +68,7 @@ public PageModelData GetPageModelData(string urlPath, ILocalization localization
{
try
{
var json = Client.GetPageModelData(ContentNamespace.Sites, int.Parse(localization.Id),
var json = Client.GetPageModelData(GetNamespace(localization), int.Parse(localization.Id),
GetCanonicalUrlPath(urlPath),
ContentType.MODEL, DataModelType.R2, addIncludes ? PageInclusion.INCLUDE : PageInclusion.EXCLUDE,
false, null);
Expand All @@ -80,7 +84,7 @@ public SitemapItem[] GetChildSitemapItems(string parentSitemapItemId, ILocalizat
{
try
{
var sitmapItems = Client.GetSitemapSubtree(ContentNamespace.Sites,
var sitmapItems = Client.GetSitemapSubtree(GetNamespace(localization),
int.Parse(localization.Id), parentSitemapItemId, descendantLevels, null);
if (sitmapItems != null && sitmapItems.Items != null)
{
Expand All @@ -99,7 +103,7 @@ public TaxonomyNode GetSitemapItem(ILocalization localization)
try
{
return Convert<TaxonomySitemapItem, TaxonomyNode>(
Client.GetSitemap(ContentNamespace.Sites, int.Parse(localization.Id), 10, null));
Client.GetSitemap(GetNamespace(localization), int.Parse(localization.Id), 10, null));
}
catch (PcaException)
{
Expand Down Expand Up @@ -148,7 +152,7 @@ private static string GetCanonicalUrlPath(string urlPath)
if (urlPath.LastIndexOf(".", StringComparison.Ordinal) > 0)
return urlPath;

return urlPath + Constants.DefaultExtension;
return urlPath + Constants.IndexPageUrlSuffix + Constants.DefaultExtension;
}
}
}

0 comments on commit d06bb5c

Please sign in to comment.