public static GenericSearchDocument ToAzureDocument <TFunctionMessage>( this TransactionForFunctionVO <TFunctionMessage> transactionAndFunction, FunctionIndexDefinition <TFunctionMessage> indexDefinition) where TFunctionMessage : FunctionMessage, new() { return(CreateFieldWithValueDictionary(transactionAndFunction, indexDefinition.Fields, (field) => field.GetTransactionForFunctionValue(transactionAndFunction))); }
public void ParameterFieldsCanBeIgnored() { var searchIndex = new FunctionIndexDefinition <DepositDto>(addPresetTransactionFields: false); var dto = new DepositDto(); Assert.Null(searchIndex.Field(nameof(dto.Approver))); }
public async Task <IFunctionIndexer <TFunctionMessage> > CreateFunctionIndexer <TFunctionMessage>(string indexName = null, bool addPresetEventLogFields = true) where TFunctionMessage : FunctionMessage, new() { var searchIndexDefinition = new FunctionIndexDefinition <TFunctionMessage>(indexName, addPresetEventLogFields); return(await CreateFunctionIndexer(searchIndexDefinition)); }
public async Task <IAzureFunctionSearchIndex <TFunctionMessage> > GetOrCreateIndex <TFunctionMessage>( FunctionIndexDefinition <TFunctionMessage> searchIndexDefinition) where TFunctionMessage : FunctionMessage, new() { var azureIndex = await GetOrCreateAzureIndex(searchIndexDefinition); return(new AzureFunctionSearchIndex <TFunctionMessage>(searchIndexDefinition, azureIndex, _client.Indexes.GetClient(azureIndex.Name))); }
public void SupportsExcludingPresetTransactionRelatedFields() { var searchIndex = new FunctionIndexDefinition <EmptyDto>( addPresetTransactionFields: false); Assert.Empty(searchIndex .Fields .Where(f => f.IsPresetSearchField()).ToArray()); }
public void WillAddParametersToSearchData_ButWillNotBeSearchableByDefault() { var searchIndex = new FunctionIndexDefinition <DepositDto>(addPresetTransactionFields: false); var dto = new DepositDto(); var amountField = searchIndex.Field(nameof(dto.Amount)); Assert.Equal(dto.Amount, amountField.GetValue(dto)); Assert.False(amountField.IsSearchable); }
public IIndexer <TransactionForFunctionVO <TFunctionMessage> > CreateIndexerForFunctionMessage <TFunctionMessage>( string indexName, int documentsPerBatch) where TFunctionMessage : FunctionMessage, new() { var indexDefinition = new FunctionIndexDefinition <TFunctionMessage>(indexName); var indexer = new ElasticFunctionIndexer <TFunctionMessage>(indexName, _elasticClient, indexDefinition, documentsPerBatch); _indexers.Add(indexer); return(indexer); }
public void APrimaryKeyFieldCanBeConfigured() { var searchIndex = new FunctionIndexDefinition <DepositDto>(addPresetTransactionFields: false); var dto = new DepositDto(); var idField = searchIndex.Field(nameof(dto.Id)); Assert.True(idField.IsKey); Assert.True(idField.IsSearchable); Assert.Equal(dto.Id, idField.GetValue(dto)); }
public void AllowsSearchCustomisationOfParameterFields() { var searchIndex = new FunctionIndexDefinition <DepositDto>(addPresetTransactionFields: false); var dto = new DepositDto(); var currencyField = searchIndex.Field(nameof(dto.Currency)); Assert.Equal(dto.Currency, currencyField.GetValue(dto)); Assert.True(currencyField.IsFacetable); Assert.True(currencyField.IsFilterable); }
public IIndexer <TransactionForFunctionVO <TFunctionMessage> > CreateIndexerForFunctionMessage <TFunctionMessage>( string indexName, int documentsPerBatch = 1) where TFunctionMessage : FunctionMessage, new() { var indexClient = GetOrCreateIndexClient(indexName); var indexDefinition = new FunctionIndexDefinition <TFunctionMessage>(indexName); var azureIndexer = new AzureFunctionIndexer <TFunctionMessage>(indexClient, indexDefinition, documentsPerBatch); _indexers.Add(azureIndexer); return(azureIndexer); }
public void UserDefinedPrimaryKeysOverridePresets() { var searchIndex = new FunctionIndexDefinition <DepositDto>( addPresetTransactionFields: true); var dto = new DepositDto(); var uidField = searchIndex.Field(PresetSearchFieldName.tx_uid); Assert.False(uidField.IsKey); Assert.Equal(nameof(dto.Id), searchIndex.KeyField().Name); }
public void CanIncludeNonParameterFieldsWithSearchFieldAttribute() { var searchIndex = new FunctionIndexDefinition <DepositDto>(addPresetTransactionFields: false); var dto = new DepositDto { Category = "test" }; var categoryField = searchIndex.Field(nameof(dto.Category)); Assert.True(categoryField.IsFacetable); Assert.True(categoryField.IsFilterable); Assert.Equal(dto.Category, categoryField.GetValue(dto)); }
public static object ToAzureDocument <TFunctionMessage>( this FunctionCall <TFunctionMessage> transactionAndFunction, FunctionIndexDefinition <TFunctionMessage> indexDefinition) where TFunctionMessage : FunctionMessage, new() { var dictionary = new Dictionary <string, object>(); foreach (var field in indexDefinition.Fields) { var azureField = field.ToAzureField(); var val = field.GetValue(transactionAndFunction)?.ToAzureFieldValue(); if (val != null) { dictionary.Add(azureField.Name, val); } } return(dictionary); }
public async Task MapsFunctionDtoToGenericSearchDocument() { var indexDefinition = new FunctionIndexDefinition <TransferFunction>(); var mockSearchIndexClient = new MockElasticClient(); var indexer = new ElasticFunctionIndexer <TransferFunction>("transfer-functions", mockSearchIndexClient.ElasticClient, indexDefinition); TransactionForFunctionVO <TransferFunction> transactionForFunction = IndexerTestData.CreateSampleTransactionForFunction(); await indexer.IndexAsync(transactionForFunction); Assert.Single(mockSearchIndexClient.BulkRequests); var indexedDoc = mockSearchIndexClient.GetFirstBulkOperation().GetBody() as GenericSearchDocument; //check generic mapping Assert.Equal(transactionForFunction.Transaction.BlockNumber.ToString(), indexedDoc[PresetSearchFieldName.tx_block_number.ToString()]); //check function message mapping Assert.Equal(transactionForFunction.FunctionMessage.To, indexedDoc["to"]); Assert.Equal(transactionForFunction.FunctionMessage.Value.ToString(), indexedDoc["value"]); }
public static GenericSearchDocument ToGenericElasticSearchDoc <TFunctionMessage>( this TransactionForFunctionVO <TFunctionMessage> functionCall, FunctionIndexDefinition <TFunctionMessage> indexDefinition) where TFunctionMessage : FunctionMessage, new() { var dictionary = new GenericSearchDocument(); foreach (var field in indexDefinition.Fields) { var val = field.GetTransactionForFunctionValue(functionCall)?.ToElasticSearchFieldValue(); if (val != null) { dictionary.Add(field.Name.ToElasticName(), val); } } var id = indexDefinition.KeyField().GetTransactionForFunctionValue(functionCall); dictionary.SetId(id.ToString()); return(dictionary); }
public async Task MapsFunctionDtoToGenericSearchDocument() { var indexDefinition = new FunctionIndexDefinition <TransferFunction>(); var index = indexDefinition.ToAzureIndex(); var mockSearchIndexClient = new SearchIndexClientMock <GenericSearchDocument>(); var indexer = new AzureFunctionIndexer <TransferFunction>( mockSearchIndexClient.SearchIndexClient, indexDefinition); TransactionForFunctionVO <TransferFunction> transactionForFunction = IndexerTestData.CreateSampleTransactionForFunction(); await indexer.IndexAsync(transactionForFunction); Assert.Single(mockSearchIndexClient.IndexedBatches); var firstIndexAction = mockSearchIndexClient.IndexedBatches[0].Actions.First(); var document = firstIndexAction.Document; //check generic mapping Assert.Equal(transactionForFunction.Transaction.BlockNumber.ToString(), document[PresetSearchFieldName.tx_block_number.ToString()]); //check function message mapping Assert.Equal(transactionForFunction.FunctionMessage.To, document["to"]); Assert.Equal(transactionForFunction.FunctionMessage.Value.ToString(), document["value"]); }
public async Task <IFunctionIndexer <TFunctionMessage> > CreateFunctionIndexer <TFunctionMessage>(FunctionIndexDefinition <TFunctionMessage> searchIndexDefinition) where TFunctionMessage : FunctionMessage, new() { await CreateIfNotExists(searchIndexDefinition); var indexer = new ElasticFunctionIndexer <TFunctionMessage>(_elasticClient, searchIndexDefinition); return(indexer); }
public AzureFunctionSearchIndex(FunctionIndexDefinition <TFunctionMessage> searchIndexDefinition, Index index, ISearchIndexClient indexClient) : base(index, indexClient) { _searchIndexDefinition = searchIndexDefinition; }
public void AddsPresetTransactionRelatedFields() { var searchIndex = new FunctionIndexDefinition <EmptyDto>( addPresetTransactionFields: true); var dto = new EmptyDto(); var presetFields = searchIndex .Fields .Where(f => f.IsPresetSearchField()).ToArray(); Assert.Equal(13, presetFields.Length); var transactionWithReceipt = CreateDummyTransaction(); var tx = transactionWithReceipt.Transaction; searchIndex .Assertions(dto, transactionWithReceipt) .HasField(PresetSearchFieldName.tx_uid, f => f.IsString() .HasFlags(isKey: true, isSortable: true, isSearchable: true) .ReturnsValue("1_1")) .HasField(PresetSearchFieldName.tx_hash, f => f.IsString() .HasFlags(isSortable: true, isSearchable: true, isFilterable: true) .ReturnsValue(tx.TransactionHash)) .HasField(PresetSearchFieldName.tx_index, f => f.IsHexBigInteger() .HasFlags(isSortable: true) .ReturnsValue(tx.TransactionIndex)) .HasField(PresetSearchFieldName.tx_block_hash, f => f.IsString() .HasFlags() .ReturnsValue(tx.BlockHash)) .HasField(PresetSearchFieldName.tx_block_number, f => f.IsHexBigInteger() .HasFlags(isSortable: true, isSearchable: true, isFilterable: true, isFacetable: true) .ReturnsValue(tx.BlockNumber)) .HasField(PresetSearchFieldName.tx_block_timestamp, f => f.IsHexBigInteger() .HasFlags(isSortable: true) .ReturnsValue(transactionWithReceipt.BlockTimestamp)) .HasField(PresetSearchFieldName.tx_value, f => f.IsHexBigInteger() .HasFlags(isSortable: true) .ReturnsValue(tx.Value)) .HasField(PresetSearchFieldName.tx_from, f => f.IsString() .HasFlags(isSortable: true, isSearchable: true, isFilterable: true, isFacetable: true) .ReturnsValue(tx.From)) .HasField(PresetSearchFieldName.tx_to, f => f.IsString() .HasFlags(isSortable: true, isSearchable: true, isFilterable: true, isFacetable: true) .ReturnsValue(tx.To)) .HasField(PresetSearchFieldName.tx_gas, f => f.IsHexBigInteger() .HasFlags(isSortable: true) .ReturnsValue(tx.Gas)) .HasField(PresetSearchFieldName.tx_gas_price, f => f.IsHexBigInteger() .HasFlags(isSortable: true) .ReturnsValue(tx.GasPrice)) .HasField(PresetSearchFieldName.tx_input, f => f.IsString() .HasFlags() .ReturnsValue(tx.Input)) .HasField(PresetSearchFieldName.tx_nonce, f => f.IsHexBigInteger() .HasFlags(isSortable: true, isSearchable: true, isFilterable: true) .ReturnsValue(tx.Nonce)); }
public void DefinesExpectedName() { var searchIndex = new FunctionIndexDefinition <DepositDto>(addPresetTransactionFields: false); Assert.Equal("Deposit", searchIndex.IndexName); }