<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Finding and Fixing Type Mismatches in the Evolution of Object-NoSQL Mappings</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Stefanie</forename><surname>Scherzinger</surname></persName>
							<email>stefanie.scherzinger-@oth-regensburg.de</email>
							<affiliation key="aff0">
								<orgName type="institution">OTH Regensburg</orgName>
								<address>
									<country key="DE">Germany</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Eduardo</forename><surname>Cunha</surname></persName>
							<email>eduardo@inf.ufpr.br</email>
							<affiliation key="aff1">
								<orgName type="department">de Almeida UFPR</orgName>
								<address>
									<country key="BR">Brazil</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Thomas</forename><surname>Cerqueus</surname></persName>
							<email>thomas.cerqueus@insa-lyon.fr</email>
							<affiliation key="aff2">
								<orgName type="institution">University of Lyon</orgName>
								<address>
									<country key="FR">France</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Leandro</forename><surname>Batista</surname></persName>
							<email>leandro@dainf.ct.utfpr.edu.br</email>
							<affiliation key="aff3">
								<orgName type="institution">Almeida UTFPR</orgName>
								<address>
									<country key="BR">Brazil</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Pedro</forename><surname>Holanda</surname></persName>
							<email>ptholanda@inf.ufpr.br</email>
							<affiliation key="aff4">
								<orgName type="institution">UFPR</orgName>
								<address>
									<country key="BR">Brazil</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">Finding and Fixing Type Mismatches in the Evolution of Object-NoSQL Mappings</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">125BCF57384EDE1C1E2C31228611A836</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-23T21:39+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>NoSQL data stores are popular backends for managing big data that is evolving over time: Due to their schema-flexibility, a new release of the application does not require a full migration of data already persisted in production. Instead, using object-NoSQL mappers, developers can specify lazy data migrations that are executed on-the-fly, when a legacy entity is loaded into the application. This paper features ControVol, an IDE plugin that tracks evolutionary changes in object-NoSQL mappings, such as adding, renaming, or removing an attribute, which may conflict with entities already persisted in production. If not resolved prior to launch of the new application, harmful evolutionary changes can cause runtime exceptions or data loss. In this demo, we focus on a novel feature of ControVol, detecting changes to attribute types that are not backwards-compatible with legacy entities. When such changes occur, ControVol issues warnings, and upon the request of developers, assists in safely carrying out type changes.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1.">INTRODUCTION</head><p>Over the past years, application development for big data management with NoSQL data stores has matured: Developers no longer need to code against proprietary APIs. Instead, object-NoSQL mappers introduce a desirable level of abstraction <ref type="bibr" target="#b15">[15]</ref>. Like their counterparts for relational databases, object-NoSQL mappers such as Objectify <ref type="bibr" target="#b9">[9]</ref>, Morphia <ref type="bibr" target="#b8">[8]</ref>, or Hibernate OGM <ref type="bibr" target="#b5">[5]</ref> marshal and unmarshal between stored entities and objects in the application space. Annotated Java classes, the object-NoSQL mappings, declare how objects are to be persisted as entities.</p><p>Going beyond this core business, Objectify and Morphia enhance a key feature of NoSQL data stores in agile software development: the schema-flexibility of NoSQL backends <ref type="bibr" target="#b7">[7]</ref>. Let us consider a standard development environment with an editor (e.g., an IDE like Eclipse) and a code repository. The production environment contains a schema-flexible No-SQL data store, possibly offered as database-as-a-service (DaaS). A platform-as-a-service infrastructure (PaaS) takes care of the load balancing at runtime. As the data store does not enforce a schema, the entities stored by different releases of the application may differ in their structure. Nevertheless, the NoSQL data store is capable of evaluating queries over the structurally heterogeneous entities.</p><p>We now switch to a real-life example. Figure <ref type="figure">1</ref> visualizes schema evolution in the object-NoSQL mappings of the open source project ExtraLeague <ref type="bibr" target="#b3">[3]</ref>. ExtraLeague implements a small website for managing company-internal soccer championships. This project is written in Java, uses Google App Engine (as PaaS) and Google Cloud Datastore (as DaaS) <ref type="bibr" target="#b10">[10]</ref>, as well as the object-NoSQL mapper Objectify. At the point of writing this paper, 9 contributors have collectively made about 700 commits to this project hosted on GitHub. The chart reads as follows. The x-axis shows the number of commits to the project, which may be interpreted as the progress in time. The y-axis shows the number of object-NoSQL mappings (i.e., the Java classes that de-Figure <ref type="figure">1</ref>: Schema evolution in ExtraLeague <ref type="bibr" target="#b3">[3]</ref>. { "kind": "Player", "id":</p><p>1, "name": "Gollum", "health": "poor" } { "kind": "Player", "id": 2, "name": "Bilbo", "health": 5 } { "kind": "Player", "id": 3, "name": "Frodo", "health":  clare the current data model). Over time, the project grows to 13 mappings. Some object-NoSQL mappings are removed from the project, resulting in interim dips in the chart. At any point in time, the chart states how many classes remain unchanged ("Attrs not modified"). If a mapping contains at least one retyped attribute, it is flagged as such ("Attrs retyped"). Otherwise, if it contains at least one removed attribute, it is also flagged accordingly ("Attrs removed"). Finally, when attributes have been added, but none of the other cases apply, the mapping is flagged as such ("Attrs added"). Thus, we classify the object-NoSQL mappings by their most disruptive schema change.</p><p>In total, the object-NoSQL mappings have changed in 47 commits. When the object-NoSQL mappings change with a new release, this effectively amounts to a schema change. Yet rather than migrating all legacy entities prior to a release, legacy entities may be migrated lazily, when they are loaded into the application, one at a time. This is supported by several object-NoSQL mappers, such as Objectify.</p><p>Lazily evolving an entity by adding an attribute is generally a safe operation: When a legacy entity is loaded into the application, the attribute is added as the entity is mapped to a Java object. When the object is saved again, the entity is persisted with the new attribute.</p><p>However, when attributes are removed, renamed, or retyped, the object-NoSQL mappings may no longer be backwards-compatible with legacy entities. Accidental removal or faulty renamings of attributes lead to runtime problems, a topic we have addressed in an earlier paper on ControVol <ref type="bibr" target="#b2">[2]</ref>.</p><p>In this paper, we focus on attribute retypings, which also occur in Figure <ref type="figure">1</ref>. Retypings can lead to 1. data loss (due to implicit type conversions), 2. runtime exceptions (due to type incompatibilities), and 3. confusing query results (due to the lack of standardization of NoSQL query languages). These runtime issues may only be sporadic: The production data store may contain only a small number of structural outliers that nobody in the development team is aware of. Yet this makes trouble shooting even more difficult. Therefore, systematic tool support is of the essence.</p><p>Contributions: In this demonstration, we present new ControVol features for (1) finding type mismatches in the evolution of object-NoSQL mappings, (2) addressing the subtleties that retyping can have on query evaluation in some NoSQL data stores, and (3) suggesting quick fixes so that developers may pro-actively address these problems. Our earlier demos of ControVol <ref type="bibr" target="#b1">[1,</ref><ref type="bibr" target="#b11">11]</ref> showed how ControVol finds and fixes issues caused by the removal and renaming of attributes in object-NoSQL mappings. This earlier ver-sion would also warn when attributes were retyped, but then forced the developer to restore the original type. This effectively made it impossible to change attribute types. Contro-Vol, as presented in this paper, actually enables developers to change types in a controlled manner.</p><p>Videos and further information on ControVol are available at https://sites.google.com/site/controvolplugin/.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.">TYPE MISMATCHES BY EXAMPLE</head><p>In discussing mismatched types, we focus on Java primitive types<ref type="foot" target="#foot_0">1</ref> : Boolean, Byte, Short, Integer, Long, Float, Double, and String. ControVol may be extended to handle structured types as well.</p><p>We next consider the scenarios featured in this demo. Figure <ref type="figure" target="#fig_2">2</ref> shows player entities stored by different releases of an online role playing game. It also shows the object-NoSQL mapping of the current release. The object mapper annotation @Entity declares that player objects may be stored. Annotation @Id marks the unique ID among all players.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.1">Runtime Errors due to Type Changes</head><p>Our upcoming example illustrates how mismatched types can cause runtime errors. As runtime errors are particularly undesirable in web applications, the underlying problem should be addressed prior to launch. We then describe how ControVol finds and fixes these issues.</p><p>Example 1. The legacy entity for player Gollum in Figure <ref type="figure" target="#fig_2">2</ref>(a) records Gollum's health as a String. Let us assume Gollum's player has been stored several releases back, when health was classified as "poor", "fair", or "excellent". Much has changed since then: The object-NoSQL mapping in Figure <ref type="figure" target="#fig_2">2</ref>(d) expects to load a Double value. Thus, loading Gollum's entity will cause a runtime exception due to an unsuccessful type cast.</p><p>2</p><p>ControVol monitors code changes from within Eclipse to detect this issue at development time. To do so, ControVol accesses the code repository and compares different versions of object-NoSQL mappings. For instance, if ControVol detects the earlier declaration shown in Figure <ref type="figure" target="#fig_3">3</ref>, then it warns about the type mismatch with the declaration in Figure <ref type="figure" target="#fig_5">2(d)</ref>. Note the warning symbol in line 10 of the screenshot, injected by ControVol.  We discuss the second quick fix in greater detail. If selected, ControVol rewrites the class as shown in Figure <ref type="figure" target="#fig_6">5</ref>: <ref type="foot" target="#foot_1">2</ref>• The original health attribute of type String has been restored. Annotation @IgnoreSave ensures that the value is loaded from legacy entities, but not saved anymore. • The new health attribute of type Double has been renamed, so as not to conflict with the legacy attribute. • A method stub for migrateHealth has been generated.</p><p>Due to the Objectify annotation @OnLoad, this method is invoked whenever a player entity is loaded. The developers may now translate the value of legacy attribute health to a Double value within migrateHealth. <ref type="foot" target="#foot_2">3</ref></p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.2">Mixed Value Types in Query Evaluation</head><p>We next give an example of the effect that attributes with mixed value types can cause during query evaluation.  out a runtime exception, since the Integer value is implicitly cast to Double (yet loss of precision is possible). However, as long as Bilbo's entity is not migrated, this type mix in the data store can produce seemingly confusing query results. For instance, evaluating the query SELECT id FROM Player ORDER BY health ASC LIMIT 10 on our entities from Figure <ref type="figure" target="#fig_2">2</ref> in Google Cloud Datastore returns Bilbo's ID before Frodo's. Yet Bilbo's health is 5, while Frodo's health is 1.2 This seems counter-intuitive given ascending sort. Worse, MongoDB returns Frodo's ID before Bilbo's for the same query.</p><p>2</p><p>This puzzling behavior is due to the lack of standardization in NoSQL query languages. In Google Cloud Datastore, all queries are evaluated over indexes. The indexes contain hierarchically sorted entries, with primary order on the value type and secondary on a type-specific ordering <ref type="bibr">[4]</ref>. Let us consider the index capturing the entities from Figure <ref type="figure" target="#fig_2">2</ref>, as well as a fourth player named Peregrin with id 4 and a Double health value of 9.9.</p><p>In displaying the index as shown in Table <ref type="table" target="#tab_0">1</ref>, we employ the visual notation from <ref type="bibr" target="#b10">[10]</ref>: Google Cloud Datastore evaluates the query from Example 2 using an index containing the keys of player entities (consisting of the kind "Player" and the player id), and the values of their health properties. These are sorted in ascending order. The index entries are sorted, with Integer values before Strings, and further before floating point values.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Key</head><p>health ↑ Player/2 5 Player/1 "poor" Player/3 1.2 Player/4 9.9 Now, retrieving all player IDs in ascending order of their health is conducted by a single scan over this index. Scanning the index from top to bottom retrieves Bilbo's ID, then Gollum's, Frodo's, and finally Peregrin's. To NoSQL novices, this may seem surprising, and understandably so: When the entities are loaded as Java objects into the application, Frodo's health value has type Double (due to the implicit type conversion on loading). This makes it particularly confusing why Bilbo with a health value of 5.0 should be sorted before Frodo with a health of 1.2. From the viewpoint of the developer, this is a puzzle that can only be solved by inspecting the raw contents of the data store.</p><p>Worse yet, this effect is product-specific: Table <ref type="table" target="#tab_1">2</ref> captures the order in which MongoDB returns the query results. Here, the sort operator returns all numeric values before strings, and hence, a different result.</p><p>Thus, even when developers aim at platform independence by using object-NoSQL mappers, the implementation details of NoSQL data stores shine through. Since such effects can be easy to miss, we have set up ControVol to warn if a change to an object-NoSQL mapping might introduce mixed value types. This gives developers a chance to react, e.g., to identify these legacy entities and to eagerly migrate them to Double values. This can be done by writing custom code or using declarative, special-purpose schema evolution languages, c.f. <ref type="bibr" target="#b12">[12,</ref><ref type="bibr" target="#b14">14]</ref>. Having made sure that incompatible legacy entities no longer exist, and having allowed the data store indexes sufficient time to be rebuilt (which happens in Google Cloud Datastore), the warning issued by ControVol may be suppressed.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.3">Demo Outline</head><p>The general outline for our interactive demo is this:</p><p>1. We introduce the typical setup for NoSQL web development: Developers write code in the Eclipse IDE, manage its versions in Git, and regularly deploy the application to a PaaS framework (Google App Engine). The application is backed by a NoSQL data store (Google Cloud Datastore). 2. We show common pitfalls in evolving the application code: Foremost, we focus on issues introduced by type changes in object-NoSQL mappings. We also demonstrate the earlier features of ControVol, such as finding problems caused by renaming or removing attributes. 3. We provoke various consequences of mismatched types: data loss, data corruption, runtime errors, and counterintuitive query results, as discussed in Section 2. Con-troVol then finds these issues and proposes quick fixes, which it carries out semi-automatically. 4. We further run ControVol on open source projects publicly hosted on GitHub, and thus, on real-life code. We discuss the impact of conflicting type declarations with our audience, as well as the tradeoffs between quick fixes.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.">SUMMARY</head><p>When it comes to assessing the potential impact of Con-troVol, we point out two current trends: First, schemaflexible NoSQL data stores are gaining popularity <ref type="bibr" target="#b7">[7]</ref>, especially in agile web development: When projects undergo frequent releases and cannot afford downtime due to a release, NoSQL data stores can be suitable backends. Second, object-NoSQL mappers with support for lazy migration are gaining popularity. Among the currently popular libraries, there are Objectify for Google Cloud Datastore, and Morphia for MongoDB. The future roadmap for Hibernate OGM explicitly mentions similar plans for lazy data migration <ref type="bibr" target="#b6">[6]</ref>. Thus, there seems to be a trend for vendors of object-NoSQL mappers to provide annotation-based support for data migration. Looking at both trends, we see a growing market for tools like ControVol, especially considering the gaping void when it comes to a tooling eco-system for NoSQL-backed application development.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>c</head><label></label><figDesc>2016, Copyright is with the authors. Published in the Workshop Pro- ceedings of the EDBT/ICDT 2016 Joint Conference (March 15, 2016, Bordeaux, France) on CEUR-WS.org (ISSN 1613-0073). Distribution of this paper is permitted under the terms of the Creative Commons license CCby-nc-nd 4.0</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head></head><label></label><figDesc>Up-to-date entity with Double-typed health (d) Class Player declaring the health type as Double</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>Figure 2 :</head><label>2</label><figDesc>Figure 2: (a) -(c) Legacy entities (in JSON format) and (d) the current object-NoSQL mapping.</figDesc><graphic coords="2,434.88,63.55,116.48,59.58" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head>Figure 3 :</head><label>3</label><figDesc>Figure 3: Legacy object-NoSQL mapping by which Gollum's entity from Figure 2(a) was persisted.</figDesc><graphic coords="3,88.98,163.93,168.75,158.50" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head>Figure 4 :</head><label>4</label><figDesc>Figure 4: Quick fixes proposed by ControVol.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_5"><head>Example 2 .</head><label>2</label><figDesc>The entity for legacy player Bilbo in Figure 2(b) can be loaded by the mapping in Figure 2(d) with-</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_6"><head>Figure 5 :</head><label>5</label><figDesc>Figure 5: ControVol-generated code stub.</figDesc><graphic coords="3,326.61,53.80,219.50,134.00" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_0"><head>Table 1 :</head><label>1</label><figDesc>Datastore.</figDesc><table><row><cell>Key</cell><cell>health ↑</cell></row><row><cell cols="2">Player/3 1.2</cell></row><row><cell cols="2">Player/2 5</cell></row><row><cell cols="2">Player/4 9.9</cell></row><row><cell cols="2">Player/1 "poor"</cell></row></table></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_1"><head>Table 2 :</head><label>2</label><figDesc>MongoDB.    </figDesc><table /></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="1" xml:id="foot_0">We use the term primitive type casually, to refer to classes of the java.lang package that wrap Java primitive types (int, long, float, etc.). Void, Character, and Object are currently not considered by ControVol, as Objectify does not support storing values of these types.</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="2" xml:id="foot_1">In Figure5, we use the Objectify syntax @OnLoad. As the annotations are not standardized for object-NoSQL mappers, we require different annotations when using a different object-NoSQL mapper. ControVol is currently being extended to support Morphia as</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="3" xml:id="foot_2">well.<ref type="bibr" target="#b3">3</ref> Lazy migration using object-NoSQL mappers can be very convenient for small, incremental schema changes. Yet when object-NoSQL mappings need to be compatible with entities from several releases back, their declarations become cluttered with migration code. We refer to<ref type="bibr" target="#b13">[13]</ref> for a proposal on how multi-step lazy migration may be realized outside of the application layer.</note>
		</body>
		<back>

			<div type="acknowledgement">
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Acknowledgments</head><p>ControVol was partly funded by CNPq grant 441944/2014-0. We thank Tegawendé F. Bissyandé from University of Luxembourg for suggesting to us to crawl GitHub projects. We further thank Uta Störl from Darmstadt University of Applied Sciences for sharing her insights on queries over mixed value types in MongoDB. Last but not least, we thank the anonymous reviewers for the careful reading of our paper and their helpful suggestions.</p></div>
			</div>

			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<monogr>
		<title/>
		<author>
			<persName><surname>References</surname></persName>
		</author>
		<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">ControVol: Let yesterday&apos;s data catch up with today&apos;s application code</title>
		<author>
			<persName><forename type="first">T</forename><surname>Cerqueus</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Cunha De Almeida</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Scherzinger</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. WWW&apos;15</title>
				<meeting>WWW&apos;15</meeting>
		<imprint>
			<date type="published" when="2015">2015</date>
		</imprint>
	</monogr>
	<note>poster</note>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">Safely Managing Data Variety in Big Data Software Development</title>
		<author>
			<persName><forename type="first">T</forename><surname>Cerqueus</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Cunha De Almeida</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Scherzinger</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. BIGDSE&apos;15</title>
				<meeting>BIGDSE&apos;15</meeting>
		<imprint>
			<date type="published" when="2015">2015</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<monogr>
		<title/>
		<author>
			<persName><surname>Extraleague</surname></persName>
		</author>
		<ptr target="http://ncaleague-test.appspot.com" />
		<imprint>
			<date type="published" when="2015-09">Sept. 2015</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<monogr>
		<ptr target="https://cloud.google.com/appengine/docs/java/datastore/indexes/#Java_Properties_with_mixed_value_types" />
		<title level="m">Google Cloud Platform</title>
				<imprint>
			<date type="published" when="2016-01">Jan. 2016</date>
		</imprint>
	</monogr>
	<note>Datastore Indexes</note>
