using CD67.ModeleMVC.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace CD67.ModeleMVC.Solr
{
public class IndexeurSolr
{
public static string SolrUrl = "http://t-lunr4:8080/solr/modele-mvc";
///
/// Ajoute le viking à l'index solr
///
/// Un objet Viking
/// Un GUID utilisé pour identifier la version des données indéxées
/// Si autocommit est vrai, les modifications apportées à l'index seront commitées automatiquement
public static void addViking(Viking viking, string version = "", bool autocommit = true)
{
// Si aucun GUID version n'a été donné en paramètre, en génère un pour cet ajout.
if (String.IsNullOrEmpty(version))
{
version = Guid.NewGuid().ToString();
}
// Génère le document XML qui servira à transmettre les données à SolR
XmlDocument toSolr = new XmlDocument();
toSolr.AppendChild(toSolr.CreateElement("add"));
XmlNode node = toSolr.CreateElement("doc");
// Ajoute les noeuds au document XML.
// >> Cette partie est à modifier selon le type d'objet indéxé (ici: Viking)
// Id unique Solr
addFieldToNode(ref node, "id", viking.Id.ToString());
// Version de la donnée
addFieldToNode(ref node, "version", version);
// Donnees
addFieldToNode(ref node, "nom", viking.Nom);
addFieldToNode(ref node, "description", viking.Description);
// Facettes
addFieldToNode(ref node, "type_libelle", viking.TypeViking.Libelle);
addFieldToNode(ref node, "casque_cornu", (viking.CasqueCornu ? "Oui" : "Non"));
addFieldToNode(ref node, "nb_victoires", (viking.NombreVictoires == null) ? "0" : viking.NombreVictoires.ToString());
addFieldToNode(ref node, "annee_creation", viking.DateCreation.Year.ToString());
// Tri
addFieldToNode(ref node, "date_edition", String.Format("{0:yyyyMMddhhmmss}", viking.DateEdition));
// contruit le champ recherche par concaténation
List recherche_strings = new List() { viking.Nom, viking.TypeViking.Libelle, viking.Description };
string recherche = String.Join(" ", recherche_strings);
addFieldToNode(ref node, "recherche", recherche.ToLower());
// Met à jour le document XML
toSolr.DocumentElement.AppendChild(node);
// Envoie la requete de mise à jour au serveur
SolrTools.SolrEngine.SolrUpdate(SolrUrl, toSolr.OuterXml);
// Commit les modifications si besoin
if (autocommit)
{
commit();
}
}
///
/// Commit les ajouts / suppressions
///
///
public static void commit()
{
SolrTools.SolrEngine.SolrUpdate(SolrUrl, "");
}
///
/// Optimize les indexes
/// (à lancer en fin de traitement)
///
///
public static void optimize()
{
SolrTools.SolrEngine.SolrUpdate(SolrUrl, "");
}
///
/// Supprime l'item de l'index
///
///
public static void delete(string id)
{
SolrTools.SolrEngine.SolrUpdate(SolrUrl, "id:" + id + "");
}
///
/// Ajoute un noeud 'champ solr: valeur' au noeud en cours du document XML
///
///
///
///
///
private static void addFieldToNode(ref XmlNode doc, string name, string value, updateAttributeValues updateAttribute = updateAttributeValues.none)
{
XmlNode node = doc.AppendChild(doc.OwnerDocument.CreateElement("field")); // description d'un champs
node.Attributes.Append(doc.OwnerDocument.CreateAttribute("name")).Value = name;
if (updateAttribute != updateAttributeValues.none) node.Attributes.Append(doc.OwnerDocument.CreateAttribute("update")).Value = updateAttribute.ToString();
node.InnerText = value;
}
enum updateAttributeValues
{
none,
set,
add
}
///
/// Send a query string to Solr
///
///
///
public static XmlNode request(string query)
{
return SolrTools.SolrEngine.SolrRequest(SolrUrl, query);
}
}
}