using System.Reflection;
using InfluxDB.Client.Core.Flux.Internal;
namespace InfluxDB.Client.Linq
{
///
/// Resolver to use customized tag and field names in LINQ queries.
///
public interface IMemberNameResolver
{
///
/// Get Type Of Member
///
/// for actual member
/// Type of member for actual member
MemberType ResolveMemberType(MemberInfo memberInfo);
///
/// Get name of property that will be use as a tag name or field name in InfluxDB.
///
/// property
/// Returns name of field or tag in InfluxDB
string GetColumnName(MemberInfo memberInfo);
///
/// Get name of property for named field.
///
/// property
/// value of expression
/// Return name of property.
string GetNamedFieldName(MemberInfo memberInfo, object value);
}
public enum MemberType
{
Measurement,
Tag,
Field,
Timestamp,
// Member Value is used as a name of field
NamedField,
// Member Value is used as a value of NamedField
NamedFieldValue
}
public class DefaultMemberNameResolver : IMemberNameResolver
{
private readonly AttributesCache _attributesCache = new AttributesCache();
public MemberType ResolveMemberType(MemberInfo memberInfo)
{
var attribute = _attributesCache.GetAttribute(memberInfo as PropertyInfo);
if (attribute != null)
{
if (attribute.IsMeasurement)
{
return MemberType.Measurement;
}
if (attribute.IsTag)
{
return MemberType.Tag;
}
if (attribute.IsTimestamp)
{
return MemberType.Timestamp;
}
}
return MemberType.Field;
}
public string GetColumnName(MemberInfo memberInfo)
{
var propertyInfo = memberInfo as PropertyInfo;
var attribute = _attributesCache.GetAttribute(propertyInfo);
return _attributesCache.GetColumnName(attribute, propertyInfo);
}
public string GetNamedFieldName(MemberInfo memberInfo, object value)
{
return GetColumnName(memberInfo);
}
}
}