</biblStruct>

<biblStruct xml:id="b5">
	<monogr>
		<title/>
		<author>
			<persName><forename type="first">Ogm</forename><surname>Hibernate</surname></persName>
		</author>
		<ptr target="http://hibernate.org/ogm/" />
		<imprint>
			<date type="published" when="2016-01">Jan. 2016</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<monogr>
		<title level="m" type="main">Hibernate OGM Roadmap for Hibernate OGM 5</title>
		<ptr target="http://hibernate.org/ogm/roadmap/" />
		<imprint>
			<date type="published" when="2016-01">Jan. 2016</date>
			<biblScope unit="volume">0</biblScope>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">Management of Flexible Schema Data in RDBMSs -Opportunities and Limitations for NoSQL</title>
		<author>
			<persName><forename type="first">Z</forename><forename type="middle">H</forename><surname>Liu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Gawlick</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">CIDR&apos;</title>
				<imprint>
			<date type="published" when="2015">2015</date>
			<biblScope unit="volume">15</biblScope>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<monogr>
		<title/>
		<author>
			<persName><surname>Morphia</surname></persName>
		</author>
		<ptr target="https://github.com/mongodb/morphia/" />
		<imprint>
			<date type="published" when="2016-01">Jan. 2016</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<monogr>
		<title/>
		<author>
			<persName><surname>Objectify</surname></persName>
		</author>
		<ptr target="https://github.com/objectify/objectify" />
		<imprint>
			<date type="published" when="2016-01">Jan. 2016</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<monogr>
		<title level="m" type="main">Programming Google App Engine with Java</title>
		<author>
			<persName><forename type="first">D</forename><surname>Sanderson</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2015">2015</date>
			<publisher>O&apos;Reilly Media, Inc</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<analytic>
		<title level="a" type="main">ControVol: A Framework for Controlled Schema Evolution in NoSQL Application Development</title>
		<author>
			<persName><forename type="first">S</forename><surname>Scherzinger</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Cunha De Almeida</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Cerqueus</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. ICDE&apos;15</title>
				<meeting>ICDE&apos;15</meeting>
		<imprint>
			<date type="published" when="2015">2015</date>
		</imprint>
	</monogr>
	<note>demo paper</note>
