Add advanced search to database

Can run certain queries using the same format as BatchEditor

Improved property filtering if filter is invalid.
This commit is contained in:
Kaphotics 2016-07-23 01:04:55 -07:00
parent 1dd4919adc
commit a41cb8bae0
4 changed files with 96 additions and 27 deletions

View file

@ -204,7 +204,7 @@ namespace PKHeX
} }
// Utility Methods // Utility Methods
private class StringInstruction public class StringInstruction
{ {
public string PropertyName; public string PropertyName;
public string PropertyValue; public string PropertyValue;
@ -222,10 +222,14 @@ namespace PKHeX
if (!PKM.ChecksumValid || PKM.Species == 0) if (!PKM.ChecksumValid || PKM.Species == 0)
return ModifyResult.Invalid; return ModifyResult.Invalid;
Type pkm = PKM.GetType();
foreach (var cmd in Filters) foreach (var cmd in Filters)
{ {
try try
{ {
if (!pkm.HasProperty(cmd.PropertyName))
return ModifyResult.Filtered;
if (ReflectUtil.GetValueEquals(PKM, cmd.PropertyName, cmd.PropertyValue) != cmd.Evaluator) if (ReflectUtil.GetValueEquals(PKM, cmd.PropertyName, cmd.PropertyValue) != cmd.Evaluator)
return ModifyResult.Filtered; return ModifyResult.Filtered;
} }

View file

@ -150,10 +150,12 @@
this.CHK_Shiny = new System.Windows.Forms.CheckBox(); this.CHK_Shiny = new System.Windows.Forms.CheckBox();
this.TLP_Filters = new System.Windows.Forms.TableLayoutPanel(); this.TLP_Filters = new System.Windows.Forms.TableLayoutPanel();
this.FLP_Format = new System.Windows.Forms.FlowLayoutPanel(); this.FLP_Format = new System.Windows.Forms.FlowLayoutPanel();
this.CB_Format = new System.Windows.Forms.ComboBox();
this.CB_FormatComparator = new System.Windows.Forms.ComboBox(); this.CB_FormatComparator = new System.Windows.Forms.ComboBox();
this.CB_Format = new System.Windows.Forms.ComboBox();
this.L_Format = new System.Windows.Forms.Label(); this.L_Format = new System.Windows.Forms.Label();
this.FLP_Level = new System.Windows.Forms.FlowLayoutPanel(); this.FLP_Level = new System.Windows.Forms.FlowLayoutPanel();
this.RTB_Instructions = new System.Windows.Forms.RichTextBox();
this.Menu_SearchAdvanced = new System.Windows.Forms.ToolStripMenuItem();
((System.ComponentModel.ISupportInitialize)(this.bpkx30)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.bpkx30)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx29)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.bpkx29)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx28)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.bpkx28)).BeginInit();
@ -947,7 +949,8 @@
this.Menu_SearchBoxes, this.Menu_SearchBoxes,
this.Menu_SearchDatabase, this.Menu_SearchDatabase,
this.Menu_SearchLegal, this.Menu_SearchLegal,
this.Menu_SearchIllegal}); this.Menu_SearchIllegal,
this.Menu_SearchAdvanced});
this.Menu_SearchSettings.Image = global::PKHeX.Properties.Resources.settings; this.Menu_SearchSettings.Image = global::PKHeX.Properties.Resources.settings;
this.Menu_SearchSettings.Name = "Menu_SearchSettings"; this.Menu_SearchSettings.Name = "Menu_SearchSettings";
this.Menu_SearchSettings.Size = new System.Drawing.Size(197, 22); this.Menu_SearchSettings.Size = new System.Drawing.Size(197, 22);
@ -959,7 +962,7 @@
this.Menu_SearchBoxes.CheckOnClick = true; this.Menu_SearchBoxes.CheckOnClick = true;
this.Menu_SearchBoxes.CheckState = System.Windows.Forms.CheckState.Checked; this.Menu_SearchBoxes.CheckState = System.Windows.Forms.CheckState.Checked;
this.Menu_SearchBoxes.Name = "Menu_SearchBoxes"; this.Menu_SearchBoxes.Name = "Menu_SearchBoxes";
this.Menu_SearchBoxes.Size = new System.Drawing.Size(198, 22); this.Menu_SearchBoxes.Size = new System.Drawing.Size(207, 22);
this.Menu_SearchBoxes.Text = "Search Within Boxes"; this.Menu_SearchBoxes.Text = "Search Within Boxes";
// //
// Menu_SearchDatabase // Menu_SearchDatabase
@ -968,7 +971,7 @@
this.Menu_SearchDatabase.CheckOnClick = true; this.Menu_SearchDatabase.CheckOnClick = true;
this.Menu_SearchDatabase.CheckState = System.Windows.Forms.CheckState.Checked; this.Menu_SearchDatabase.CheckState = System.Windows.Forms.CheckState.Checked;
this.Menu_SearchDatabase.Name = "Menu_SearchDatabase"; this.Menu_SearchDatabase.Name = "Menu_SearchDatabase";
this.Menu_SearchDatabase.Size = new System.Drawing.Size(198, 22); this.Menu_SearchDatabase.Size = new System.Drawing.Size(207, 22);
this.Menu_SearchDatabase.Text = "Search Within Database"; this.Menu_SearchDatabase.Text = "Search Within Database";
// //
// Menu_SearchLegal // Menu_SearchLegal
@ -977,7 +980,7 @@
this.Menu_SearchLegal.CheckOnClick = true; this.Menu_SearchLegal.CheckOnClick = true;
this.Menu_SearchLegal.CheckState = System.Windows.Forms.CheckState.Checked; this.Menu_SearchLegal.CheckState = System.Windows.Forms.CheckState.Checked;
this.Menu_SearchLegal.Name = "Menu_SearchLegal"; this.Menu_SearchLegal.Name = "Menu_SearchLegal";
this.Menu_SearchLegal.Size = new System.Drawing.Size(198, 22); this.Menu_SearchLegal.Size = new System.Drawing.Size(207, 22);
this.Menu_SearchLegal.Text = "Show Legal"; this.Menu_SearchLegal.Text = "Show Legal";
// //
// Menu_SearchIllegal // Menu_SearchIllegal
@ -986,7 +989,7 @@
this.Menu_SearchIllegal.CheckOnClick = true; this.Menu_SearchIllegal.CheckOnClick = true;
this.Menu_SearchIllegal.CheckState = System.Windows.Forms.CheckState.Checked; this.Menu_SearchIllegal.CheckState = System.Windows.Forms.CheckState.Checked;
this.Menu_SearchIllegal.Name = "Menu_SearchIllegal"; this.Menu_SearchIllegal.Name = "Menu_SearchIllegal";
this.Menu_SearchIllegal.Size = new System.Drawing.Size(198, 22); this.Menu_SearchIllegal.Size = new System.Drawing.Size(207, 22);
this.Menu_SearchIllegal.Text = "Show Illegal"; this.Menu_SearchIllegal.Text = "Show Illegal";
// //
// Menu_OpenDB // Menu_OpenDB
@ -1655,8 +1658,7 @@
// //
// TLP_Filters // TLP_Filters
// //
this.TLP_Filters.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) this.TLP_Filters.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.TLP_Filters.AutoScroll = true; this.TLP_Filters.AutoScroll = true;
this.TLP_Filters.AutoScrollMargin = new System.Drawing.Size(3, 3); this.TLP_Filters.AutoScrollMargin = new System.Drawing.Size(3, 3);
@ -1730,6 +1732,23 @@
this.FLP_Format.Size = new System.Drawing.Size(122, 21); this.FLP_Format.Size = new System.Drawing.Size(122, 21);
this.FLP_Format.TabIndex = 124; this.FLP_Format.TabIndex = 124;
// //
// CB_FormatComparator
//
this.CB_FormatComparator.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.CB_FormatComparator.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.CB_FormatComparator.FormattingEnabled = true;
this.CB_FormatComparator.Items.AddRange(new object[] {
"Any",
">=",
"==",
"<="});
this.CB_FormatComparator.Location = new System.Drawing.Point(0, 0);
this.CB_FormatComparator.Margin = new System.Windows.Forms.Padding(0);
this.CB_FormatComparator.Name = "CB_FormatComparator";
this.CB_FormatComparator.Size = new System.Drawing.Size(54, 21);
this.CB_FormatComparator.TabIndex = 122;
this.CB_FormatComparator.SelectedIndexChanged += new System.EventHandler(this.changeFormatFilter);
//
// CB_Format // CB_Format
// //
this.CB_Format.Anchor = System.Windows.Forms.AnchorStyles.Left; this.CB_Format.Anchor = System.Windows.Forms.AnchorStyles.Left;
@ -1748,23 +1767,6 @@
this.CB_Format.TabIndex = 121; this.CB_Format.TabIndex = 121;
this.CB_Format.Visible = false; this.CB_Format.Visible = false;
// //
// CB_FormatComparator
//
this.CB_FormatComparator.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.CB_FormatComparator.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.CB_FormatComparator.FormattingEnabled = true;
this.CB_FormatComparator.Items.AddRange(new object[] {
"Any",
">=",
"==",
"<="});
this.CB_FormatComparator.Location = new System.Drawing.Point(0, 0);
this.CB_FormatComparator.Margin = new System.Windows.Forms.Padding(0);
this.CB_FormatComparator.Name = "CB_FormatComparator";
this.CB_FormatComparator.Size = new System.Drawing.Size(54, 21);
this.CB_FormatComparator.TabIndex = 122;
this.CB_FormatComparator.SelectedIndexChanged += new System.EventHandler(this.changeFormatFilter);
//
// L_Format // L_Format
// //
this.L_Format.Anchor = System.Windows.Forms.AnchorStyles.Right; this.L_Format.Anchor = System.Windows.Forms.AnchorStyles.Right;
@ -1789,6 +1791,25 @@
this.FLP_Level.Size = new System.Drawing.Size(88, 21); this.FLP_Level.Size = new System.Drawing.Size(88, 21);
this.FLP_Level.TabIndex = 119; this.FLP_Level.TabIndex = 119;
// //
// RTB_Instructions
//
this.RTB_Instructions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Right)));
this.RTB_Instructions.Location = new System.Drawing.Point(63, 27);
this.RTB_Instructions.Name = "RTB_Instructions";
this.RTB_Instructions.Size = new System.Drawing.Size(235, 352);
this.RTB_Instructions.TabIndex = 119;
this.RTB_Instructions.Text = "";
//
// Menu_SearchAdvanced
//
this.Menu_SearchAdvanced.CheckOnClick = true;
this.Menu_SearchAdvanced.Name = "Menu_SearchAdvanced";
this.Menu_SearchAdvanced.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.A)));
this.Menu_SearchAdvanced.Size = new System.Drawing.Size(207, 22);
this.Menu_SearchAdvanced.Text = "Advanced Search";
this.Menu_SearchAdvanced.Click += new System.EventHandler(this.Menu_SearchAdvanced_Click);
//
// SAV_Database // SAV_Database
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -1801,6 +1822,7 @@
this.Controls.Add(this.B_Reset); this.Controls.Add(this.B_Reset);
this.Controls.Add(this.P_Results); this.Controls.Add(this.P_Results);
this.Controls.Add(this.menuStrip1); this.Controls.Add(this.menuStrip1);
this.Controls.Add(this.RTB_Instructions);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false; this.MaximizeBox = false;
@ -2019,5 +2041,7 @@
private System.Windows.Forms.FlowLayoutPanel FLP_Format; private System.Windows.Forms.FlowLayoutPanel FLP_Format;
private System.Windows.Forms.ComboBox CB_FormatComparator; private System.Windows.Forms.ComboBox CB_FormatComparator;
private System.Windows.Forms.ComboBox CB_Format; private System.Windows.Forms.ComboBox CB_Format;
private System.Windows.Forms.RichTextBox RTB_Instructions;
private System.Windows.Forms.ToolStripMenuItem Menu_SearchAdvanced;
} }
} }

