EVOLUTION-MANAGER
Edit File: serialisation.html
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="generator" content="Docutils 0.8.1: http://docutils.sourceforge.net/" /> <title>Serialisation of Queries and Documents</title> <style type="text/css"> /* :Author: David Goodger (goodger@python.org) :Id: $Id: html4css1.css 7056 2011-06-17 10:50:48Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to customize this style sheet. */ /* used to remove borders from tables and images */ .borderless, table.borderless td, table.borderless th { border: 0 } table.borderless td, table.borderless th { /* Override padding for "table.docutils td" with "! important". The right padding separates the table cells. */ padding: 0 0.5em 0 0 ! important } .first { /* Override more specific margin styles with "! important". */ margin-top: 0 ! important } .last, .with-subtitle { margin-bottom: 0 ! important } .hidden { display: none } a.toc-backref { text-decoration: none ; color: black } blockquote.epigraph { margin: 2em 5em ; } dl.docutils dd { margin-bottom: 0.5em } object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] { overflow: hidden; } /* Uncomment (and remove this text!) to get bold-faced definition list terms dl.docutils dt { font-weight: bold } */ div.abstract { margin: 2em 5em } div.abstract p.topic-title { font-weight: bold ; text-align: center } div.admonition, div.attention, div.caution, div.danger, div.error, div.hint, div.important, div.note, div.tip, div.warning { margin: 2em ; border: medium outset ; padding: 1em } div.admonition p.admonition-title, div.hint p.admonition-title, div.important p.admonition-title, div.note p.admonition-title, div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif } div.attention p.admonition-title, div.caution p.admonition-title, div.danger p.admonition-title, div.error p.admonition-title, div.warning p.admonition-title { color: red ; font-weight: bold ; font-family: sans-serif } /* Uncomment (and remove this text!) to get reduced vertical space in compound paragraphs. div.compound .compound-first, div.compound .compound-middle { margin-bottom: 0.5em } div.compound .compound-last, div.compound .compound-middle { margin-top: 0.5em } */ div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic } div.dedication p.topic-title { font-weight: bold ; font-style: normal } div.figure { margin-left: 2em ; margin-right: 2em } div.footer, div.header { clear: both; font-size: smaller } div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em } div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ; margin-left: 1.5em } div.sidebar { margin: 0 0 0.5em 1em ; border: medium outset ; padding: 1em ; background-color: #ffffee ; width: 40% ; float: right ; clear: right } div.sidebar p.rubric { font-family: sans-serif ; font-size: medium } div.system-messages { margin: 5em } div.system-messages h1 { color: red } div.system-message { border: medium outset ; padding: 1em } div.system-message p.system-message-title { color: red ; font-weight: bold } div.topic { margin: 2em } h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { margin-top: 0.4em } h1.title { text-align: center } h2.subtitle { text-align: center } hr.docutils { width: 75% } img.align-left, .figure.align-left, object.align-left { clear: left ; float: left ; margin-right: 1em } img.align-right, .figure.align-right, object.align-right { clear: right ; float: right ; margin-left: 1em } img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } .align-left { text-align: left } .align-center { clear: both ; text-align: center } .align-right { text-align: right } /* reset inner alignment in figures */ div.align-right { text-align: inherit } /* div.align-center * { */ /* text-align: left } */ ol.simple, ul.simple { margin-bottom: 1em } ol.arabic { list-style: decimal } ol.loweralpha { list-style: lower-alpha } ol.upperalpha { list-style: upper-alpha } ol.lowerroman { list-style: lower-roman } ol.upperroman { list-style: upper-roman } p.attribution { text-align: right ; margin-left: 50% } p.caption { font-style: italic } p.credits { font-style: italic ; font-size: smaller } p.label { white-space: nowrap } p.rubric { font-weight: bold ; font-size: larger ; color: maroon ; text-align: center } p.sidebar-title { font-family: sans-serif ; font-weight: bold ; font-size: larger } p.sidebar-subtitle { font-family: sans-serif ; font-weight: bold } p.topic-title { font-weight: bold } pre.address { margin-bottom: 0 ; margin-top: 0 ; font: inherit } pre.literal-block, pre.doctest-block, pre.math { margin-left: 2em ; margin-right: 2em } span.classifier { font-family: sans-serif ; font-style: oblique } span.classifier-delimiter { font-family: sans-serif ; font-weight: bold } span.interpreted { font-family: sans-serif } span.option { white-space: nowrap } span.pre { white-space: pre } span.problematic { color: red } span.section-subtitle { /* font-size relative to parent (h1..h6 element) */ font-size: 80% } table.citation { border-left: solid 1px gray; margin-left: 1px } table.docinfo { margin: 2em 4em } table.docutils { margin-top: 0.5em ; margin-bottom: 0.5em } table.footnote { border-left: solid 1px black; margin-left: 1px } table.docutils td, table.docutils th, table.docinfo td, table.docinfo th { padding-left: 0.5em ; padding-right: 0.5em ; vertical-align: top } table.docutils th.field-name, table.docinfo th.docinfo-name { font-weight: bold ; text-align: left ; white-space: nowrap ; padding-left: 0 } h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { font-size: 100% } ul.auto-toc { list-style-type: none } </style> </head> <body> <div class="document" id="serialisation-of-queries-and-documents"> <h1 class="title">Serialisation of Queries and Documents</h1> <!-- Copyright (C) 2009 Lemur Consulting Ltd --> <!-- Copyright (C) 2009 Olly Betts --> <div class="contents topic" id="table-of-contents"> <p class="topic-title first">Table of contents</p> <ul class="simple"> <li><a class="reference internal" href="#introduction" id="id1">Introduction</a></li> <li><a class="reference internal" href="#serialising-documents" id="id2">Serialising Documents</a></li> <li><a class="reference internal" href="#serialising-queries" id="id3">Serialising Queries</a></li> </ul> </div> <div class="section" id="introduction"> <h1><a class="toc-backref" href="#id1">Introduction</a></h1> <p>In order to pass Query and Document objects to or from remote databases, Xapian includes support for serialising these objects to strings, and then converting these strings back into objects. This support may be accessed directly, and used for storing persistent representations of Query and Document objects.</p> <p>Be aware that the serialised representation may occasionally change between releases. This will be clearly noted in the release notes.</p> </div> <div class="section" id="serialising-documents"> <h1><a class="toc-backref" href="#id2">Serialising Documents</a></h1> <p>To get a serialised document, simply call the <tt class="docutils literal"><span class="pre">Document::serialise()</span></tt> method on the instance of the document:</p> <pre class="literal-block"> std::string serialise() const; </pre> <p>Documents are often lazily fetched from databases: this method will first force the full document contents to be fetched from the database, in order to serialise them. The serialised document will have identical contents (data, terms, positions, values) to the original document.</p> <p>To get a document from a serialised form, call the static <tt class="docutils literal"><span class="pre">Document::unserialise()</span></tt> method, passing it the string returned from <tt class="docutils literal">serialise()</tt>:</p> <pre class="literal-block"> static Document unserialise(const std::string &s); </pre> </div> <div class="section" id="serialising-queries"> <h1><a class="toc-backref" href="#id3">Serialising Queries</a></h1> <p>Serialisation of queries is very similar to serialisation of documents: there is a <tt class="docutils literal"><span class="pre">Query::serialise()</span></tt> method to produce a serialised Query, and a corresponding <tt class="docutils literal"><span class="pre">Query::unserialise()</span></tt> method to produce a Query from a serialised representation:</p> <pre class="literal-block"> std::string serialise() const; static Query unserialise(const std::string &s); </pre> <p>However, there is a wrinkle. Queries can contain arbitrary user-defined PostingSource subqueries. In order to serialise and unserialise such queries, all the PostingSource subclasses used in the query must implement the <tt class="docutils literal">name()</tt>, <tt class="docutils literal">serialise()</tt> and <tt class="docutils literal">unserialise()</tt> methods (see the <a class="reference external" href="postingsource.html">postingsource topic document</a> for details of these). In addition, a special form of unserialise must be used:</p> <pre class="literal-block"> static Query unserialise(const std::string & s, const Registry & registry); </pre> <p>The <tt class="docutils literal">Registry</tt> passed to this method must know about all the custom posting sources used in the query. You can tell a Registry about a custom posting source using the <tt class="docutils literal"><span class="pre">Registry::register_posting_source</span></tt> method:</p> <pre class="literal-block"> void register_posting_source(const Xapian::PostingSource &source); </pre> <p>Note that Registry objects always know about built-in posting sources (such as <tt class="docutils literal">ValueWeightPostingSource</tt>), so you don't need to call <tt class="docutils literal">register_posting_source()</tt> for them.</p> </div> </div> </body> </html>