| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| // ReSharper disable UnusedAutoPropertyAccessor.Local |
| namespace Apache.Ignite.Core.Tests.Cache |
| { |
| using System.Collections.Generic; |
| using System.Diagnostics.CodeAnalysis; |
| using System.Linq; |
| using Apache.Ignite.Core.Cache; |
| using Apache.Ignite.Core.Cache.Configuration; |
| using Apache.Ignite.Core.Cache.Query; |
| using Apache.Ignite.Core.Common; |
| using Apache.Ignite.Linq; |
| using NUnit.Framework; |
| |
| /// <summary> |
| /// Tests query metrics propagation. |
| /// </summary> |
| public class CacheQueryMetricsTest |
| { |
| /// <summary> |
| /// Fixture set up. |
| /// </summary> |
| [TestFixtureSetUp] |
| public void FixtureSetUp() |
| { |
| Ignition.Start(TestUtils.GetTestConfiguration()); |
| } |
| |
| /// <summary> |
| /// Fixture tear down. |
| /// </summary> |
| [TestFixtureTearDown] |
| public void FixtureTearDown() |
| { |
| Ignition.StopAll(true); |
| } |
| |
| /// <summary> |
| /// Tests query metrics. |
| /// </summary> |
| [Test] |
| public void TestQueryMetrics() |
| { |
| var cache = GetCache(); |
| |
| cache.ResetQueryMetrics(); |
| |
| ExecuteTwoQueries(cache); |
| |
| CheckMetrics(cache.GetQueryMetrics()); |
| } |
| |
| /// <summary> |
| /// Tests failed queries count. |
| /// </summary> |
| [Test] |
| public void TestQueryFails() |
| { |
| var cache = GetCache(); |
| |
| Assert.Throws<IgniteException>(() => cache.Query(new SqlFieldsQuery("select * from NOT_A_TABLE"))); |
| |
| Assert.AreEqual(1, cache.GetQueryMetrics().Fails, "Check Fails count."); |
| } |
| |
| /// <summary> |
| /// Tests query metrics reset. |
| /// </summary> |
| [Test] |
| public void TestQueryMetricsReset() |
| { |
| var cache = GetCache(); |
| |
| ExecuteTwoQueries(cache); |
| |
| cache.ResetQueryMetrics(); |
| |
| IQueryMetrics metrics = cache.GetQueryMetrics(); |
| |
| Assert.AreEqual(0, metrics.Executions, "Check Executions count."); |
| Assert.AreEqual(0, metrics.Fails, "Check Fails count."); |
| Assert.AreEqual(0, metrics.MinimumTime, "Check MinimumTime."); |
| Assert.AreEqual(0, metrics.MaximumTime, "Check MaximumTime."); |
| Assert.AreEqual(0, metrics.AverageTime, 0.1, "Check AverageTime."); |
| |
| ExecuteTwoQueries(cache); |
| |
| CheckMetrics(cache.GetQueryMetrics()); |
| } |
| |
| /// <summary> |
| /// Get Cache instance. |
| /// </summary> |
| /// <returns>Cache instance.</returns> |
| private ICache<int, Person> GetCache() |
| { |
| var ignite = Ignition.GetIgnite(); |
| |
| var cache = ignite.GetOrCreateCache<int, Person>(GetCacheConfiguration()); |
| |
| if (cache.GetSize() == 0) |
| { |
| Person person = new Person() |
| { |
| Name = "Adam", |
| Age = 35000 |
| }; |
| |
| cache.Put(1, person); |
| } |
| |
| return cache; |
| } |
| |
| /// <summary> |
| /// Check cache configuration. |
| /// </summary> |
| /// <returns>Cache configuration.</returns> |
| private CacheConfiguration GetCacheConfiguration() |
| { |
| return new CacheConfiguration("cacheName") |
| { |
| EnableStatistics = true, |
| |
| QueryEntities = new List<QueryEntity>() |
| { |
| new QueryEntity(typeof(int), typeof(Person)) |
| } |
| }; |
| } |
| |
| /// <summary> |
| /// Person. |
| /// </summary> |
| private class Person |
| { |
| [QuerySqlField] |
| public string Name { get; set; } |
| |
| [QuerySqlField] |
| public int Age { get; set; } |
| } |
| |
| /// <summary> |
| /// Execute two queries. |
| /// </summary> |
| /// <param name="cache">Cache instance.</param> |
| [SuppressMessage("ReSharper", "ReturnValueOfPureMethodIsNotUsed")] |
| private static void ExecuteTwoQueries(ICache<int, Person> cache) |
| { |
| IQueryable<ICacheEntry<int, Person>> queryable = cache.AsCacheQueryable(); |
| |
| queryable.Count(p => p.Value.Age > 0); |
| |
| queryable.Count(p => p.Value.Age > 1000); |
| } |
| |
| /// <summary> |
| /// Check metrics after two queries are executed. |
| /// </summary> |
| /// <param name="metrics">Query metrics.</param> |
| private static void CheckMetrics(IQueryMetrics metrics) |
| { |
| Assert.AreEqual(2, metrics.Executions, "Check Executions count."); |
| Assert.AreEqual(0, metrics.Fails, "Check Fails count."); |
| |
| Assert.GreaterOrEqual(metrics.MinimumTime, 0, "Check MinimumTime."); |
| Assert.GreaterOrEqual(metrics.MaximumTime, metrics.MinimumTime, "Check MaximumTime."); |
| |
| Assert.AreEqual((double)(metrics.MinimumTime + metrics.MaximumTime) / 2, metrics.AverageTime, 1, "Check AverageTime."); |
| } |
| } |
| } |