Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/09/17 11:51:37 (6 years ago)
Author:
pfleck
Message:

#2809: Simplified the overall filtering logic as suggested by bburlacu

  • changed parameter names to actively reflect that filter means "remaining"
  • moved filter combination logic to FilterContent
  • simplified/restructured code
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.cs

    r15274 r15466  
    2121
    2222using System;
    23 using System.Collections.Generic;
    2423using System.Linq;
    2524using HeuristicLab.Collections;
     
    4443    }
    4544
    46     private void InitData() {
    47       checkedFilterView.Content = Content.Filters;
    48       checkedFilterView.Content.ItemsAdded += Content_ItemsAdded;
    49       checkedFilterView.Content.ItemsRemoved += Content_ItemsRemoved;
    50       checkedFilterView.Content.CheckedItemsChanged += Content_CheckedItemsChanged;
    51     }
    52 
    5345    protected override void OnContentChanged() {
    5446      base.OnContentChanged();
    5547      if (Content != null) {
    56         InitData();
    57         UpdateFilterInfo();
     48        checkedFilterView.Content = Content.Filters;
     49        rBtnAnd.Checked = Content.IsAndCombination;
     50        rBtnOr.Checked = !Content.IsAndCombination;
     51        UpdateFilter();
     52      } else {
     53        checkedFilterView.Content = null;
    5854      }
    5955    }
    60 
    61     private void Content_CheckedItemsChanged(object sender, Collections.CollectionItemsChangedEventArgs<IFilter> e) {
    62       if (Content != null) {
    63         foreach (IFilter filter in e.Items) {
    64           filter.Active = checkedFilterView.Content.ItemChecked(filter);
    65         }
    66         UpdateFilterInfo();
    67       }
     56    protected override void RegisterContentEvents() {
     57      base.RegisterContentEvents();
     58      Content.Filters.ItemsAdded += Content_ItemsAdded;
     59      Content.Filters.ItemsRemoved += Content_ItemsRemoved;
     60      Content.Filters.CheckedItemsChanged += Content_CheckedItemsChanged;
     61    }
     62    protected override void DeregisterContentEvents() {
     63      Content.Filters.ItemsAdded -= Content_ItemsAdded;
     64      Content.Filters.ItemsRemoved -= Content_ItemsRemoved;
     65      Content.Filters.CheckedItemsChanged -= Content_CheckedItemsChanged;
     66      base.DeregisterContentEvents();
    6867    }
    6968
    70     private void UpdateFilterInfo() {
    71       List<IFilter> filters = Content.Filters.ToList();
    72       int activeFilters = filters.Count(c => c.Active);
    73       applyFilterButton.Enabled = (activeFilters > 0);
    74       rBtnAnd.Enabled = (activeFilters > 0);
    75       rBtnOr.Enabled = (activeFilters > 0);
     69    private void UpdateFilter() {
     70      bool activeFilters = Content.ActiveFilters.Any();
     71      applyFilterButton.Enabled = activeFilters;
     72
     73      int numTotal = Content.PreprocessingData.Rows;
     74      int numRemaining = numTotal;
     75
    7676      Content.PreprocessingData.ResetFilter();
    77       bool isAndCombination = rBtnAnd.Checked;
    78       bool[] ret;
    79       IList<IFilter> activeFilters1 = filters.Where(f => f.Active && f.ConstraintData != null).ToList();
    80       if (activeFilters1.Count > 0) {
    81         var result1 = Enumerable.Repeat(!isAndCombination, Content.PreprocessingData.Rows).ToArray();
     77      if (activeFilters) {
     78        var remainingRows = Content.GetRemainingRows();
     79        Content.PreprocessingData.SetFilter(remainingRows);
     80        numRemaining = remainingRows.Count(x => x);
     81      }
    8282
    83         foreach (IFilter filter in activeFilters1) {
    84           bool[] filterResult = filter.Check();
    85           for (int row = 0; row < result1.Length; ++row) {
    86             result1[row] = isAndCombination ? result1[row] || filterResult[row] : result1[row] && filterResult[row];
    87           }
    88         }
    89         Content.PreprocessingData.SetFilter(result1);
    90         ret = result1;
    91       } else {
    92         ret = Enumerable.Repeat(false, Content.PreprocessingData.Rows).ToArray();
    93       }
    94       bool[] result = ret;
    95 
    96       int filteredCnt = result.Count(c => !c);
    97 
    98       tbRemaining.Text = filteredCnt.ToString();
    99       double percentage = result.Length == 0 ? 0.0 : filteredCnt * 100 / (double)result.Length;
    100       tbPercentage.Text = String.Format("{0:0.0000}%", percentage);
    101       tbTotal.Text = result.Length.ToString();
     83      tbRemaining.Text = numRemaining.ToString();
     84      double ratio = numTotal > 0 ? numRemaining / (double)numTotal : 0.0;
     85      tbPercentage.Text = ratio.ToString("P4");
     86      tbTotal.Text = numTotal.ToString();
    10287    }
    10388
    104     private void applyFilterButton_Click(object sender, EventArgs e) {
    105       if (Content != null) {
    106         List<IFilter> filters = Content.Filters.ToList();
    107         //apply filters
    108         bool isAndCombination = rBtnAnd.Checked;
    109         Content.PreprocessingData.PersistFilter();
    110         Content.PreprocessingData.ResetFilter();
    111         //deactivate checked filters
    112         filters = checkedFilterView.Content.CheckedItems.ToList();
    113         foreach (IFilter filter in filters) {
    114           checkedFilterView.Content.SetItemCheckedState(filter, false);
    115           filter.Active = false;
    116         }
    117         UpdateFilterInfo();
    118       }
    119     }
    12089
     90    #region Content Events
    12191    //whenever a new filter is added the preprocessing data is set to the filter
    12292    private void Content_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IFilter> e) {
     
    12797      }
    12898    }
    129 
    13099    private void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IFilter> e) {
    131100      if (Content != null) {
    132         UpdateFilterInfo();
     101        UpdateFilter();
    133102      }
    134103    }
     104    private void Content_CheckedItemsChanged(object sender, Collections.CollectionItemsChangedEventArgs<IFilter> e) {
     105      if (Content != null) {
     106        foreach (IFilter filter in e.Items) {
     107          filter.Active = checkedFilterView.Content.ItemChecked(filter);
     108        }
     109        UpdateFilter();
     110      }
     111    }
     112    #endregion
    135113
     114    #region Controls Events
    136115    private void rBtnAnd_CheckedChanged(object sender, EventArgs e) {
    137116      if (Content != null) {
    138         UpdateFilterInfo();
    139117        Content.IsAndCombination = rBtnAnd.Checked;
     118        UpdateFilter();
    140119      }
    141120    }
     121    private void applyFilterButton_Click(object sender, EventArgs e) {
     122      if (Content != null) {
     123        //apply filters
     124        Content.PreprocessingData.PersistFilter();
     125        Content.PreprocessingData.ResetFilter();
     126        //deactivate checked filters
     127        foreach (var filter in Content.Filters.CheckedItems) {
     128          checkedFilterView.Content.SetItemCheckedState(filter, false);
     129          filter.Active = false;
     130        }
     131        UpdateFilter();
     132      }
     133    }
     134    #endregion
    142135  }
    143136}
Note: See TracChangeset for help on using the changeset viewer.