Skip to content
Snippets Groups Projects
Commit e00e2285 authored by Petar Hristov's avatar Petar Hristov :speech_balloon:
Browse files

Merge branch 'Hotfix/2352-onlyChanged' into 'master'

Fix: Deploy only changed graphs

See merge request !9
parents e743de50 b9877560
No related branches found
No related tags found
1 merge request!9Fix: Deploy only changed graphs
......@@ -27,6 +27,7 @@
<PackageReference Include="LibGit2Sharp" Version="0.26.2" />
<PackageReference Include="NLog" Version="5.1.0" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.2.0" />
<PackageReference Include="Polly.Extensions.Http" Version="3.0.0" />
</ItemGroup>
<ItemGroup>
......
using Polly;
namespace Coscine.GraphDeployer;
public static class Helpers
{
/// <summary>
/// Retry Virtuoso Requests since they sometimes just fail
/// </summary>
/// <typeparam name="W"></typeparam>
/// <param name="function"></param>
/// <returns></returns>
public static void WrapRequest(Action action)
{
Policy
.Handle<Exception>()
.WaitAndRetry(5, retryNumber => TimeSpan.FromMilliseconds(200))
.Execute(() => action.Invoke());
}
/// <summary>
/// Retry Virtuoso Requests since they sometimes just fail
/// </summary>
/// <typeparam name="W"></typeparam>
/// <param name="function"></param>
/// <returns></returns>
public static W WrapRequest<W>(Func<W> function)
{
return Policy
.Handle<Exception>()
.WaitAndRetry(5, retryNumber => TimeSpan.FromMilliseconds(200))
.ExecuteAndCapture(() => function.Invoke()).Result;
}
}
......@@ -90,16 +90,41 @@ public class Program
// Graph Insertion
var queries = new List<string>();
var turtleFiles = Directory.GetFiles(WorkingFolder, "*.ttl", SearchOption.AllDirectories);
foreach (var file in turtleFiles)
var graphAccumulation = new Dictionary<Uri, (Graph, List<string>)>();
Array.ForEach(turtleFiles, (file) =>
{
var fileInfo = new FileInfo(file);
var graph = new Graph();
graph.LoadFromFile(file);
var graphName = graph.BaseUri.ToString();
if (graphAccumulation.ContainsKey(graph.BaseUri))
{
graphAccumulation[graph.BaseUri].Item1.Merge(graph);
graphAccumulation[graph.BaseUri].Item2.Add(file);
}
else
{
graphAccumulation.Add(graph.BaseUri, (graph, new List<string>() { file }));
}
});
if (_rdfStoreConnector.HasGraph(graphName))
foreach (var kv in graphAccumulation)
{
_rdfStoreConnector.ClearGraph(graphName);
var graph = kv.Value.Item1;
var graphName = kv.Key.ToString();
var currentGraph = Helpers.WrapRequest(() => _rdfStoreConnector.GetGraph(graphName));
var graphWasChanged = graph.Triples.Count != currentGraph.Triples.Count
|| graph.Triples.Any((triple) => !currentGraph.Triples.Any((currentTriple) =>
(triple.Subject.Equals(currentTriple.Subject) || (triple.Subject.NodeType == NodeType.Blank && currentTriple.Subject.NodeType == NodeType.Blank)
&& triple.Predicate.Equals(currentTriple.Predicate)
&& triple.Object.Equals(currentTriple.Object) || (triple.Object.NodeType == NodeType.Blank && currentTriple.Object.NodeType == NodeType.Blank))));
if (graphWasChanged)
{
if (!currentGraph.IsEmpty)
{
Helpers.WrapRequest(() => _rdfStoreConnector.ClearGraph(graphName));
_logger.LogInformation("Cleared Graph {graphName}", graphName);
}
else
......@@ -107,8 +132,18 @@ public class Program
_logger.LogInformation("No Graph {graphName}", graphName);
}
foreach (var file in kv.Value.Item2)
{
var fileInfo = new FileInfo(file);
queries.Add($"ld_dir('{fileInfo.DirectoryName[2..].Replace("\\", "/")}', '{fileInfo.Name}', '{graphName}');");
}
}
else
{
_logger.LogInformation("Skipping {graphName}", graphName);
}
}
queries.Add($"rdf_loader_run ();");
queries.Add($"DELETE from DB.DBA.load_list where 1=1;");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment