/*
* ToroDB
* Copyright © 2014 8Kdata Technology (www.8kdata.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.torodb.d2r;
import static org.junit.Assert.*;
import com.google.common.collect.Lists;
import com.torodb.core.TableRef;
import com.torodb.core.TableRefFactory;
import com.torodb.core.d2r.DocPartResult;
import com.torodb.core.d2r.R2DTranslator;
import com.torodb.core.document.ToroDocument;
import com.torodb.core.impl.TableRefFactoryImpl;
import com.torodb.core.transaction.metainf.FieldType;
import com.torodb.kvdocument.values.KvArray;
import com.torodb.kvdocument.values.KvDocument;
import com.torodb.kvdocument.values.KvNull;
import com.torodb.kvdocument.values.KvValue;
import org.junit.Test;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class R2DTranslatorTest {
private TableRefFactory fact = new TableRefFactoryImpl();
private TableRef rootRef = fact.createRoot();
private static final boolean IsArray = true;
private static final boolean IsDocument = false;
/*
* Document: { "name" : "jero" }
*/
@Test
public void readSimpleDocument() {
MetaDocPartBuilder builder = new MetaDocPartBuilder(rootRef);
builder.addMetaField("name", "name_s", FieldType.STRING);
builder.addRow(1, null, 1, null, "jero");
DocPartResult root = builder.getResultSet();
List<DocPartResult> lst = Collections.singletonList(root);
R2DTranslator r2dTranslator = new R2DTranslatorImpl();
Collection<ToroDocument> readedDocuments = r2dTranslator.translate(lst.iterator());
assertEquals(1, readedDocuments.size());
KvDocument doc = readedDocuments.iterator().next().getRoot();
assertEquals("jero", doc.get("name").getValue());
}
/*
* Document: { "name" : "jero", "address" : null }
*/
@Test
public void readDocumentWithNullField() {
MetaDocPartBuilder builder = new MetaDocPartBuilder(rootRef);
builder.addMetaField("name", "name_s", FieldType.STRING);
builder.addMetaField("address", "address_s", FieldType.STRING);
builder.addMetaField("address", "address_n", FieldType.NULL);
builder.addRow(1, null, 1, null, "jero", null, true);
MockedDocPartResult root = builder.getResultSet();
List<DocPartResult> lst = Collections.singletonList(root);
R2DTranslator r2dTranslator = new R2DTranslatorImpl();
Collection<ToroDocument> readedDocuments = r2dTranslator.translate(lst.iterator());
assertEquals(1, readedDocuments.size());
KvDocument doc = readedDocuments.iterator().next().getRoot();
assertEquals("jero", doc.get("name").getValue());
assertEquals(KvNull.getInstance(), doc.get("address"));
}
/*
* Document: { "name" : "jero" }
*/
@Test
public void readDocumentWithOutPresentFields() {
MetaDocPartBuilder builder = new MetaDocPartBuilder(rootRef);
builder.addMetaField("name", "name_s", FieldType.STRING);
builder.addMetaField("address", "address_s", FieldType.STRING);
builder.addRow(1, null, 1, null, "jero", null);
MockedDocPartResult root = builder.getResultSet();
List<DocPartResult> lst = Collections.singletonList(root);
R2DTranslator r2dTranslator = new R2DTranslatorImpl();
Collection<ToroDocument> readedDocuments = r2dTranslator.translate(lst.iterator());
assertEquals(1, readedDocuments.size());
KvDocument doc = readedDocuments.iterator().next().getRoot();
assertEquals("jero", doc.get("name").getValue());
assertNull(doc.get("address"));
}
/*
* Document: { "name" : "jero", "address" : "my home", "age" : 25 }
*/
@Test
public void readDocumentWithMultipleFields() {
MetaDocPartBuilder builder = new MetaDocPartBuilder(rootRef);
builder.addMetaField("name", "name_s", FieldType.STRING);
builder.addMetaField("address", "address_s", FieldType.STRING);
builder.addMetaField("age", "age_i", FieldType.INTEGER);
builder.addRow(1, null, 1, null, "jero", "my home", 25);
MockedDocPartResult root = builder.getResultSet();
List<DocPartResult> lst = Collections.singletonList(root);
R2DTranslator r2dTranslator = new R2DTranslatorImpl();
Collection<ToroDocument> readedDocuments = r2dTranslator.translate(lst.iterator());
assertEquals(1, readedDocuments.size());
KvDocument doc = readedDocuments.iterator().next().getRoot();
assertEquals("jero", doc.get("name").getValue());
assertEquals("my home", doc.get("address").getValue());
assertEquals(25, doc.get("age").getValue());
}
/*
* Document 1 { "name" : "jero" } Document 2 { "name" : "john" }
*/
@Test
public void readMultipleDocument() {
MetaDocPartBuilder builder = new MetaDocPartBuilder(rootRef);
builder.addMetaField("name", "name_s", FieldType.STRING);
builder.addRow(1, null, 1, null, "jero");
builder.addRow(2, null, 2, null, "john");
MockedDocPartResult root = builder.getResultSet();
List<DocPartResult> lst = Collections.singletonList(root);
R2DTranslator r2dTranslator = new R2DTranslatorImpl();
ToroDocument[] readedDocuments = r2dTranslator.translate(lst.iterator()).toArray(
new ToroDocument[0]);
assertEquals(2, readedDocuments.length);
KvDocument doc1 = readedDocuments[0].getRoot();
assertEquals("jero", doc1.get("name").getValue());
KvDocument doc2 = readedDocuments[1].getRoot();
assertEquals("john", doc2.get("name").getValue());
}
/*
* Document: { "name" : "jero", "address" : { "street" : "myhouse" } }
*/
@Test
public void readTwoLevelDocument() {
/*
* Root Level
*/
MetaDocPartBuilder builder = new MetaDocPartBuilder(rootRef);
builder.addMetaField("name", "name_s", FieldType.STRING);
builder.addMetaField("address", "address_e", FieldType.CHILD);
builder.addRow(1, null, 1, null, "jero", IsDocument);
MockedDocPartResult root = builder.getResultSet();
/*
* Second Level
*/
TableRef secondRef = fact.createChild(rootRef, "address");
MetaDocPartBuilder secondBuilder = new MetaDocPartBuilder(secondRef);
secondBuilder.addMetaField("street", "street_s", FieldType.STRING);
secondBuilder.addRow(1, 1, 20, null, "myhouse");
MockedDocPartResult secondLevel = secondBuilder.getResultSet();
List<DocPartResult> lst = Lists.newArrayList(secondLevel, root);
R2DTranslator r2dTranslator = new R2DTranslatorImpl();
Collection<ToroDocument> readedDocuments = r2dTranslator.translate(lst.iterator());
assertEquals(1, readedDocuments.size());
KvDocument doc = readedDocuments.iterator().next().getRoot();
assertEquals("jero", doc.get("name").getValue());
KvValue<?> kvValue = doc.get("address");
assertTrue(kvValue instanceof KvDocument);
}
/*
* Document: { "name" : "jero", "numbers" : [4, 8, 15, 16] }
*/
@Test
public void readInnerArray() {
/*
* Root Level
*/
MetaDocPartBuilder builder = new MetaDocPartBuilder(rootRef);
builder.addMetaField("name", "name_s", FieldType.STRING);
builder.addMetaField("numbers", "numbers_e", FieldType.CHILD);
builder.addRow(1, null, 1, null, "jero", IsArray);
MockedDocPartResult root = builder.getResultSet();
/*
* Second Level
*/
TableRef secondRef = fact.createChild(rootRef, "numbers");
MetaDocPartBuilder secondBuilder = new MetaDocPartBuilder(secondRef);
secondBuilder.addMetaScalar("v_i", FieldType.INTEGER);
secondBuilder.addRow(1, 1, 20, 0, 4);
secondBuilder.addRow(1, 1, 21, 1, 8);
secondBuilder.addRow(1, 1, 23, 2, 15);
secondBuilder.addRow(1, 1, 24, 3, 16);
MockedDocPartResult secondLevel = secondBuilder.getResultSet();
List<DocPartResult> lst = Lists.newArrayList(secondLevel, root);
R2DTranslator r2dTranslator = new R2DTranslatorImpl();
Collection<ToroDocument> readedDocuments = r2dTranslator.translate(lst.iterator());
assertEquals(1, readedDocuments.size());
KvDocument doc = readedDocuments.iterator().next().getRoot();
assertEquals("jero", doc.get("name").getValue());
KvValue<?> kvValue = doc.get("numbers");
assertTrue(kvValue instanceof KvArray);
KvArray array = (KvArray) kvValue;
assertEquals(4, array.size());
assertEquals(4, array.get(0).getValue());
assertEquals(8, array.get(1).getValue());
assertEquals(15, array.get(2).getValue());
assertEquals(16, array.get(3).getValue());
}
/*
* Document: { "name" : "jero", "numbers" : [666, [4,8, 15, 16]] }
*/
@Test
public void readTwoInnerArray() {
int did = 1;
/*
* Root Level
*/
MetaDocPartBuilder builder = new MetaDocPartBuilder(rootRef);
builder.addMetaField("name", "name_s", FieldType.STRING);
builder.addMetaField("numbers", "numbers_e", FieldType.CHILD);
builder.addRow(did, null, did, null, "jero", IsArray);
MockedDocPartResult root = builder.getResultSet();
/*
* Second Level
*/
int pid = did;
TableRef secondRef = fact.createChild(rootRef, "numbers");
MetaDocPartBuilder secondBuilder = new MetaDocPartBuilder(secondRef);
secondBuilder.addMetaScalar("v_i", FieldType.INTEGER);
secondBuilder.addMetaScalar("v_e", FieldType.CHILD);
secondBuilder.addRow(did, pid, 20, 0, 666, null);
secondBuilder.addRow(did, pid, 21, 1, null, IsArray);
MockedDocPartResult secondLevel = secondBuilder.getResultSet();
/*
* Third Level
*/
int pid1 = 21;
TableRef thirdRef = fact.createChild(secondRef, 2);
MetaDocPartBuilder thirdBuilder = new MetaDocPartBuilder(thirdRef);
thirdBuilder.addMetaScalar("v_i", FieldType.INTEGER);
thirdBuilder.addRow(did, pid1, 30, 0, 4);
thirdBuilder.addRow(did, pid1, 31, 1, 8);
thirdBuilder.addRow(did, pid1, 33, 2, 15);
thirdBuilder.addRow(did, pid1, 34, 3, 16);
MockedDocPartResult thirdLevel = thirdBuilder.getResultSet();
List<DocPartResult> lst = Lists.newArrayList(
thirdLevel,
secondLevel,
root);
R2DTranslator r2dTranslator = new R2DTranslatorImpl();
Collection<ToroDocument> readedDocuments = r2dTranslator.translate(lst.iterator());
assertEquals(1, readedDocuments.size());
KvDocument doc = readedDocuments.iterator().next().getRoot();
assertEquals("jero", doc.get("name").getValue());
KvValue<?> kvValue = doc.get("numbers");
assertTrue(kvValue instanceof KvArray);
KvArray array = (KvArray) kvValue;
assertEquals(2, array.size());
assertEquals(666, array.get(0).getValue());
KvValue<?> kvValueSecond = array.get(1);
assertNotNull(kvValueSecond);
assertTrue(kvValueSecond instanceof KvArray);
KvArray array2 = (KvArray) kvValueSecond;
assertEquals(4, array2.size());
assertEquals(4, array2.get(0).getValue());
assertEquals(8, array2.get(1).getValue());
assertEquals(15, array2.get(2).getValue());
assertEquals(16, array2.get(3).getValue());
}
/*
* Document: { "name" : "jero", "numbers" : [ 666, { "address": "myhome" } ] }
*/
@Test
public void readDocumentInArray() {
int did = 1;
/*
* Root Level
*/
MetaDocPartBuilder builder = new MetaDocPartBuilder(rootRef);
builder.addMetaField("name", "name_s", FieldType.STRING);
builder.addMetaField("numbers", "numbers_e", FieldType.CHILD);
builder.addRow(did, null, did, null, "jero", IsArray);
MockedDocPartResult root = builder.getResultSet();
/*
* Second Level
*/
int pid = did;
TableRef secondRef = fact.createChild(rootRef, "numbers");
MetaDocPartBuilder secondBuilder = new MetaDocPartBuilder(secondRef);
secondBuilder.addMetaScalar("v_i", FieldType.INTEGER);
secondBuilder.addMetaField("address", "address_s", FieldType.STRING);
secondBuilder.addRow(did, pid, 20, 0, 666, null);
secondBuilder.addRow(did, pid, 21, 1, null, "myhome");
MockedDocPartResult secondLevel = secondBuilder.getResultSet();
List<DocPartResult> lst = Lists.newArrayList(
secondLevel,
root);
R2DTranslator r2dTranslator = new R2DTranslatorImpl();
Collection<ToroDocument> readedDocuments = r2dTranslator.translate(lst.iterator());
assertEquals(1, readedDocuments.size());
KvDocument doc = readedDocuments.iterator().next().getRoot();
assertEquals("jero", doc.get("name").getValue());
KvValue<?> kvValue = doc.get("numbers");
assertTrue(kvValue instanceof KvArray);
KvArray array = (KvArray) kvValue;
assertEquals(2, array.size());
assertEquals(666, array.get(0).getValue());
KvValue<?> kvValueSecond = array.get(1);
assertNotNull(kvValueSecond);
assertTrue(kvValueSecond instanceof KvDocument);
KvDocument doc2 = (KvDocument) kvValueSecond;
assertEquals("myhome", doc2.get("address").getValue());
}
}