Exemplo n.º 1
0
        /// <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!");
            }
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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;
                }
            }
        }