More than likely missing something, but here goes.
There's also some debug spew uncommented in here - I'll remove it prior to
commit.
Index: src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistCore.cs
===================================================================
---
src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistCore.cs (revision
3365)
+++
src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistCore.cs (working
copy)
@@ -287,12 +287,12 @@
// Class used for timing different operations. Commented out for
normal operation.
public class Timer
{
- //DateTime time;
- //string name;
- //string details;
+ DateTime time;
+ string name;
+ string details;
- //static Dictionary<string, double> running_totals = new
Dictionary<string, double>();
- //static Dictionary<string, int> running_counts = new
Dictionary<string, int>();
+ static Dictionary<string, double> running_totals = new
Dictionary<string, double>();
+ static Dictionary<string, int> running_counts = new
Dictionary<string, int>();
public Timer () : this ("Timer") {}
@@ -300,7 +300,7 @@
public Timer (string name, string details)
{
- /*this.name = name;
+ this.name = name;
this.details = (details == null) ? "" : " (" + details + ")";
if (!running_totals.ContainsKey(name)) {
@@ -308,29 +308,29 @@
running_counts.Add(name, 0);
}
- time = DateTime.Now;*/
+ time = DateTime.Now;
- //System.Console.WriteLine ("{0} started", name);
+ System.Console.WriteLine ("{0} started", name);
}
public void Stop ()
{
- /*double elapsed = (DateTime.Now - time).TotalSeconds;
+ double elapsed = (DateTime.Now - time).TotalSeconds;
System.Console.WriteLine ("{0}{1} stopped: {2} seconds
elapsed", name, details, elapsed);
running_totals[name] += elapsed;
//running_totals[name+details] += elapsed;
running_counts[name]++;
- //running_counts[name+details]++;*/
+ //running_counts[name+details]++;
}
public static void PrintRunningTotals ()
{
- /*Console.WriteLine("Running totals:");
+ Console.WriteLine("Running totals:");
foreach (string k in running_totals.Keys) {
//if (running_totals[k] > .1) {
Console.WriteLine("{0}, {1}, {2}", k,
running_counts[k], running_totals[k]);
//}
- }*/
+ }
}
}
Index:
src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
===================================================================
---
src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs (revision
3365)
+++
src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs (working
copy)
@@ -147,9 +147,8 @@
get { return dependencies.Count > 0; }
}
- // FIXME scan ConditionTree for date fields
public bool TimeDependent {
- get { return false; }
+ get { return IsTimeDependent (ConditionTree); }
}
#endregion
@@ -366,5 +365,47 @@
}
}
}
+
+ private bool IsTimeDependent (QueryNode node) {
+ if (node == null) {
+ return false;
+ }
+
+ // See if the QueryNode is capable of having babies.
+ QueryListNode parent = node as QueryListNode;
+
+ if (parent != null) {
+ // Loop through the children and run the function
recursively.
+ foreach (QueryNode child in parent.Children) {
+ QueryTermNode term = child as QueryTermNode;
+ if (IsTimeDependent (term)) {
+ return true;
+ }
+ }
+ } else {
+ // Was a poor lonely QueryTerm on its own.
+ QueryTermNode term = node as QueryTermNode;
+ return IsTimeDependent (term);
+ }
+
+ // If we get here, we were a QueryListNode with no children.
+ return false;
+ }
+
+ private bool IsTimeDependent (QueryTermNode term)
+ {
+ if (term != null && (term.Field ==
BansheeQuery.LastPlayedField ||
+ term.Field ==
BansheeQuery.DateAddedField)) {
+ return true;
+ } else if (term != null && this.QueryOrder != null) {
+ if (this.QueryOrder.OrderSql.Contains
(BansheeQuery.LastPlayedField.Column) ||
+ this.QueryOrder.OrderSql.Contains
(BansheeQuery.DateAddedField.Column)) {
+
+ return true;
+ }
+ }
+
+ return false;
+ }
}
}Attachment:
cdiff
Description: Binary data