Improved exception handling for indexing

This commit is contained in:
2025-12-13 16:12:57 +01:00
parent 02bdf4ad10
commit 94252fe63e
4 changed files with 40 additions and 25 deletions

View File

@@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Mvc;
using System.Text.Json; using System.Text.Json;
using Shared.Models; using Shared.Models;
using Server.Helper; using Server.Helper;
using Server.Exceptions;
namespace Server.Controllers; namespace Server.Controllers;
[ApiController] [ApiController]
@@ -43,35 +44,43 @@ public class EntityController : ControllerBase
[HttpPost("Index")] [HttpPost("Index")]
public ActionResult<EntityIndexResult> Index([FromBody] List<JSONEntity>? jsonEntities) public ActionResult<EntityIndexResult> Index([FromBody] List<JSONEntity>? jsonEntities)
{ {
List<Entity>? entities = SearchdomainHelper.EntitiesFromJSON( try
[],
_domainManager.embeddingCache,
_domainManager.aIProvider,
_domainManager.helper,
_logger,
JsonSerializer.Serialize(jsonEntities));
if (entities is not null && jsonEntities is not null)
{ {
List<string> invalidatedSearchdomains = []; List<Entity>? entities = SearchdomainHelper.EntitiesFromJSON(
foreach (var jsonEntity in jsonEntities) [],
_domainManager.embeddingCache,
_domainManager.aIProvider,
_domainManager.helper,
_logger,
JsonSerializer.Serialize(jsonEntities));
if (entities is not null && jsonEntities is not null)
{ {
string jsonEntityName = jsonEntity.Name; List<string> invalidatedSearchdomains = [];
string jsonEntitySearchdomainName = jsonEntity.Searchdomain; foreach (var jsonEntity in jsonEntities)
if (entities.Select(x => x.name == jsonEntityName).Any()
&& !invalidatedSearchdomains.Contains(jsonEntitySearchdomainName))
{ {
invalidatedSearchdomains.Add(jsonEntitySearchdomainName); string jsonEntityName = jsonEntity.Name;
_domainManager.InvalidateSearchdomainCache(jsonEntitySearchdomainName); string jsonEntitySearchdomainName = jsonEntity.Searchdomain;
if (entities.Select(x => x.name == jsonEntityName).Any()
&& !invalidatedSearchdomains.Contains(jsonEntitySearchdomainName))
{
invalidatedSearchdomains.Add(jsonEntitySearchdomainName);
_domainManager.InvalidateSearchdomainCache(jsonEntitySearchdomainName);
}
} }
return Ok(new EntityIndexResult() { Success = true });
} }
return Ok(new EntityIndexResult() { Success = true }); else
} {
else _logger.LogError("Unable to deserialize an entity");
return Ok(new EntityIndexResult() { Success = false, Message = "Unable to deserialize an entity"});
}
} catch (Exception ex)
{ {
_logger.LogError("Unable to deserialize an entity"); if (ex.InnerException is not null) ex = ex.InnerException;
_logger.LogError("Unable to index the provided entities. {ex.Message}", [ex.Message]);
return Ok(new EntityIndexResult() { Success = false, Message = ex.Message });
} }
return Ok(new EntityIndexResult() { Success = false });
} }
[HttpGet("List")] [HttpGet("List")]

View File

@@ -0,0 +1,5 @@
namespace Server.Exceptions;
public class ProbMethodNotFoundException(string probMethod) : Exception($"Unknown probMethod name {probMethod}") { }
public class SimilarityMethodNotFoundException(string similarityMethod) : Exception($"Unknown similarityMethod name \"{similarityMethod}\"") { }

View File

@@ -2,6 +2,7 @@ using System.Collections.Concurrent;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
using Server.Exceptions;
using Shared.Models; using Shared.Models;
namespace Server.Helper; namespace Server.Helper;
@@ -140,8 +141,8 @@ public static class SearchdomainHelper
{ {
embeddings = Datapoint.GenerateEmbeddings(jsonDatapoint.Text, [.. jsonDatapoint.Model], aIProvider, embeddingCache); embeddings = Datapoint.GenerateEmbeddings(jsonDatapoint.Text, [.. jsonDatapoint.Model], aIProvider, embeddingCache);
} }
var probMethod_embedding = new ProbMethod(jsonDatapoint.Probmethod_embedding, logger) ?? throw new Exception($"Unknown probMethod name {jsonDatapoint.Probmethod_embedding}"); var probMethod_embedding = new ProbMethod(jsonDatapoint.Probmethod_embedding, logger) ?? throw new ProbMethodNotFoundException(jsonDatapoint.Probmethod_embedding);
var similarityMethod = new SimilarityMethod(jsonDatapoint.SimilarityMethod, logger) ?? throw new Exception($"Unknown similarityMethod name {jsonDatapoint.SimilarityMethod}"); var similarityMethod = new SimilarityMethod(jsonDatapoint.SimilarityMethod, logger) ?? throw new SimilarityMethodNotFoundException(jsonDatapoint.SimilarityMethod);
Datapoint datapoint = new(jsonDatapoint.Name, probMethod_embedding, similarityMethod, hash, [.. embeddings.Select(kv => (kv.Key, kv.Value))]); Datapoint datapoint = new(jsonDatapoint.Name, probMethod_embedding, similarityMethod, hash, [.. embeddings.Select(kv => (kv.Key, kv.Value))]);
int id_datapoint = DatabaseHelper.DatabaseInsertDatapoint(helper, jsonDatapoint.Name, jsonDatapoint.Probmethod_embedding, jsonDatapoint.SimilarityMethod, hash, id_entity); // TODO make this a bulk add action to reduce number of queries int id_datapoint = DatabaseHelper.DatabaseInsertDatapoint(helper, jsonDatapoint.Name, jsonDatapoint.Probmethod_embedding, jsonDatapoint.SimilarityMethod, hash, id_entity); // TODO make this a bulk add action to reduce number of queries
List<(string model, byte[] embedding)> data = []; List<(string model, byte[] embedding)> data = [];

View File

@@ -1,5 +1,5 @@
using System.Numerics.Tensors;
using System.Text.Json; using System.Text.Json;
using Server.Exceptions;
namespace Server; namespace Server;
@@ -15,7 +15,7 @@ public class ProbMethod
if (probMethod is null) if (probMethod is null)
{ {
logger.LogError("Unable to retrieve probMethod {name}", [name]); logger.LogError("Unable to retrieve probMethod {name}", [name]);
throw new Exception("Unable to retrieve probMethod"); throw new ProbMethodNotFoundException(name);
} }
method = probMethod; method = probMethod;
} }