public override DTO.Criterion.ParameterDTO Create(dbqf.Criterion.IParameter p)
        {
            var np = p as NullParameter;
            if (np == null)
                return base.Create(p);

            return new NullParameterDTO() { Path = PathAssembler.Create(np.Path) };
        }
        public override DTO.Criterion.ParameterDTO Create(dbqf.Criterion.IParameter p)
        {
            var np = p as NotParameter;
            if (np == null)
                return base.Create(p);

            return new NotParameterDTO() { Parameter = Chain.Create(np.Parameter) };
        }
        public override DTO.Criterion.ParameterDTO Create(dbqf.Criterion.IParameter p)
        {
            var sp = p as SimpleParameter;
            if (sp == null)
                return base.Create(p);

            return new SimpleParameterDTO()
            {
                Path = PathAssembler.Create(sp.Path),
                Operator = sp.Operator,
                Value = sp.Value
            };
        }
        public override DTO.Criterion.ParameterDTO Create(dbqf.Criterion.IParameter p)
        {
            var j = p as Junction;
            if (j == null)
                return base.Create(p);

            JunctionDTO result = j is Conjunction ? (JunctionDTO)new ConjunctionDTO() : (JunctionDTO)new DisjunctionDTO();
            result.Parameters = new List<ParameterDTO>();
            foreach (var p2 in j)
                result.Parameters.Add(Chain.Create(p2));

            return result;
        }
Beispiel #5
0
        /// <summary>
        /// Adds or updates data for a FieldPath list in the cache.  If it already exists, it will query the data again.
        /// </summary>
        /// <param name="path"></param>
        public virtual void UpdateCache(dbqf.Criterion.IFieldPath path)
        {
            // if item exists in cache, clear and update
            // if item does not exist in cache, add it
            CacheData result;
            if (_listCache.ContainsKey(path))
                result = _listCache[path];
            else
            {
                result = new CacheData() { Data = new BindingList<object>() };
                _listCache.Add(path, result);

                // return if the field has a pre-defined list of items
                if (path.Last.List.Count > 0)
                {
                    result.Data.Add(string.Empty);
                    foreach (var x in path.Last.List)
                        result.Data.Add(x);
                    return;
                }
            }

            var gen = ResultFactory.CreateSqlListGenerator(Configuration).Path(path);
            if (Regex.IsMatch(path.Last.List.Source, @"^select.*[`'\[\s]id", RegexOptions.IgnoreCase))
                gen.IdColumn("ID")
                    .ValueColumn("Value");

            // ensure we'll be able to generate a command
            try { gen.Validate(); }
            catch { return; }

            // kill any existing worker
            if (result.CurrentWorker != null)
                result.CurrentWorker.CancelAsync();

            var bgw = new BackgroundWorker();
            bgw.WorkerSupportsCancellation = true;
            bgw.DoWork += (s2, e2) =>
            {
                result.CurrentWorker = bgw;
                try
                {
                    e2.Result = ResultFactory.CreateSqlResults(Connection).GetList(gen);
                }
                catch (Exception te)
                {
                    e2.Result = te;
                }
            };
            bgw.RunWorkerCompleted += (s2, e2) =>
            {
                if (e2.Cancelled)
                    return;

                if (e2.Result is Exception)
                {
                    // what do we do?
                }
                else
                {
                    var list = result.Data;
                    list.RaiseListChangedEvents = false;
                    list.Clear();
                    list.Add(string.Empty);
                    foreach (var i in (IList<object>)e2.Result)
                        list.Add(i);
                    list.RaiseListChangedEvents = true;
                    list.ResetBindings();
                }

                if (bgw == result.CurrentWorker)
                    result.CurrentWorker = null;
            };
            bgw.RunWorkerAsync();
        }