using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace Firebase.Database.Query
{
///
/// Query extensions providing linq like syntax for firebase server methods.
///
public static class QueryExtensions
{
///
/// Adds an auth parameter to the query.
///
/// The child.
/// The auth token.
/// The .
internal static AuthQuery WithAuth(this FirebaseQuery node, string token)
{
return node.WithAuth(() => token);
}
///
/// Appends print=silent to save bandwidth.
///
/// The child.
/// The .
internal static SilentQuery Silent(this FirebaseQuery node)
{
return new SilentQuery(node, node.Client);
}
///
/// References a sub child of the existing node.
///
/// The child.
/// The path of sub child.
/// The .
public static ChildQuery Child(this ChildQuery node, string path)
{
return node.Child(() => path);
}
///
/// Order data by given . Note that this is used mainly for following filtering queries and
/// due to firebase implementation
/// the data may actually not be ordered.
///
/// The child.
/// The property name.
/// The .
public static OrderQuery OrderBy(this ChildQuery child, string propertyName)
{
return child.OrderBy(() => propertyName);
}
///
/// Instructs firebase to send data greater or equal to the . This must be preceded by an OrderBy
/// query.
///
/// Current node.
/// Value to start at.
/// The .
public static FilterQuery StartAt(this ParameterQuery child, string value)
{
return child.StartAt(() => value);
}
///
/// Instructs firebase to send data lower or equal to the . This must be preceded by an OrderBy
/// query.
///
/// Current node.
/// Value to start at.
/// The .
public static FilterQuery EndAt(this ParameterQuery child, string value)
{
return child.EndAt(() => value);
}
///
/// Instructs firebase to send data equal to the . This must be preceded by an OrderBy query.
///
/// Current node.
/// Value to start at.
/// The .
public static FilterQuery EqualTo(this ParameterQuery child, string value)
{
return child.EqualTo(() => value);
}
///
/// Instructs firebase to send data greater or equal to the . This must be preceded by an OrderBy
/// query.
///
/// Current node.
/// Value to start at.
/// The .
public static FilterQuery StartAt(this ParameterQuery child, double value)
{
return child.StartAt(() => value);
}
///
/// Instructs firebase to send data lower or equal to the . This must be preceded by an OrderBy
/// query.
///
/// Current node.
/// Value to start at.
/// The .
public static FilterQuery EndAt(this ParameterQuery child, double value)
{
return child.EndAt(() => value);
}
///
/// Instructs firebase to send data equal to the . This must be preceded by an OrderBy query.
///
/// Current node.
/// Value to start at.
/// The .
public static FilterQuery EqualTo(this ParameterQuery child, double value)
{
return child.EqualTo(() => value);
}
///
/// Instructs firebase to send data equal to the . This must be preceded by an OrderBy query.
///
/// Current node.
/// Value to start at.
/// The .
public static FilterQuery EqualTo(this ParameterQuery child, bool value)
{
return child.EqualTo(() => value);
}
///
/// Instructs firebase to send data equal to null. This must be preceded by an OrderBy query.
///
/// Current node.
/// The .
public static FilterQuery EqualTo(this ParameterQuery child)
{
return child.EqualTo(() => null);
}
///
/// Limits the result to first items.
///
/// Current node.
/// Number of elements.
/// The .
public static FilterQuery LimitToFirst(this ParameterQuery child, int count)
{
return child.LimitToFirst(() => count);
}
///
/// Limits the result to last items.
///
/// Current node.
/// Number of elements.
/// The .
public static FilterQuery LimitToLast(this ParameterQuery child, int count)
{
return child.LimitToLast(() => count);
}
public static Task PutAsync(this FirebaseQuery query, T obj)
{
return query.PutAsync(JsonConvert.SerializeObject(obj, query.Client.Options.JsonSerializerSettings));
}
public static Task PatchAsync(this FirebaseQuery query, T obj)
{
return query.PatchAsync(JsonConvert.SerializeObject(obj, query.Client.Options.JsonSerializerSettings));
}
public static async Task> PostAsync(this FirebaseQuery query, T obj,
bool generateKeyOffline = true)
{
var result =
await query.PostAsync(JsonConvert.SerializeObject(obj, query.Client.Options.JsonSerializerSettings),
generateKeyOffline);
return new FirebaseObject(result.Key, obj);
}
///
/// Fan out given item to multiple locations at once. See
/// https://firebase.googleblog.com/2015/10/client-side-fan-out-for-data-consistency_73.html for details.
///
/// Type of object to fan out.
/// Current node.
/// Object to fan out.
/// Locations where to store the item.
public static async Task FanOut(this ChildQuery child, T item, params string[] relativePaths)
{
if (relativePaths == null) throw new ArgumentNullException(nameof(relativePaths));
var fanoutObject = new Dictionary(relativePaths.Length);
foreach (var path in relativePaths) fanoutObject.Add(path, item);
await child.PatchAsync(fanoutObject);
}
}
}