</biblStruct>

<biblStruct xml:id="b12">
	<analytic>
		<title level="a" type="main">Managing Schema Evolution in NoSQL Data Stores</title>
		<author>
			<persName><forename type="first">S</forename><surname>Scherzinger</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Klettke</surname></persName>
		</author>
		<author>
			<persName><forename type="first">U</forename><surname>Störl</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. DBPL&apos;13</title>
				<meeting>DBPL&apos;13</meeting>
		<imprint>
			<date type="published" when="2013">2013</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b13">
	<analytic>
		<title level="a" type="main">A Datalog-based Protocol for Lazy Data Migration in Agile NoSQL Application Development</title>
		<author>
			<persName><forename type="first">S</forename><surname>Scherzinger</surname></persName>
		</author>
		<author>
			<persName><forename type="first">U</forename><surname>Störl</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Klettke</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. DBPL&apos;15</title>
				<meeting>DBPL&apos;15</meeting>
		<imprint>
			<date type="published" when="2015">2015</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b14">
	<analytic>
		<title level="a" type="main">NotaQL is not a Query Language! It&apos;s for Data Transformation on Wide-Column Stores</title>
		<author>
			<persName><forename type="first">J</forename><surname>Schildgen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Deßloch</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. BICOD&apos;</title>
				<meeting>BICOD&apos;</meeting>
		<imprint>
			<date type="published" when="2015">2015</date>
			<biblScope unit="volume">15</biblScope>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b15">
	<analytic>
		<title level="a" type="main">Schemaless NoSQL Data Stores -Object-NoSQL Mappers to the Rescue?</title>
		<author>
			<persName><forename type="first">U</forename><surname>Störl</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Hauf</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Klettke</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Scherzinger</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. BTW&apos;15</title>
				<meeting>BTW&apos;15</meeting>
		<imprint>
			<date type="published" when="2015">2015</date>
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
