protected Query GetLuceneQuery(DocumentsOperationContext context, QueryMetadata metadata, BlittableJsonReaderObject parameters, Analyzer analyzer, QueryBuilderFactories factories) { return(GetLuceneQuery(context, metadata, metadata.Query.Where, parameters, analyzer, factories)); }
protected Query GetLuceneQuery(DocumentsOperationContext context, QueryMetadata metadata, QueryExpression whereExpression, BlittableJsonReaderObject parameters, Analyzer analyzer, QueryBuilderFactories factories) { Query documentQuery; if (string.IsNullOrEmpty(metadata.QueryText)) { if (_logger.IsInfoEnabled) { _logger.Info($"Issuing query on index {_indexName} for all documents"); } documentQuery = new MatchAllDocsQuery(); } else { if (_logger.IsInfoEnabled) { _logger.Info($"Issuing query on index {_indexName} for: {metadata.Query}"); } // RavenPerFieldAnalyzerWrapper searchAnalyzer = null; try { //_persistance._a //searchAnalyzer = parent.CreateAnalyzer(new LowerCaseKeywordAnalyzer(), toDispose, true); //searchAnalyzer = parent.AnalyzerGenerators.Aggregate(searchAnalyzer, (currentAnalyzer, generator) => //{ // Analyzer newAnalyzer = generator.GenerateAnalyzerForQuerying(parent.PublicName, query.Query, currentAnalyzer); // if (newAnalyzer != currentAnalyzer) // { // DisposeAnalyzerAndFriends(toDispose, currentAnalyzer); // } // return parent.CreateAnalyzer(newAnalyzer, toDispose, true); //}); IDisposable releaseServerContext = null; IDisposable closeServerTransaction = null; TransactionOperationContext serverContext = null; try { if (metadata.HasCmpXchg) { releaseServerContext = context.DocumentDatabase.ServerStore.ContextPool.AllocateOperationContext(out serverContext); closeServerTransaction = serverContext.OpenReadTransaction(); } using (closeServerTransaction) documentQuery = QueryBuilder.BuildQuery(serverContext, context, metadata, whereExpression, _index.Definition, parameters, analyzer, factories); } finally { releaseServerContext?.Dispose(); } } finally { //DisposeAnalyzerAndFriends(toDispose, searchAnalyzer); } } //var afterTriggers = ApplyIndexTriggers(documentQuery); return(documentQuery); }
protected Query GetLuceneQuery(QueryMetadata metadata, BlittableJsonReaderObject parameters, Analyzer analyzer, QueryBuilderFactories factories) { return(GetLuceneQuery(metadata, metadata.Query.Where, parameters, analyzer, factories)); }
private unsafe void FillCountOfResultsAndIndexEtag(QueryResultServerSide<Document> resultToFill, QueryMetadata query, DocumentsOperationContext context) { var bufferSize = query.HasCounters ? 4 : 3; var collection = query.CollectionName; var buffer = stackalloc long[bufferSize]; // If the query has include or load, it's too difficult to check the etags for just the included collections, // it's easier to just show etag for all docs instead. if (collection == Constants.Documents.Collections.AllDocumentsCollection || query.HasIncludeOrLoad) { var numberOfDocuments = Database.DocumentsStorage.GetNumberOfDocuments(context); buffer[0] = DocumentsStorage.ReadLastDocumentEtag(context.Transaction.InnerTransaction); buffer[1] = DocumentsStorage.ReadLastTombstoneEtag(context.Transaction.InnerTransaction); buffer[2] = numberOfDocuments; if (query.HasCounters) buffer[3] = DocumentsStorage.ReadLastCountersEtag(context.Transaction.InnerTransaction); resultToFill.TotalResults = (int)numberOfDocuments; } else { var collectionStats = Database.DocumentsStorage.GetCollection(collection, context); buffer[0] = Database.DocumentsStorage.GetLastDocumentEtag(context, collection); buffer[1] = Database.DocumentsStorage.GetLastTombstoneEtag(context, collection); buffer[2] = collectionStats.Count; if (query.HasCounters) buffer[3] = Database.DocumentsStorage.CountersStorage.GetLastCounterEtag(context, collection); resultToFill.TotalResults = (int)collectionStats.Count; } resultToFill.ResultEtag = (long)Hashing.XXHash64.Calculate((byte*)buffer, sizeof(long) * (uint)bufferSize); resultToFill.NodeTag = Database.ServerStore.NodeTag; }
private unsafe void FillCountOfResultsAndIndexEtag(QueryResultServerSide <Document> resultToFill, QueryMetadata query, QueryOperationContext context) { var bufferSize = 3; var hasCounters = query.HasCounterSelect || query.CounterIncludes != null; var hasTimeSeries = query.HasTimeSeriesSelect || query.TimeSeriesIncludes != null; var hasCmpXchg = query.HasCmpXchg || query.HasCmpXchgSelect || query.HasCmpXchgIncludes; if (hasCounters) { bufferSize++; } if (hasTimeSeries) { bufferSize++; } if (hasCmpXchg) { bufferSize++; } var collection = query.CollectionName; var buffer = stackalloc long[bufferSize]; // If the query has include or load, it's too difficult to check the etags for just the included collections, // it's easier to just show etag for all docs instead. if (collection == Constants.Documents.Collections.AllDocumentsCollection || query.HasIncludeOrLoad) { var numberOfDocuments = Database.DocumentsStorage.GetNumberOfDocuments(context.Documents); buffer[0] = DocumentsStorage.ReadLastDocumentEtag(context.Documents.Transaction.InnerTransaction); buffer[1] = DocumentsStorage.ReadLastTombstoneEtag(context.Documents.Transaction.InnerTransaction); buffer[2] = numberOfDocuments; if (hasCounters) { buffer[3] = DocumentsStorage.ReadLastCountersEtag(context.Documents.Transaction.InnerTransaction); } if (hasTimeSeries) { buffer[hasCounters ? 4 : 3] = DocumentsStorage.ReadLastTimeSeriesEtag(context.Documents.Transaction.InnerTransaction); } resultToFill.TotalResults = (int)numberOfDocuments; resultToFill.LongTotalResults = numberOfDocuments; } else { var collectionStats = Database.DocumentsStorage.GetCollection(collection, context.Documents); buffer[0] = Database.DocumentsStorage.GetLastDocumentEtag(context.Documents.Transaction.InnerTransaction, collection); buffer[1] = Database.DocumentsStorage.GetLastTombstoneEtag(context.Documents.Transaction.InnerTransaction, collection); buffer[2] = collectionStats.Count; if (hasCounters) { buffer[3] = Database.DocumentsStorage.CountersStorage.GetLastCounterEtag(context.Documents, collection); } if (hasTimeSeries) { buffer[hasCounters ? 4 : 3] = Database.DocumentsStorage.TimeSeriesStorage.GetLastTimeSeriesEtag(context.Documents, collection); } resultToFill.TotalResults = (int)collectionStats.Count; resultToFill.LongTotalResults = collectionStats.Count; } if (hasCmpXchg) { buffer[bufferSize - 1] = Database.ServerStore.Cluster.GetLastCompareExchangeIndexForDatabase(context.Server, Database.Name); } resultToFill.ResultEtag = (long)Hashing.XXHash64.Calculate((byte *)buffer, sizeof(long) * (uint)bufferSize); resultToFill.NodeTag = Database.ServerStore.NodeTag; }
protected override long CalculateIndexEtag(QueryOperationContext queryContext, TransactionOperationContext indexContext, QueryMetadata query, bool isStale) { if (_handleReferences == null && _handleCompareExchangeReferences == null) { return(base.CalculateIndexEtag(queryContext, indexContext, query, isStale)); } return(CalculateIndexEtagWithReferences( _handleReferences, _handleCompareExchangeReferences, queryContext, indexContext, query, isStale, _referencedCollections, _compiled)); }
internal QueryContext(string queryText, object parameters, QueryMetadata metadata) { QueryText = queryText; Parameters = parameters; Metadata = metadata; }