View file

@ -306,6 +306,7 @@ namespace PKHeX
CB_Generation.SelectedIndex = 0; CB_Generation.SelectedIndex = 0;
MT_ESV.Visible = L_ESV.Visible = false; MT_ESV.Visible = L_ESV.Visible = false;
RTB_Instructions.Clear();
if (sender != null) if (sender != null)
System.Media.SystemSounds.Asterisk.Play(); System.Media.SystemSounds.Asterisk.Play();
@ -547,6 +548,36 @@ namespace PKHeX
if (!Menu_SearchLegal.Checked && Menu_SearchIllegal.Checked) // Illegal Only if (!Menu_SearchLegal.Checked && Menu_SearchIllegal.Checked) // Illegal Only
res = res.Where(pk => pk.Gen6 && pk is PK6 && !new LegalityAnalysis((PK6) pk).Valid); res = res.Where(pk => pk.Gen6 && pk is PK6 && !new LegalityAnalysis((PK6) pk).Valid);
if (RTB_Instructions.Lines.Any(line => line.Length > 0))
{
var raw =
RTB_Instructions.Lines
.Where(line => !string.IsNullOrWhiteSpace(line))
.Where(line => new[] { '!', '=' }.Contains(line[0]));
var filters = (from line in raw
let eval = line[0] == '='
let split = line.Substring(1).Split('=')
where split.Length == 2 && !string.IsNullOrWhiteSpace(split[0])
select new BatchEditor.StringInstruction { PropertyName = split[0], PropertyValue = split[1], Evaluator = eval }).ToArray();
if (filters.Any(z => string.IsNullOrWhiteSpace(z.PropertyValue)))
{ Util.Error("Empty Filter Value detected."); return; }
res = res.Where(pkm => // Compare across all filters
{
foreach (var cmd in filters)
{
if (!pkm.GetType().HasProperty(cmd.PropertyName))
return false;
try { if (ReflectUtil.GetValueEquals(pkm, cmd.PropertyName, cmd.PropertyValue) == cmd.Evaluator) continue; }
catch { Console.WriteLine($"Unable to compare {cmd.PropertyName} to {cmd.PropertyValue}."); }
return false;
}
return true;
});
}
var results = res.ToArray(); var results = res.ToArray();
if (results.Length == 0) if (results.Length == 0)
{ {
@ -639,6 +670,12 @@ namespace PKHeX
var any = result[0][0]; var any = result[0][0];
m_parent.populateFields(any); m_parent.populateFields(any);
} }
private void Menu_SearchAdvanced_Click(object sender, EventArgs e)
{
if (!Menu_SearchAdvanced.Checked)
{ Size = MinimumSize; RTB_Instructions.Clear(); }
else Size = MaximumSize;
}
private void Menu_Exit_Click(object sender, EventArgs e) private void Menu_Exit_Click(object sender, EventArgs e)
{ {

View file

@ -32,7 +32,11 @@ namespace PKHeX
} }
internal static IEnumerable<string> getPropertiesCanWritePublic(Type type) internal static IEnumerable<string> getPropertiesCanWritePublic(Type type)
{ {
return type.GetProperties().Where(p => p.CanWrite && p.GetSetMethod(/*nonPublic*/ true).IsPublic).Select(p => p.Name); return type.GetProperties().Where(p => p.CanWrite && p.GetSetMethod(nonPublic: true).IsPublic).Select(p => p.Name);
}
internal static bool HasProperty(this Type type, string name)
{
return type.GetProperties(BindingFlags.Public | BindingFlags.Instance).Any(p => p.Name == name);
} }
} }
} }