public void Visit(FloatLiteral op)
 {
     WriteEncoded(_context.Format(op.Value));
     if (_version.OnlySupportsV2OrV3())
     {
         WriteEncoded("d");
     }
 }
Beispiel #2
0
 public void ToAml(XmlWriter writer, AmlWriterSettings settings)
 {
     writer.WriteStartElement("Item");
     writer.WriteAttributeString("type", Type);
     writer.WriteAttributeString("id", Id);
     writer.WriteAttributeString("action", "edit");
     writer.WriteAttributeString("doGetItem", "0");
     writer.WriteElementString("x", _context.Format(Position.X));
     writer.WriteElementString("y", _context.Format(Position.Y));
     if (Segments.Any())
     {
         writer.WriteElementString("segments", Segments.GroupConcat("|", p => $"{p.X},{p.Y}"));
     }
     writer.WriteEndElement();
 }
        public void Visit(QueryItem query)
        {
            var refId = Guid.NewGuid().ToArasId();

            _writer.WriteStartElement("Item");
            _writer.WriteAttributeString("type", "qry_QueryDefinition");
            _writer.WriteAttributeString("action", "qry_ExecuteQueryDefinition");

            _writer.WriteStartElement("Relationships");

            _writer.WriteStartElement("Item");
            _writer.WriteAttributeString("type", "qry_QueryItem");
            _writer.WriteElementString("alias", query.Alias);
            _writer.WriteStartElement("item_type");
            _writer.WriteAttributeString("keyed_name", query.Type);
            _writer.WriteEndElement();
            _writer.WriteElementString("ref_id", refId);

            if (!query.Select.All(s => s.Expression is PropertyReference))
            {
                throw new NotSupportedException();
            }

            if (!query.OrderBy.All(s => s.Expression is PropertyReference))
            {
                throw new NotSupportedException();
            }

            _writer.WriteStartElement("Relationships");

            foreach (var select in query.Select)
            {
                _writer.WriteStartElement("Item");
                _writer.WriteAttributeString("type", "qry_QueryItemSelectProperty");
                _writer.WriteElementString("property_name", ((PropertyReference)select.Expression).Name);
                _writer.WriteEndElement(); // Item
            }

            var idx = 10;

            foreach (var orderBy in query.OrderBy)
            {
                _writer.WriteStartElement("Item");
                _writer.WriteAttributeString("type", "qry_QueryItemSortProperty");
                _writer.WriteElementString("property_name", ((PropertyReference)orderBy.Expression).Name);
                _writer.WriteElementString("sort_order_direction", orderBy.Ascending ? "asc" : "desc");
                _writer.WriteElementString("sort_order", _context.Format(idx));
                _writer.WriteEndElement(); // Item
                idx += 10;
            }

            _writer.WriteEndElement(); // Relationships

            var where = query.Where;
            if (query.Version is CurrentVersion)
            {
                where = new AndOperator()
                {
                    Left  = where,
                    Right = new EqualsOperator()
                    {
                        Left  = new PropertyReference("is_current", query),
                        Right = new BooleanLiteral(true)
                    }.Normalize()
                }.Normalize();
            }

            if (where != null)
            {
                using (var strWriter = new StringWriter())
                    using (_conditionWriter = XmlWriter.Create(strWriter, new XmlWriterSettings()
                    {
                        OmitXmlDeclaration = true
                    }))
                    {
                        _conditionWriter.WriteStartElement("condition");
                        query.Where.Visit(this);
                        _conditionWriter.WriteEndElement();

                        _conditionWriter.Flush();
                        strWriter.Flush();

                        _writer.WriteStartElement("filter_xml");
                        _writer.WriteCData(strWriter.ToString());
                        _writer.WriteEndElement();
                    }
                _conditionWriter = null;
            }

            if (query.Offset.HasValue || query.Fetch.HasValue)
            {
                using (var strWriter = new StringWriter())
                    using (_conditionWriter = XmlWriter.Create(strWriter, new XmlWriterSettings()
                    {
                        OmitXmlDeclaration = true
                    }))
                    {
                        _conditionWriter.WriteStartElement("configuration");
                        _conditionWriter.WriteStartElement("option");
                        if (query.Offset.HasValue)
                        {
                            _conditionWriter.WriteElementString("offset", _context.Format(query.Offset));
                        }
                        if (query.Fetch.HasValue)
                        {
                            _conditionWriter.WriteElementString("fetch", _context.Format(query.Fetch));
                        }
                        _conditionWriter.WriteEndElement();
                        _conditionWriter.WriteEndElement();

                        _conditionWriter.Flush();
                        strWriter.Flush();

                        _writer.WriteStartElement("offset_fetch_xml");
                        _writer.WriteCData(strWriter.ToString());
                        _writer.WriteEndElement();
                    }
                _conditionWriter = null;
            }

            _writer.WriteEndElement(); // Item

            foreach (var param in _parameters)
            {
                _writer.WriteStartElement("Item");
                _writer.WriteAttributeString("type", "qry_QueryParameter");
                _writer.WriteElementString("name", param.Name);
                _writer.WriteEndElement(); // Item
            }

            _writer.WriteStartElement("Item");
            _writer.WriteAttributeString("type", "qry_QueryReference");
            _writer.WriteElementString("child_ref_id", refId);
            _writer.WriteEndElement(); // Item

            _writer.WriteEndElement(); // Relationships
            _writer.WriteEndElement(); // Item
        }