/// <summary>Scans a Table for matches with the current search.</summary> /// <param name="preselected">The preselected ids.</param> /// <param name="layout">Layout of the table.</param> /// <param name="indices">FieldIndices or null.</param> /// <param name="table">The table to scan.</param> /// <returns>All rows matching this search.</returns> public IEnumerable <Row> Scan(IEnumerable <Row> preselected, RowLayout layout, IFieldIndex[] indices, ITable table) { if (table == null) { throw new ArgumentNullException(nameof(table)); } if (layout == null) { throw new ArgumentNullException(nameof(layout)); } LoadLayout(layout); switch (Mode) { case SearchMode.None: { if (Inverted) { throw new InvalidOperationException("Cannot invert an empty search!"); } return(table.GetRows() ?? preselected); } case SearchMode.And: { var resultA = SearchA.Scan(preselected, layout, indices, table); var result = SearchB.Scan(resultA, layout, indices, table); return(!Inverted ? result : Invert(preselected ?? table.GetRows(), result)); } case SearchMode.Or: { var result = SearchA.Scan(preselected, layout, indices, table); var resultB = SearchB.Scan(preselected, layout, indices, table); result = result.Union(resultB).ToList(); return(Inverted ? Invert(preselected ?? table.GetRows(), result) : result); } case SearchMode.In: { IEnumerable <Row> result = new List <Row>(); foreach (var value in (Set <object>)FieldValue) { result = result.Union(table.GetRows(FieldEquals(FieldName, value))); } return(Inverted ? Invert(preselected ?? table.GetRows(), result) : result); } case SearchMode.Smaller: case SearchMode.Greater: case SearchMode.SmallerOrEqual: case SearchMode.GreaterOrEqual: case SearchMode.Like: case SearchMode.Equals: { if (Mode == SearchMode.Equals) { // check if we can do an index search if ((indices != null) && (indices[FieldNumber] != null)) { // field has an index var result = indices[FieldNumber].Find(FieldValue).Select(r => new Row(Layout, r, true)); if (preselected != null) { result = result.Intersect(preselected); } return(Inverted ? Invert(preselected ?? table.GetRows(), result) : result); } #if DEBUG // field has no index, need table scan if ((preselected == null) && (table.RowCount > 1000)) { Debug.WriteLine( $"Warning: Doing slow memory search on Table {layout.Name} Field {FieldName}! You should consider adding an index!"); } #endif } // scan without index { var result = new List <Row>(); if (preselected != null) { foreach (var row in preselected) { if (Check(row)) { result.Add(row); } } } else { foreach (var row in table.GetRows()) { if (Check(row)) { result.Add(row); } } } return(result); } } default: throw new NotImplementedException($"Mode {Mode} not implemented!"); } }
internal bool Check(object[] row) { var result = true; switch (Mode) { case SearchMode.None: if (Inverted) { result = !result; } return(result); case SearchMode.And: result = SearchA.Check(row) && SearchB.Check(row); if (Inverted) { result = !result; } return(result); case SearchMode.Or: result = SearchA.Check(row) || SearchB.Check(row); if (Inverted) { result = !result; } return(result); } #if DEBUG if (FieldNumber < 0) { throw new InvalidOperationException("Use LoadLayout first!"); } if (row.Length != Layout.FieldCount) { throw new ArgumentOutOfRangeException(nameof(row), "Row fieldcount does not match layout!"); } #endif switch (Mode) { case SearchMode.Greater: { var tableValue = (IComparable)row.GetValue(FieldNumber); if (FieldValue is DateTime) { result = Compare((DateTime)tableValue, (DateTime)FieldValue) > 0; } else { result = tableValue.CompareTo(FieldValue) > 0; } break; } case SearchMode.GreaterOrEqual: { var tableValue = (IComparable)row.GetValue(FieldNumber); if (FieldValue is DateTime) { result = Compare((DateTime)tableValue, (DateTime)FieldValue) >= 0; } else { result = tableValue.CompareTo(FieldValue) >= 0; } break; } case SearchMode.Smaller: { var tableValue = (IComparable)row.GetValue(FieldNumber); if (FieldValue is DateTime) { result = Compare((DateTime)tableValue, (DateTime)FieldValue) < 0; } else { result = tableValue.CompareTo(FieldValue) < 0; } break; } case SearchMode.SmallerOrEqual: { var tableValue = (IComparable)row.GetValue(FieldNumber); if (FieldValue is DateTime) { result = Compare((DateTime)tableValue, (DateTime)FieldValue) <= 0; } else { result = tableValue.CompareTo(FieldValue) <= 0; } break; } case SearchMode.In: { var rowValue = row.GetValue(FieldNumber); result = ((Set <object>)FieldValue).Contains(rowValue); } break; case SearchMode.Equals: { if (FieldValue is DateTime) { result = Compare((DateTime)row.GetValue(FieldNumber), (DateTime)FieldValue) == 0; } else { result = Equals(row.GetValue(FieldNumber), FieldValue); } break; } case SearchMode.Like: { if (FieldProperties == null) { FieldProperties = Layout[FieldNumber]; if ((FieldValue != null) && (FieldProperties.ValueType != FieldValue.GetType())) { throw new Exception($"Search for field {FieldProperties}: Value has to be of type {FieldProperties.ValueType}"); } } result = Like(row.GetValue(FieldNumber)); break; } default: throw new NotImplementedException($"Mode {Mode} not implemented!"); } if (Inverted) { result = !result; } return(result); }
private void EditField_TextChanged(object sender, TextChangedEventArgs e) { TextBox textBox = (TextBox)sender; if (SearchA.Equals(textBox)) { SearchAUpdate(); } else if (SearchB.Equals(textBox)) { SearchBUpdate(); } else if (SearchR.Equals(textBox)) { SearchRUpdate(); } else if (AbonementSurname.Equals(textBox)) { if (AbonementSurname.Text.Length > 0) { AbonementSurnameWatermark.Visibility = Visibility.Hidden; } else { AbonementSurnameWatermark.Visibility = Visibility.Visible; } } else if (AbonementName.Equals(textBox)) { if (AbonementName.Text.Length > 0) { AbonementNameWatermark.Visibility = Visibility.Hidden; } else { AbonementNameWatermark.Visibility = Visibility.Visible; } } else if (AbonementPatronymic.Equals(textBox)) { if (AbonementPatronymic.Text.Length > 0) { AbonementPatronymicWatermark.Visibility = Visibility.Hidden; } else { AbonementPatronymicWatermark.Visibility = Visibility.Visible; } } else if (PassportCountry.Equals(textBox)) { if (PassportCountry.Text.Length > 0) { PassportCountryWatermark.Visibility = Visibility.Hidden; } else { PassportCountryWatermark.Visibility = Visibility.Visible; } } else if (Address.Equals(textBox)) { if (Address.Text.Length > 0) { AddressWatermark.Visibility = Visibility.Hidden; } else { AddressWatermark.Visibility = Visibility.Visible; } } else if (ContactPhoneNumber.Equals(textBox)) { if (ContactPhoneNumber.Text.Length > 0) { ContactPhoneNumberWatermark.Visibility = Visibility.Hidden; } else { ContactPhoneNumberWatermark.Visibility = Visibility.Visible; } } }