private void GetIndexQueryRessult(IHttpContext context, string index) { Guid indexEtag; QueryResult queryResult = ExecuteQuery(context, index, out indexEtag); if (queryResult == null) { return; } var includes = context.Request.QueryString.GetValues("include") ?? new string[0]; var loadedIds = new HashSet <string>( queryResult.Results .Where(x => x["@metadata"] != null) .Select(x => x["@metadata"].Value <string>("@id")) .Where(x => x != null) ); var command = new AddIncludesCommand(Database, GetRequestTransaction(context), (etag, doc) => queryResult.Includes.Add(doc), includes, loadedIds); foreach (var result in queryResult.Results) { command.Execute(result); } context.Response.AddHeader("ETag", indexEtag.ToString()); context.WriteJson(queryResult); }
private void GetIndexQueryResult(IHttpContext context, string index) { Etag indexEtag; var queryResult = ExecuteQuery(context, index, out indexEtag); if (queryResult == null) { return; } var includes = context.Request.QueryString.GetValues("include") ?? new string[0]; var loadedIds = new HashSet <string>( queryResult.Results .Where(x => x["@metadata"] != null) .Select(x => x["@metadata"].Value <string>("@id")) .Where(x => x != null) ); var command = new AddIncludesCommand(Database, GetRequestTransaction(context), (etag, doc) => queryResult.Includes.Add(doc), includes, loadedIds); foreach (var result in queryResult.Results) { command.Execute(result); } command.AlsoInclude(queryResult.IdsToInclude); context.WriteETag(indexEtag); if (queryResult.NonAuthoritativeInformation) { context.SetStatusToNonAuthoritativeInformation(); } context.WriteJson(queryResult); }
public override void Respond(IHttpContext context) { JArray itemsToLoad; if (context.Request.HttpMethod == "POST") { itemsToLoad = context.ReadJsonArray(); } else { itemsToLoad = new JArray(context.Request.QueryString.GetValues("id")); } var result = new MultiLoadResult(); var loadedIds = new HashSet <string>(); var includes = context.Request.QueryString.GetValues("include") ?? new string[0]; var transactionInformation = GetRequestTransaction(context); var includedEtags = new List <byte>(); Database.TransactionalStorage.Batch(actions => { var addIncludesCommand = new AddIncludesCommand(Database, transactionInformation, (etag, includedDoc) => { includedEtags.AddRange(etag.ToByteArray()); result.Includes.Add(includedDoc); }, includes, loadedIds); foreach (JToken item in itemsToLoad) { var value = item.Value <string>(); if (loadedIds.Add(value) == false) { continue; } var documentByKey = Database.Get(value, transactionInformation); if (documentByKey == null) { continue; } result.Results.Add(documentByKey.ToJson()); includedEtags.AddRange(documentByKey.Etag.ToByteArray()); addIncludesCommand.Execute(documentByKey.DataAsJson); } }); Guid computedEtag; using (var md5 = MD5.Create()) { var computeHash = md5.ComputeHash(includedEtags.ToArray()); computedEtag = new Guid(computeHash); } if (context.MatchEtag(computedEtag)) { context.SetStatusToNotModified(); return; } context.Response.AddHeader("ETag", computedEtag.ToString()); context.WriteJson(result); }
public override void Respond(IHttpContext context) { RavenJArray itemsToLoad; if (context.Request.HttpMethod == "POST") { itemsToLoad = context.ReadJsonArray(); } else { itemsToLoad = new RavenJArray(context.Request.QueryString.GetValues("id")); } var result = new MultiLoadResult(); var loadedIds = new HashSet <string>(); var includes = context.Request.QueryString.GetValues("include") ?? new string[0]; var transformer = context.Request.QueryString["transformer"] ?? context.Request.QueryString["resultTransformer"]; var queryInputs = context.ExtractQueryInputs(); var transactionInformation = GetRequestTransaction(context); var includedEtags = new List <byte>(); Database.TransactionalStorage.Batch(actions => { foreach (RavenJToken item in itemsToLoad) { var value = item.Value <string>(); if (loadedIds.Add(value) == false) { continue; } JsonDocument documentByKey = string.IsNullOrEmpty(transformer) ? Database.Get(value, transactionInformation) : Database.GetWithTransformer(value, transformer, transactionInformation, queryInputs); if (documentByKey == null) { continue; } result.Results.Add(documentByKey.ToJson()); if (documentByKey.Etag != null) { includedEtags.AddRange(documentByKey.Etag.ToByteArray()); } includedEtags.Add((documentByKey.NonAuthoritativeInformation ?? false) ? (byte)0 : (byte)1); } var addIncludesCommand = new AddIncludesCommand(Database, transactionInformation, (etag, includedDoc) => { includedEtags.AddRange(etag.ToByteArray()); result.Includes.Add(includedDoc); }, includes, loadedIds); foreach (var item in result.Results.Where(item => item != null)) { addIncludesCommand.Execute(item); } }); Etag computedEtag; using (var md5 = MD5.Create()) { var computeHash = md5.ComputeHash(includedEtags.ToArray()); computedEtag = Etag.Parse(computeHash); } if (context.MatchEtag(computedEtag)) { context.SetStatusToNotModified(); return; } context.WriteETag(computedEtag); context.WriteJson(result); }
public MoreLikeThisQueryResult ExecuteMoreLikeThisQuery(MoreLikeThisQuery query, TransactionInformation transactionInformation, int pageSize = 25, string[] include = null) { if (query == null) throw new ArgumentNullException("query"); var index = database.IndexStorage.GetIndexInstance(query.IndexName); if (index == null) throw new InvalidOperationException("The index " + query.IndexName + " cannot be found"); if (string.IsNullOrEmpty(query.DocumentId) && query.MapGroupFields.Count == 0) throw new InvalidOperationException("The document id or map group fields are mandatory"); IndexSearcher searcher; using (database.IndexStorage.GetCurrentIndexSearcher(query.IndexName, out searcher)) { var documentQuery = new BooleanQuery(); if (string.IsNullOrEmpty(query.DocumentId) == false) { documentQuery.Add(new TermQuery(new Term(Constants.DocumentIdFieldName, query.DocumentId.ToLowerInvariant())), Occur.MUST); } foreach (string key in query.MapGroupFields.Keys) { documentQuery.Add(new TermQuery(new Term(key, query.MapGroupFields[key])), Occur.MUST); } var td = searcher.Search(documentQuery, 1); // get the current Lucene docid for the given RavenDB doc ID if (td.ScoreDocs.Length == 0) throw new InvalidOperationException("Document " + query.DocumentId + " could not be found"); var ir = searcher.IndexReader; var mlt = new RavenMoreLikeThis(ir); AssignParameters(mlt, query); if (string.IsNullOrWhiteSpace(query.StopWordsDocumentId) == false) { var stopWordsDoc = database.Get(query.StopWordsDocumentId, null); if (stopWordsDoc == null) throw new InvalidOperationException("Stop words document " + query.StopWordsDocumentId + " could not be found"); var stopWordsSetup = stopWordsDoc.DataAsJson.JsonDeserialization<StopWordsSetup>(); if (stopWordsSetup.StopWords != null) { var stopWords = stopWordsSetup.StopWords; var ht = new Hashtable(StringComparer.InvariantCultureIgnoreCase); foreach (var stopWord in stopWords) { ht[stopWord] = stopWord; } mlt.SetStopWords(ht); } } var fieldNames = query.Fields ?? GetFieldNames(ir); mlt.SetFieldNames(fieldNames); var toDispose = new List<Action>(); PerFieldAnalyzerWrapper perFieldAnalyzerWrapper = null; try { perFieldAnalyzerWrapper = index.CreateAnalyzer(new LowerCaseKeywordAnalyzer(), toDispose, true); mlt.SetAnalyzer(perFieldAnalyzerWrapper); var mltQuery = mlt.Like(td.ScoreDocs[0].Doc); var tsdc = TopScoreDocCollector.Create(pageSize, true); searcher.Search(mltQuery, tsdc); var hits = tsdc.TopDocs().ScoreDocs; var jsonDocuments = GetJsonDocuments(query, searcher, index, query.IndexName, hits, td.ScoreDocs[0].Doc); var result = new MultiLoadResult(); var includedEtags = new List<byte>(jsonDocuments.SelectMany(x => x.Etag.Value.ToByteArray())); includedEtags.AddRange(database.GetIndexEtag(query.IndexName, null).ToByteArray()); var loadedIds = new HashSet<string>(jsonDocuments.Select(x => x.Key)); var addIncludesCommand = new AddIncludesCommand(database, transactionInformation, (etag, includedDoc) => { includedEtags.AddRange(etag.ToByteArray()); result.Includes.Add(includedDoc); }, include ?? new string[0], loadedIds); foreach (var jsonDocumet in jsonDocuments) { result.Results.Add(jsonDocumet.ToJson()); addIncludesCommand.Execute(jsonDocumet.DataAsJson); } Guid computedEtag; using (var md5 = MD5.Create()) { var computeHash = md5.ComputeHash(includedEtags.ToArray()); computedEtag = new Guid(computeHash); } return new MoreLikeThisQueryResult { Etag = computedEtag, Result = result, }; } finally { if (perFieldAnalyzerWrapper != null) perFieldAnalyzerWrapper.Close(); foreach (var action in toDispose) { action(); } } } }
public override void Respond(IHttpContext context) { RavenJArray itemsToLoad; if(context.Request.HttpMethod == "POST") itemsToLoad = context.ReadJsonArray(); else itemsToLoad = new RavenJArray(context.Request.QueryString.GetValues("id")); var result = new MultiLoadResult(); var loadedIds = new HashSet<string>(); var includes = context.Request.QueryString.GetValues("include") ?? new string[0]; var transformer = context.Request.QueryString["transformer"] ?? context.Request.QueryString["resultTransformer"]; var queryInputs = context.ExtractQueryInputs(); var transactionInformation = GetRequestTransaction(context); var includedEtags = new List<byte>(); Database.TransactionalStorage.Batch(actions => { foreach (RavenJToken item in itemsToLoad) { var value = item.Value<string>(); if(loadedIds.Add(value)==false) continue; JsonDocument documentByKey = string.IsNullOrEmpty(transformer) ? Database.Get(value, transactionInformation) : Database.GetWithTransformer(value, transformer, transactionInformation, queryInputs); if (documentByKey == null) continue; result.Results.Add(documentByKey.ToJson()); if (documentByKey.Etag != null) { includedEtags.AddRange(documentByKey.Etag.ToByteArray()); } includedEtags.Add((documentByKey.NonAuthoritativeInformation ?? false) ? (byte)0 : (byte)1); } var addIncludesCommand = new AddIncludesCommand(Database, transactionInformation, (etag, includedDoc) => { includedEtags.AddRange(etag.ToByteArray()); result.Includes.Add(includedDoc); }, includes, loadedIds); foreach (var item in result.Results.Where(item => item != null)) { addIncludesCommand.Execute(item); } }); Etag computedEtag; using (var md5 = MD5.Create()) { var computeHash = md5.ComputeHash(includedEtags.ToArray()); computedEtag = Etag.Parse(computeHash); } if (context.MatchEtag(computedEtag)) { context.SetStatusToNotModified(); return; } context.WriteETag(computedEtag); context.WriteJson(result); }
private void PerformSearch(IHttpContext context, string indexName, Index index, MoreLikeThisQueryParameters parameters) { IndexSearcher searcher; using (Database.IndexStorage.GetCurrentIndexSearcher(indexName, out searcher)) { var documentQuery = new BooleanQuery(); if (!string.IsNullOrEmpty(parameters.DocumentId)) { documentQuery.Add(new TermQuery(new Term(Constants.DocumentIdFieldName, parameters.DocumentId)), Lucene.Net.Search.BooleanClause.Occur.MUST); } foreach (string key in parameters.MapGroupFields.Keys) { documentQuery.Add(new TermQuery(new Term(key, parameters.MapGroupFields[key])), Lucene.Net.Search.BooleanClause.Occur.MUST); } var td = searcher.Search(documentQuery, 1); // get the current Lucene docid for the given RavenDB doc ID if (td.ScoreDocs.Length == 0) { context.SetStatusToNotFound(); context.WriteJson(new {Error = "Document " + parameters.DocumentId + " could not be found"}); return; } var ir = searcher.GetIndexReader(); var mlt = new RavenMoreLikeThis(ir); AssignParameters(mlt, parameters); if (!string.IsNullOrWhiteSpace(parameters.StopWordsDocumentId)) { var stopWordsDoc = Database.Get(parameters.StopWordsDocumentId, null); if (stopWordsDoc == null) { context.SetStatusToNotFound(); context.WriteJson( new { Error = "Stop words document " + parameters.StopWordsDocumentId + " could not be found" }); return; } var stopWords = stopWordsDoc.DataAsJson.JsonDeserialization<StopWordsSetup>().StopWords; mlt.SetStopWords(new Hashtable(stopWords.ToDictionary(x => x.ToLower()))); } var fieldNames = parameters.Fields ?? GetFieldNames(ir); mlt.SetFieldNames(fieldNames); var toDispose = new List<Action>(); PerFieldAnalyzerWrapper perFieldAnalyzerWrapper = null; try { perFieldAnalyzerWrapper = index.CreateAnalyzer(new LowerCaseKeywordAnalyzer(), toDispose, true); mlt.SetAnalyzer(perFieldAnalyzerWrapper); var mltQuery = mlt.Like(td.ScoreDocs[0].doc); var tsdc = TopScoreDocCollector.create(context.GetPageSize(Database.Configuration.MaxPageSize), true); searcher.Search(mltQuery, tsdc); var hits = tsdc.TopDocs().ScoreDocs; var jsonDocuments = GetJsonDocuments(parameters, searcher, indexName, hits, td.ScoreDocs[0].doc); var result = new MultiLoadResult(); var includedEtags = new List<byte>(jsonDocuments.SelectMany(x => x.Etag.Value.ToByteArray())); includedEtags.AddRange(Database.GetIndexEtag(indexName, null).ToByteArray()); var loadedIds = new HashSet<string>(jsonDocuments.Select(x => x.Key)); var addIncludesCommand = new AddIncludesCommand(Database, GetRequestTransaction(context), (etag, includedDoc) => { includedEtags.AddRange(etag.ToByteArray()); result.Includes.Add(includedDoc); }, context.Request.QueryString.GetValues("include") ?? new string[0], loadedIds); foreach (var jsonDocumet in jsonDocuments) { result.Results.Add(jsonDocumet.ToJson()); addIncludesCommand.Execute(jsonDocumet.DataAsJson); } Guid computedEtag; using (var md5 = MD5.Create()) { var computeHash = md5.ComputeHash(includedEtags.ToArray()); computedEtag = new Guid(computeHash); } if (context.MatchEtag(computedEtag)) { context.SetStatusToNotModified(); return; } context.Response.AddHeader("ETag", computedEtag.ToString()); context.WriteJson(result); } finally { if (perFieldAnalyzerWrapper != null) perFieldAnalyzerWrapper.Close(); foreach (var action in toDispose) { action(); } } } }
private void PerformSearch(IHttpContext context, string indexName, IndexDefinition indexDefinition, MoreLikeThisQueryParameters parameters) { IndexSearcher searcher; using (Database.IndexStorage.GetCurrentIndexSearcher(indexName, out searcher)) { var td = searcher.Search(new TermQuery(new Term(Constants.DocumentIdFieldName, parameters.DocumentId)), 1); // get the current Lucene docid for the given RavenDB doc ID if (td.ScoreDocs.Length == 0) { context.SetStatusToNotFound(); context.WriteJson(new { Error = "Document " + parameters.DocumentId + " could not be found" }); return; } var ir = searcher.GetIndexReader(); var mlt = new RavenMoreLikeThis(ir); AssignParameters(mlt, parameters); if (!string.IsNullOrWhiteSpace(parameters.StopWordsDocumentId)) { var stopWordsDoc = Database.Get(parameters.StopWordsDocumentId, null); if (stopWordsDoc == null) { context.SetStatusToNotFound(); context.WriteJson( new { Error = "Stop words document " + parameters.StopWordsDocumentId + " could not be found" }); return; } var stopWords = stopWordsDoc.DataAsJson.JsonDeserialization<StopWordsSetup>().StopWords; mlt.SetStopWords(new Hashtable(stopWords.ToDictionary(x => x.ToLower()))); } var fieldNames = parameters.Fields ?? GetFieldNames(ir); mlt.SetFieldNames(fieldNames); mlt.Analyzers = GetAnalyzers(indexDefinition, fieldNames); var mltQuery = mlt.Like(td.ScoreDocs[0].doc); var tsdc = TopScoreDocCollector.create(context.GetPageSize(Database.Configuration.MaxPageSize), true); searcher.Search(mltQuery, tsdc); var hits = tsdc.TopDocs().ScoreDocs; var documentIds = hits.Select(hit => searcher.Doc(hit.doc).Get(Constants.DocumentIdFieldName)).Distinct(); var jsonDocuments = documentIds .Where(docId => string.Equals(docId, parameters.DocumentId, StringComparison.InvariantCultureIgnoreCase) == false) .Select(docId => Database.Get(docId, null)) .Where(it => it != null) .ToArray(); var result = new MultiLoadResult(); var includedEtags = new List<byte>(jsonDocuments.SelectMany(x => x.Etag.Value.ToByteArray())); includedEtags.AddRange(Database.GetIndexEtag(indexName).ToByteArray()); var loadedIds = new HashSet<string>(jsonDocuments.Select(x => x.Key)); var addIncludesCommand = new AddIncludesCommand(Database, GetRequestTransaction(context), (etag, includedDoc) => { includedEtags.AddRange(etag.ToByteArray()); result.Includes.Add(includedDoc); }, context.Request.QueryString.GetValues("include") ?? new string[0], loadedIds); foreach (var jsonDocumet in jsonDocuments) { result.Results.Add(jsonDocumet.ToJson()); addIncludesCommand.Execute(jsonDocumet.DataAsJson); } Guid computedEtag; using (var md5 = MD5.Create()) { var computeHash = md5.ComputeHash(includedEtags.ToArray()); computedEtag = new Guid(computeHash); } if (context.MatchEtag(computedEtag)) { context.SetStatusToNotModified(); return; } context.Response.AddHeader("ETag", computedEtag.ToString()); context.WriteJson(result); } }
private void GetIndexQueryRessult(IHttpContext context, string index) { Guid indexEtag; QueryResult queryResult = ExecuteQuery(context, index, out indexEtag); if (queryResult == null) return; var includes = context.Request.QueryString.GetValues("include") ?? new string[0]; var loadedIds = new HashSet<string>( queryResult.Results .Where(x => x["@metadata"] != null) .Select(x => x["@metadata"].Value<string>("@id")) .Where(x => x != null) ); var command = new AddIncludesCommand(Database, GetRequestTransaction(context), (etag, doc) => queryResult.Includes.Add(doc), includes, loadedIds); foreach (var result in queryResult.Results) { command.Execute(result); } context.Response.AddHeader("ETag", indexEtag.ToString()); if(queryResult.NonAuthoritativeInformation) context.SetStatusToNonAuthoritativeInformation(); context.WriteJson(queryResult); }