/*
* Copyright 2010-2012 Luca Garulli (l.garulli--at--orientechnologies.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.orientechnologies.orient.test.database.auto;
import com.orientechnologies.orient.core.db.ODatabase;
import com.orientechnologies.orient.core.db.record.OIdentifiable;
import com.orientechnologies.orient.core.db.record.OTrackedList;
import com.orientechnologies.orient.core.db.record.ridbag.ORidBag;
import com.orientechnologies.orient.core.exception.OSerializationException;
import com.orientechnologies.orient.core.id.ORID;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.serialization.serializer.OJSONWriter;
import com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerJSON;
import com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerSchemaAware2CSV;
import com.orientechnologies.orient.core.sql.OCommandSQL;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import com.orientechnologies.orient.core.util.ODateHelper;
import com.orientechnologies.orient.object.db.OObjectDatabaseTx;
import org.testng.Assert;
import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import java.util.*;
import java.util.regex.Pattern;
@SuppressWarnings("unchecked")
@Test
public class JSONTest extends DocumentDBBaseTest {
@Parameters(value = "url")
public JSONTest(@Optional final String iURL) {
super(iURL);
}
@Test
public void testAlmostLink() {
ODocument doc = new ODocument();
doc.fromJSON("{'title': '#330: Dollar Coins Are Done'}");
}
@Test
public void testNullList() throws Exception {
ODocument documentSource = new ODocument();
documentSource.fromJSON("{\"list\" : [\"string\", null]}");
ODocument documentTarget = new ODocument();
documentTarget.fromStream(documentSource.toStream());
OTrackedList<Object> list = documentTarget.field("list", OType.EMBEDDEDLIST);
Assert.assertEquals(list.get(0), "string");
Assert.assertNull(list.get(1));
}
@Test
public void testNullity() {
ODocument newDoc = new ODocument();
newDoc.fromJSON("{\"gender\":{\"name\":\"Male\"},\"firstName\":\"Jack\",\"lastName\":\"Williams\"," + "\"phone\":\"561-401-3348\",\"email\":\"0586548571@example.com\",\"address\":{\"street1\":\"Smith Ave\"," + "\"street2\":null,\"city\":\"GORDONSVILLE\",\"state\":\"VA\",\"code\":\"22942\"}," + "\"dob\":\"2011-11-17 03:17:04\"}");
String json = newDoc.toJSON();
ODocument loadedDoc = new ODocument().fromJSON(json);
Assert.assertTrue(newDoc.hasSameContentOf(loadedDoc));
}
@Test
public void testEmbeddedList() {
ODocument newDoc = new ODocument();
final ArrayList<ODocument> list = new ArrayList<ODocument>();
newDoc.field("embeddedList", list, OType.EMBEDDEDLIST);
list.add(new ODocument().field("name", "Luca"));
list.add(new ODocument().field("name", "Marcus"));
String json = newDoc.toJSON();
ODocument loadedDoc = new ODocument().fromJSON(json);
Assert.assertTrue(newDoc.hasSameContentOf(loadedDoc));
Assert.assertTrue(loadedDoc.containsField("embeddedList"));
Assert.assertTrue(loadedDoc.field("embeddedList") instanceof List<?>);
Assert.assertTrue(((List<ODocument>) loadedDoc.field("embeddedList")).get(0) instanceof ODocument);
ODocument d = ((List<ODocument>) loadedDoc.field("embeddedList")).get(0);
Assert.assertEquals(d.field("name"), "Luca");
d = ((List<ODocument>) loadedDoc.field("embeddedList")).get(1);
Assert.assertEquals(d.field("name"), "Marcus");
}
@Test
public void testListToJSON() {
final ArrayList<ODocument> list = new ArrayList<ODocument>();
ODocument first = new ODocument().field("name", "Luca");
ODocument second = new ODocument().field("name", "Marcus");
list.add(first);
list.add(second);
String jsonResult = OJSONWriter.listToJSON(list, null);
ODocument doc = new ODocument();
doc.fromJSON("{\"result\": " + jsonResult + "}");
Collection<ODocument> result = doc.field("result");
Assert.assertTrue(result instanceof Collection);
Assert.assertEquals(result.size(), 2);
for (ODocument resultDoc : result) {
Assert.assertTrue(first.hasSameContentOf(resultDoc) || second.hasSameContentOf(resultDoc));
}
}
@Test
public void testEmptyEmbeddedMap() {
ODocument newDoc = new ODocument();
final Map<String, ODocument> map = new HashMap<String, ODocument>();
newDoc.field("embeddedMap", map, OType.EMBEDDEDMAP);
String json = newDoc.toJSON();
ODocument loadedDoc = new ODocument().fromJSON(json);
Assert.assertTrue(newDoc.hasSameContentOf(loadedDoc));
Assert.assertTrue(loadedDoc.containsField("embeddedMap"));
Assert.assertTrue(loadedDoc.field("embeddedMap") instanceof Map<?, ?>);
final Map<String, ODocument> loadedMap = loadedDoc.field("embeddedMap");
Assert.assertEquals(loadedMap.size(), 0);
}
@Test
public void testEmbeddedMap() {
ODocument newDoc = new ODocument();
final Map<String, ODocument> map = new HashMap<String, ODocument>();
newDoc.field("map", map);
map.put("Luca", new ODocument().field("name", "Luca"));
map.put("Marcus", new ODocument().field("name", "Marcus"));
map.put("Cesare", new ODocument().field("name", "Cesare"));
String json = newDoc.toJSON();
ODocument loadedDoc = new ODocument().fromJSON(json);
Assert.assertTrue(newDoc.hasSameContentOf(loadedDoc));
Assert.assertTrue(loadedDoc.containsField("map"));
Assert.assertTrue(loadedDoc.field("map") instanceof Map<?, ?>);
Assert.assertTrue(((Map<String, ODocument>) loadedDoc.field("map")).values().iterator().next() instanceof ODocument);
ODocument d = ((Map<String, ODocument>) loadedDoc.field("map")).get("Luca");
Assert.assertEquals(d.field("name"), "Luca");
d = ((Map<String, ODocument>) loadedDoc.field("map")).get("Marcus");
Assert.assertEquals(d.field("name"), "Marcus");
d = ((Map<String, ODocument>) loadedDoc.field("map")).get("Cesare");
Assert.assertEquals(d.field("name"), "Cesare");
}
@Test
public void testMultiLevelTypes() {
String oldDataTimeFormat = database.get(ODatabase.ATTRIBUTES.DATETIMEFORMAT).toString();
database.set(ODatabase.ATTRIBUTES.DATETIMEFORMAT, ODateHelper.DEF_DATETIME_FORMAT);
try {
ODocument newDoc = new ODocument();
newDoc.field("long", 100000000000l);
newDoc.field("date", new Date());
newDoc.field("byte", (byte) 12);
ODocument firstLevelDoc = new ODocument();
firstLevelDoc.field("long", 200000000000l);
firstLevelDoc.field("date", new Date());
firstLevelDoc.field("byte", (byte) 13);
ODocument secondLevelDoc = new ODocument();
secondLevelDoc.field("long", 300000000000l);
secondLevelDoc.field("date", new Date());
secondLevelDoc.field("byte", (byte) 14);
ODocument thirdLevelDoc = new ODocument();
thirdLevelDoc.field("long", 400000000000l);
thirdLevelDoc.field("date", new Date());
thirdLevelDoc.field("byte", (byte) 15);
newDoc.field("doc", firstLevelDoc);
firstLevelDoc.field("doc", secondLevelDoc);
secondLevelDoc.field("doc", thirdLevelDoc);
String json = newDoc.toJSON();
ODocument loadedDoc = new ODocument().fromJSON(json);
Assert.assertTrue(newDoc.hasSameContentOf(loadedDoc));
Assert.assertTrue(loadedDoc.field("long") instanceof Long);
Assert.assertEquals(((Long) newDoc.field("long")).longValue(), ((Long) loadedDoc.field("long")).longValue());
Assert.assertTrue(loadedDoc.field("date") instanceof Date);
Assert.assertTrue(loadedDoc.field("byte") instanceof Byte);
Assert.assertEquals(((Byte) newDoc.field("byte")).byteValue(), ((Byte) loadedDoc.field("byte")).byteValue());
Assert.assertTrue(loadedDoc.field("doc") instanceof ODocument);
ODocument firstDoc = loadedDoc.field("doc");
Assert.assertTrue(firstLevelDoc.hasSameContentOf(firstDoc));
Assert.assertTrue(firstDoc.field("long") instanceof Long);
Assert.assertEquals(((Long) firstLevelDoc.field("long")).longValue(), ((Long) firstDoc.field("long")).longValue());
Assert.assertTrue(firstDoc.field("date") instanceof Date);
Assert.assertTrue(firstDoc.field("byte") instanceof Byte);
Assert.assertEquals(((Byte) firstLevelDoc.field("byte")).byteValue(), ((Byte) firstDoc.field("byte")).byteValue());
Assert.assertTrue(firstDoc.field("doc") instanceof ODocument);
ODocument secondDoc = firstDoc.field("doc");
Assert.assertTrue(secondLevelDoc.hasSameContentOf(secondDoc));
Assert.assertTrue(secondDoc.field("long") instanceof Long);
Assert.assertEquals(((Long) secondLevelDoc.field("long")).longValue(), ((Long) secondDoc.field("long")).longValue());
Assert.assertTrue(secondDoc.field("date") instanceof Date);
Assert.assertTrue(secondDoc.field("byte") instanceof Byte);
Assert.assertEquals(((Byte) secondLevelDoc.field("byte")).byteValue(), ((Byte) secondDoc.field("byte")).byteValue());
Assert.assertTrue(secondDoc.field("doc") instanceof ODocument);
ODocument thirdDoc = secondDoc.field("doc");
Assert.assertTrue(thirdLevelDoc.hasSameContentOf(thirdDoc));
Assert.assertTrue(thirdDoc.field("long") instanceof Long);
Assert.assertEquals(((Long) thirdLevelDoc.field("long")).longValue(), ((Long) thirdDoc.field("long")).longValue());
Assert.assertTrue(thirdDoc.field("date") instanceof Date);
Assert.assertTrue(thirdDoc.field("byte") instanceof Byte);
Assert.assertEquals(((Byte) thirdLevelDoc.field("byte")).byteValue(), ((Byte) thirdDoc.field("byte")).byteValue());
} finally {
database.set(ODatabase.ATTRIBUTES.DATETIMEFORMAT, oldDataTimeFormat);
}
}
@Test
public void testMerge() {
ODocument doc1 = new ODocument();
final ArrayList<String> list = new ArrayList<String>();
doc1.field("embeddedList", list, OType.EMBEDDEDLIST);
list.add("Luca");
list.add("Marcus");
list.add("Jay");
doc1.field("salary", 10000);
doc1.field("years", 16);
ODocument doc2 = new ODocument();
final ArrayList<String> list2 = new ArrayList<String>();
doc2.field("embeddedList", list2, OType.EMBEDDEDLIST);
list2.add("Luca");
list2.add("Michael");
doc2.field("years", 32);
ODocument docMerge1 = doc1.copy();
docMerge1.merge(doc2, true, true);
Assert.assertTrue(docMerge1.containsField("embeddedList"));
Assert.assertTrue(docMerge1.field("embeddedList") instanceof List<?>);
Assert.assertEquals(((List<String>) docMerge1.field("embeddedList")).size(), 4);
Assert.assertTrue(((List<String>) docMerge1.field("embeddedList")).get(0) instanceof String);
Assert.assertEquals(((Integer) docMerge1.field("salary")).intValue(), 10000);
Assert.assertEquals(((Integer) docMerge1.field("years")).intValue(), 32);
ODocument docMerge2 = doc1.copy();
docMerge2.merge(doc2, true, false);
Assert.assertTrue(docMerge2.containsField("embeddedList"));
Assert.assertTrue(docMerge2.field("embeddedList") instanceof List<?>);
Assert.assertEquals(((List<String>) docMerge2.field("embeddedList")).size(), 2);
Assert.assertTrue(((List<String>) docMerge2.field("embeddedList")).get(0) instanceof String);
Assert.assertEquals(((Integer) docMerge2.field("salary")).intValue(), 10000);
Assert.assertEquals(((Integer) docMerge2.field("years")).intValue(), 32);
ODocument docMerge3 = doc1.copy();
doc2.removeField("years");
docMerge3.merge(doc2, false, false);
Assert.assertTrue(docMerge3.containsField("embeddedList"));
Assert.assertTrue(docMerge3.field("embeddedList") instanceof List<?>);
Assert.assertEquals(((List<String>) docMerge3.field("embeddedList")).size(), 2);
Assert.assertTrue(((List<String>) docMerge3.field("embeddedList")).get(0) instanceof String);
Assert.assertFalse(docMerge3.containsField("salary"));
Assert.assertFalse(docMerge3.containsField("years"));
}
@Test
public void testNestedEmbeddedMap() {
ODocument newDoc = new ODocument();
final Map<String, HashMap<?, ?>> map1 = new HashMap<String, HashMap<?, ?>>();
newDoc.field("map1", map1, OType.EMBEDDEDMAP);
final Map<String, HashMap<?, ?>> map2 = new HashMap<String, HashMap<?, ?>>();
map1.put("map2", (HashMap<?, ?>) map2);
final Map<String, HashMap<?, ?>> map3 = new HashMap<String, HashMap<?, ?>>();
map2.put("map3", (HashMap<?, ?>) map3);
String json = newDoc.toJSON();
ODocument loadedDoc = new ODocument().fromJSON(json);
Assert.assertTrue(newDoc.hasSameContentOf(loadedDoc));
Assert.assertTrue(loadedDoc.containsField("map1"));
Assert.assertTrue(loadedDoc.field("map1") instanceof Map<?, ?>);
final Map<String, ODocument> loadedMap1 = loadedDoc.field("map1");
Assert.assertEquals(loadedMap1.size(), 1);
Assert.assertTrue(loadedMap1.containsKey("map2"));
Assert.assertTrue(loadedMap1.get("map2") instanceof Map<?, ?>);
final Map<String, ODocument> loadedMap2 = (Map<String, ODocument>) loadedMap1.get("map2");
Assert.assertEquals(loadedMap2.size(), 1);
Assert.assertTrue(loadedMap2.containsKey("map3"));
Assert.assertTrue(loadedMap2.get("map3") instanceof Map<?, ?>);
final Map<String, ODocument> loadedMap3 = (Map<String, ODocument>) loadedMap2.get("map3");
Assert.assertEquals(loadedMap3.size(), 0);
}
@Test
public void testFetchedJson() {
OObjectDatabaseTx database = new OObjectDatabaseTx(url);
database.open("admin", "admin");
try {
database.getEntityManager().registerEntityClasses("com.orientechnologies.orient.test.domain.business");
database.getEntityManager().registerEntityClasses("com.orientechnologies.orient.test.domain.whiz");
database.getEntityManager().registerEntityClasses("com.orientechnologies.orient.test.domain.base");
List<ODocument> result = database.getUnderlying()
.command(new OSQLSynchQuery<ODocument>("select * from Profile where name = 'Barack' and surname = 'Obama'")).execute();
for (ODocument doc : result) {
String jsonFull = doc.toJSON("type,rid,version,class,keepTypes,attribSameRow,indent:0,fetchPlan:*:-1");
ODocument loadedDoc = new ODocument().fromJSON(jsonFull);
Assert.assertTrue(doc.hasSameContentOf(loadedDoc));
}
} finally {
database.close();
}
}
@Test
public void testToJSONWithNoLazyLoadAndClosedDatabase() {
List<ODocument> result = database.command(
new OSQLSynchQuery<ODocument>("select * from Profile where name = 'Barack' and surname = 'Obama'")).execute();
for (ODocument doc : result) {
doc.reload("*:0");
String jsonFull = doc.toJSON();
ORID rid = doc.getIdentity();
database.close();
database.open("admin", "admin");
doc = database.load(rid);
doc.setLazyLoad(false);
doc.reload("*:0");
database.close();
String jsonLoaded = doc.toJSON();
Assert.assertEquals(jsonLoaded, jsonFull);
database.open("admin", "admin");
doc = database.load(rid);
doc.setLazyLoad(false);
doc.load("*:0");
database.close();
jsonLoaded = doc.toJSON();
Assert.assertEquals(jsonLoaded, jsonFull);
}
if (database.isClosed())
database.open("admin", "admin");
for (ODocument doc : result) {
doc.reload("*:1");
String jsonFull = doc.toJSON();
ORID rid = doc.getIdentity();
database.close();
database.open("admin", "admin");
doc = database.load(rid);
doc.setLazyLoad(false);
doc.reload("*:1");
database.close();
String jsonLoaded = doc.toJSON();
Assert.assertEquals(jsonFull, jsonLoaded);
database.open("admin", "admin");
doc = database.load(rid);
doc.setLazyLoad(false);
doc.load("*:1");
database.close();
jsonLoaded = doc.toJSON();
Assert.assertEquals(jsonFull, jsonLoaded);
}
}
public void testSpecialChar() {
ODocument doc = new ODocument().fromJSON("{name:{\"%Field\":[\"value1\",\"value2\"],\"%Field2\":{},\"%Field3\":\"value3\"}}");
doc.save();
ODocument doc2 = database.load(doc.getIdentity());
Assert.assertEquals(doc, doc2);
}
public void testArrayOfArray() {
ODocument newDoc = new ODocument();
newDoc
.fromJSON("{\"@type\": \"d\",\"@class\": \"Track\",\"type\": \"LineString\",\"coordinates\": [ [ 100, 0 ], [ 101, 1 ] ]}");
newDoc.save();
ODocument loadedDoc = database.load(newDoc.getIdentity());
Assert.assertTrue(newDoc.hasSameContentOf(loadedDoc));
}
public void testLongTypes() {
ODocument newDoc = new ODocument();
newDoc
.fromJSON("{\"@type\": \"d\",\"@class\": \"Track\",\"type\": \"LineString\",\"coordinates\": [ [ 32874387347347, 0 ], [ -23736753287327, 1 ] ]}");
newDoc.save();
ODocument loadedDoc = database.load(newDoc.getIdentity());
Assert.assertTrue(newDoc.hasSameContentOf(loadedDoc));
}
public void testSpecialChars() {
ODocument doc = new ODocument()
.fromJSON("{Field:{\"Key1\":[\"Value1\",\"Value2\"],\"Key2\":{\"%%dummy%%\":null},\"Key3\":\"Value3\"}}");
doc.save();
ODocument doc2 = database.load(doc.getIdentity());
Assert.assertEquals(doc, doc2);
}
public void testJsonToStream() {
String doc1Json = "{Key1:{\"%Field1\":[{},{},{},{},{}],\"%Field2\":false,\"%Field3\":\"Value1\"}}";
ODocument doc1 = new ODocument().fromJSON(doc1Json);
String doc1String = new String(ORecordSerializerSchemaAware2CSV.INSTANCE.toStream(doc1, false));
Assert.assertEquals(doc1Json, "{" + doc1String + "}");
String doc2Json = "{Key1:{\"%Field1\":[{},{},{},{},{}],\"%Field2\":false,\"%Field3\":\"Value1\"}}";
ODocument doc2 = new ODocument().fromJSON(doc2Json);
String doc2String = new String(ORecordSerializerSchemaAware2CSV.INSTANCE.toStream(doc2, false));
Assert.assertEquals(doc2Json, "{" + doc2String + "}");
}
public void testSameNameCollectionsAndMap() {
ODocument doc = new ODocument();
doc.field("string", "STRING_VALUE");
List<ODocument> list = new ArrayList<ODocument>();
for (int i = 0; i < 10; i++) {
ODocument doc1 = new ODocument();
doc.field("number", i);
list.add(doc1);
Map<String, ODocument> docMap = new HashMap<String, ODocument>();
for (int j = 0; j < 5; j++) {
ODocument doc2 = new ODocument();
doc2.field("blabla", j);
docMap.put(String.valueOf(j), doc2);
ODocument doc3 = new ODocument();
doc3.field("blubli", String.valueOf(i + j));
doc2.field("out", doc3);
}
doc1.field("out", docMap);
list.add(doc1);
}
doc.field("out", list);
String json = doc.toJSON();
ODocument newDoc = new ODocument().fromJSON(json);
Assert.assertEquals(newDoc.toJSON(), json);
Assert.assertTrue(newDoc.hasSameContentOf(doc));
doc = new ODocument();
doc.field("string", "STRING_VALUE");
Map<String, ODocument> docMap = new HashMap<String, ODocument>();
for (int i = 0; i < 10; i++) {
ODocument doc1 = new ODocument();
doc.field("number", i);
list.add(doc1);
list = new ArrayList<ODocument>();
for (int j = 0; j < 5; j++) {
ODocument doc2 = new ODocument();
doc2.field("blabla", j);
list.add(doc2);
ODocument doc3 = new ODocument();
doc3.field("blubli", String.valueOf(i + j));
doc2.field("out", doc3);
}
doc1.field("out", list);
docMap.put(String.valueOf(i), doc1);
}
doc.field("out", docMap);
json = doc.toJSON();
newDoc = new ODocument().fromJSON(json);
Assert.assertEquals(newDoc.toJSON(), json);
Assert.assertTrue(newDoc.hasSameContentOf(doc));
}
public void testSameNameCollectionsAndMap2() {
ODocument doc = new ODocument();
doc.field("string", "STRING_VALUE");
List<ODocument> list = new ArrayList<ODocument>();
for (int i = 0; i < 2; i++) {
ODocument doc1 = new ODocument();
list.add(doc1);
Map<String, ODocument> docMap = new HashMap<String, ODocument>();
for (int j = 0; j < 5; j++) {
ODocument doc2 = new ODocument();
doc2.field("blabla", j);
docMap.put(String.valueOf(j), doc2);
}
doc1.field("theMap", docMap);
list.add(doc1);
}
doc.field("theList", list);
String json = doc.toJSON();
ODocument newDoc = new ODocument().fromJSON(json);
Assert.assertEquals(newDoc.toJSON(), json);
Assert.assertTrue(newDoc.hasSameContentOf(doc));
}
public void testSameNameCollectionsAndMap3() {
ODocument doc = new ODocument();
doc.field("string", "STRING_VALUE");
List<Map<String, ODocument>> list = new ArrayList<Map<String, ODocument>>();
for (int i = 0; i < 2; i++) {
Map<String, ODocument> docMap = new HashMap<String, ODocument>();
for (int j = 0; j < 5; j++) {
ODocument doc1 = new ODocument();
doc1.field("blabla", j);
docMap.put(String.valueOf(j), doc1);
}
list.add(docMap);
}
doc.field("theList", list);
String json = doc.toJSON();
ODocument newDoc = new ODocument().fromJSON(json);
Assert.assertEquals(newDoc.toJSON(), json);
}
public void testNestedJsonCollection() {
if (!database.getMetadata().getSchema().existsClass("Device"))
database.getMetadata().getSchema().createClass("Device");
database.command(
new OCommandSQL("insert into device (resource_id, domainset) VALUES (0, [ { 'domain' : 'abc' }, { 'domain' : 'pqr' } ])"))
.execute();
List<ODocument> result = database.query(new OSQLSynchQuery<Object>("select from device where domainset.domain contains 'abc'"));
Assert.assertTrue(result.size() > 0);
result = database.query(new OSQLSynchQuery<Object>("select from device where domainset[domain = 'abc'] is not null"));
Assert.assertTrue(result.size()>0);
result = database.query(new OSQLSynchQuery<Object>("select from device where domainset.domain contains 'pqr'"));
Assert.assertTrue(result.size()>0);
}
public void testNestedEmbeddedJson() {
if (!database.getMetadata().getSchema().existsClass("Device"))
database.getMetadata().getSchema().createClass("Device");
database.command(new OCommandSQL("insert into device (resource_id, domainset) VALUES (1, { 'domain' : 'eee' })")).execute();
List<ODocument> result = database.query(new OSQLSynchQuery<Object>("select from device where domainset.domain = 'eee'"));
Assert.assertTrue(result.size() > 0);
}
public void testNestedMultiLevelEmbeddedJson() {
if (!database.getMetadata().getSchema().existsClass("Device"))
database.getMetadata().getSchema().createClass("Device");
database.command(new OCommandSQL("insert into device (domainset) values ({'domain' : { 'lvlone' : { 'value' : 'five' } } } )"))
.execute();
List<ODocument> result = database.query(new OSQLSynchQuery<Object>(
"select from device where domainset.domain.lvlone.value = 'five'"));
Assert.assertTrue(result.size() > 0);
}
public void testSpaces() {
ODocument doc = new ODocument();
String test = "{" + "\"embedded\": {" + "\"second_embedded\": {" + "\"text\":\"this is a test\"" + "}" + "}" + "}";
doc.fromJSON(test);
Assert.assertTrue(doc.toJSON("fetchPlan:*:0,rid").indexOf("this is a test") > -1);
}
public void testEscaping() {
ODocument doc = new ODocument();
String s = "{\"name\": \"test\", \"nested\": { \"key\": \"value\", \"anotherKey\": 123 }, \"deep\": {\"deeper\": { \"k\": \"v\",\"quotes\": \"\\\"\\\",\\\"oops\\\":\\\"123\\\"\", \"likeJson\": \"[1,2,3]\",\"spaces\": \"value with spaces\"}}}";
doc.fromJSON(s);
Assert.assertEquals(doc.field("deep[deeper][quotes]"), "\"\",\"oops\":\"123\"");
String res = doc.toJSON();
// LOOK FOR "quotes": \"\",\"oops\":\"123\"
Assert.assertTrue(res.contains("\"quotes\":\"\\\"\\\",\\\"oops\\\":\\\"123\\\"\""));
}
public void testEscapingDoubleQuotes(){
ODocument doc = new ODocument();
StringBuilder builder = new StringBuilder();
builder.append(" {\n"
+ " \"foo\":{\n"
+ " \"bar\":{\n"
+ " \"P357\":[\n"
+ " {\n"
+ "\n"
+ " \"datavalue\":{\n"
+ " \"value\":\"\\\"\\\"\" \n"
+ " }\n"
+ " }\n"
+ " ] \n"
+ " },\n"
+ " \"three\": \"a\"\n"
+ " }\n"
+ "} ");
doc.fromJSON(builder.toString());
Assert.assertEquals(doc.field("foo.three"), "a");
Collection c = doc.field("foo.bar.P357");
Assert.assertEquals(c.size(), 1);
Map doc2 = (Map) c.iterator().next();
Assert.assertEquals(((Map) doc2.get("datavalue")).get("value"), "\"\"");
}
public void testEscapingDoubleQuotes2(){
ODocument doc = new ODocument();
StringBuilder builder = new StringBuilder();
builder.append(" {\n"
+ " \"foo\":{\n"
+ " \"bar\":{\n"
+ " \"P357\":[\n"
+ " {\n"
+ "\n"
+ " \"datavalue\":{\n"
+ " \"value\":\"\\\"\",\n"
+ "\n"
+ " }\n"
+ " }\n"
+ " ] \n"
+ " },\n"
+ " \"three\": \"a\"\n"
+ " }\n"
+ "} ");
doc.fromJSON(builder.toString());
Assert.assertEquals(doc.field("foo.three"), "a");
Collection c = doc.field("foo.bar.P357");
Assert.assertEquals(c.size(), 1);
Map doc2 = (Map) c.iterator().next();
Assert.assertEquals(((Map)doc2.get("datavalue")).get("value"), "\"");
}
public void testEscapingDoubleQuotes3(){
ODocument doc = new ODocument();
StringBuilder builder = new StringBuilder();
builder.append(" {\n" + " \"foo\":{\n" + " \"bar\":{\n" + " \"P357\":[\n" + " {\n" + "\n" + " \"datavalue\":{\n" + " \"value\":\"\\\"\",\n" + "\n" + " }\n" + " }\n" + " ] \n" + " }\n" + " }\n" + "} ");
doc.fromJSON(builder.toString());
Collection c = doc.field("foo.bar.P357");
Assert.assertEquals(c.size(), 1);
Map doc2 = (Map) c.iterator().next();
Assert.assertEquals(((Map)doc2.get("datavalue")).get("value"), "\"");
}
public void testEmbeddedQuotes(){
ODocument doc = new ODocument();
StringBuilder builder = new StringBuilder();
//FROM ISSUE 3151
builder.append("{\"mainsnak\":{\"datavalue\":{\"value\":\"Sub\\\\urban\"}}}");
doc.fromJSON(builder.toString());
Assert.assertEquals(doc.field("mainsnak.datavalue.value"), "Sub\\urban");
}
public void testEmbeddedQuotes2(){
ODocument doc = new ODocument();
StringBuilder builder = new StringBuilder();
builder.append("{\"datavalue\":{\"value\":\"Sub\\\\urban\"}}");
doc.fromJSON(builder.toString());
Assert.assertEquals(doc.field("datavalue.value"), "Sub\\urban");
}
public void testEmbeddedQuotes2a(){
ODocument doc = new ODocument();
StringBuilder builder = new StringBuilder();
builder.append("{\"datavalue\":\"Sub\\\\urban\"}");
doc.fromJSON(builder.toString());
Assert.assertEquals(doc.field("datavalue"), "Sub\\urban");
}
public void testEmbeddedQuotes3(){
ODocument doc = new ODocument();
StringBuilder builder = new StringBuilder();
builder.append("{\"mainsnak\":{\"datavalue\":{\"value\":\"Suburban\\\\\"\"}}}");
doc.fromJSON(builder.toString());
Assert.assertEquals(doc.field("mainsnak.datavalue.value"), "Suburban\\\"");
}
public void testEmbeddedQuotes4() {
ODocument doc = new ODocument();
StringBuilder builder = new StringBuilder();
builder.append("{\"datavalue\":{\"value\":\"Suburban\\\\\"\"}}");
doc.fromJSON(builder.toString());
Assert.assertEquals(doc.field("datavalue.value"), "Suburban\\\"");
}
public void testEmbeddedQuotes5() {
ODocument doc = new ODocument();
StringBuilder builder = new StringBuilder();
builder.append("{\"datavalue\":\"Suburban\\\\\"\"}");
doc.fromJSON(builder.toString());
Assert.assertEquals(doc.field("datavalue"), "Suburban\\\"");
}
public void testEmbeddedQuotes6(){
ODocument doc = new ODocument();
StringBuilder builder = new StringBuilder();
builder.append("{\"mainsnak\":{\"datavalue\":{\"value\":\"Suburban\\\\\"}}}");
doc.fromJSON(builder.toString());
Assert.assertEquals(doc.field("mainsnak.datavalue.value"), "Suburban\\");
}
public void testEmbeddedQuotes7() {
ODocument doc = new ODocument();
StringBuilder builder = new StringBuilder();
builder.append("{\"datavalue\":{\"value\":\"Suburban\\\\\"}}");
doc.fromJSON(builder.toString());
Assert.assertEquals(doc.field("datavalue.value"), "Suburban\\");
}
public void testEmbeddedQuotes8() {
ODocument doc = new ODocument();
StringBuilder builder = new StringBuilder();
builder.append("{\"datavalue\":\"Suburban\\\\\"}");
doc.fromJSON(builder.toString());
Assert.assertEquals(doc.field("datavalue"), "Suburban\\");
}
public void testEmpty(){
ODocument doc = new ODocument();
StringBuilder builder = new StringBuilder();
builder.append("{}");
doc.fromJSON(builder.toString());
Assert.assertEquals(doc.fieldNames().length,0);
}
public void testInvalidJson(){
ODocument doc = new ODocument();
try {
doc.fromJSON("{");
Assert.fail();
}catch (OSerializationException e){
}
try {
doc.fromJSON("{\"foo\":{}");
Assert.fail();
}catch (OSerializationException e){
}
try {
doc.fromJSON("{{}");
Assert.fail();
}catch (OSerializationException e){
}
try {
doc.fromJSON("{}}");
Assert.fail();
}catch (OSerializationException e){
}
try {
doc.fromJSON("}");
Assert.fail();
}catch (OSerializationException e){
}
}
public void testDates() {
Date now = new Date(1350518475000l);
ODocument doc = new ODocument();
doc.field("date", now);
String json = doc.toJSON();
ODocument unmarshalled = new ODocument().fromJSON(json);
Assert.assertEquals(unmarshalled.field("date"), now);
}
@Test
public void shouldDeserializeFieldWithCurlyBraces() {
String json = "{\"a\":\"{dd}\",\"bl\":{\"b\":\"c\",\"a\":\"d\"}}";
ODocument in = (ODocument) ORecordSerializerJSON.INSTANCE.fromString(json, database.newInstance(), new String[] {});
Assert.assertEquals(in.field("a"), "{dd}");
Assert.assertTrue(in.field("bl") instanceof Map);
}
@Test
public void testList() throws Exception {
ODocument documentSource = new ODocument();
documentSource.fromJSON("{\"list\" : [\"string\", 42]}");
ODocument documentTarget = new ODocument();
documentTarget.fromStream(documentSource.toStream());
OTrackedList<Object> list = documentTarget.field("list", OType.EMBEDDEDLIST);
Assert.assertEquals(list.get(0), "string");
Assert.assertEquals(list.get(1), 42);
}
@Test
public void testEmbeddedRIDBagDeserialisationWhenFieldTypeIsProvided() throws Exception {
ODocument documentSource = new ODocument();
documentSource.fromJSON("{FirstName:\"Student A 0\",in_EHasGoodStudents:[#57:0],@fieldTypes:\"in_EHasGoodStudents=g\"}");
ORidBag bag = documentSource.field("in_EHasGoodStudents");
Assert.assertEquals(bag.size(), 1);
OIdentifiable rid = bag.rawIterator().next();
Assert.assertTrue(rid.getIdentity().getClusterId() == 57);
Assert.assertTrue(rid.getIdentity().getClusterPosition() == 0);
}
public void testNestedLinkCreation() {
ODocument jaimeDoc = new ODocument("NestedLinkCreation");
jaimeDoc.field("name", "jaime");
jaimeDoc.save();
// The link between jaime and cersei is saved properly - the #2263 test case
ODocument cerseiDoc = new ODocument("NestedLinkCreation");
cerseiDoc.fromJSON("{\"@type\":\"d\",\"name\":\"cersei\",\"valonqar\":" + jaimeDoc.toJSON() + "}");
cerseiDoc.save();
// The link between jamie and tyrion is not saved properly
ODocument tyrionDoc = new ODocument("NestedLinkCreation");
tyrionDoc
.fromJSON("{\"@type\":\"d\",\"name\":\"tyrion\",\"emergency_contact\":{\"@type\":\"d\", \"relationship\":\"brother\",\"contact\":"
+ jaimeDoc.toJSON() + "}}");
tyrionDoc.save();
final Map<ORID, ODocument> contentMap = new HashMap<ORID, ODocument>();
ODocument jaime = new ODocument("NestedLinkCreation");
jaime.field("name", "jaime");
contentMap.put(jaimeDoc.getIdentity(), jaime);
ODocument cersei = new ODocument("NestedLinkCreation");
cersei.field("name", "cersei");
cersei.field("valonqar", jaimeDoc.getIdentity());
contentMap.put(cerseiDoc.getIdentity(), cersei);
ODocument tyrion = new ODocument("NestedLinkCreation");
tyrion.field("name", "tyrion");
ODocument embeddedDoc = new ODocument();
embeddedDoc.field("relationship", "brother");
embeddedDoc.field("contact", jaimeDoc.getIdentity());
tyrion.field("emergency_contact", embeddedDoc);
contentMap.put(tyrionDoc.getIdentity(), tyrion);
final Map<ORID, List<ORID>> traverseMap = new HashMap<ORID, List<ORID>>();
List<ORID> jaimeTraverse = new ArrayList<ORID>();
jaimeTraverse.add(jaimeDoc.getIdentity());
traverseMap.put(jaimeDoc.getIdentity(), jaimeTraverse);
List<ORID> cerseiTraverse = new ArrayList<ORID>();
cerseiTraverse.add(cerseiDoc.getIdentity());
cerseiTraverse.add(jaimeDoc.getIdentity());
traverseMap.put(cerseiDoc.getIdentity(), cerseiTraverse);
List<ORID> tyrionTraverse = new ArrayList<ORID>();
tyrionTraverse.add(tyrionDoc.getIdentity());
tyrionTraverse.add(jaimeDoc.getIdentity());
traverseMap.put(tyrionDoc.getIdentity(), tyrionTraverse);
for (ODocument o : database.browseClass("NestedLinkCreation")) {
ODocument content = contentMap.get(o.getIdentity());
Assert.assertTrue(content.hasSameContentOf(o));
List<ORID> traverse = traverseMap.remove(o.getIdentity());
for (OIdentifiable id : new OSQLSynchQuery<ODocument>("traverse * from " + o.getIdentity().toString())) {
Assert.assertTrue(traverse.remove(id.getIdentity()));
}
Assert.assertTrue(traverse.isEmpty());
}
Assert.assertTrue(traverseMap.isEmpty());
}
public void testNestedLinkCreationFieldTypes() {
ODocument jaimeDoc = new ODocument("NestedLinkCreationFieldTypes");
jaimeDoc.field("name", "jaime");
jaimeDoc.save();
// The link between jaime and cersei is saved properly - the #2263 test case
ODocument cerseiDoc = new ODocument("NestedLinkCreationFieldTypes");
cerseiDoc.fromJSON("{\"@type\":\"d\",\"@fieldTypes\":\"valonqar=x\",\"name\":\"cersei\",\"valonqar\":" + jaimeDoc.getIdentity()
+ "}");
cerseiDoc.save();
// The link between jamie and tyrion is not saved properly
ODocument tyrionDoc = new ODocument("NestedLinkCreationFieldTypes");
tyrionDoc
.fromJSON("{\"@type\":\"d\",\"name\":\"tyrion\",\"emergency_contact\":{\"@type\":\"d\", \"@fieldTypes\":\"contact=x\",\"relationship\":\"brother\",\"contact\":"
+ jaimeDoc.getIdentity() + "}}");
tyrionDoc.save();
final Map<ORID, ODocument> contentMap = new HashMap<ORID, ODocument>();
ODocument jaime = new ODocument("NestedLinkCreationFieldTypes");
jaime.field("name", "jaime");
contentMap.put(jaimeDoc.getIdentity(), jaime);
ODocument cersei = new ODocument("NestedLinkCreationFieldTypes");
cersei.field("name", "cersei");
cersei.field("valonqar", jaimeDoc.getIdentity());
contentMap.put(cerseiDoc.getIdentity(), cersei);
ODocument tyrion = new ODocument("NestedLinkCreationFieldTypes");
tyrion.field("name", "tyrion");
ODocument embeddedDoc = new ODocument();
embeddedDoc.field("relationship", "brother");
embeddedDoc.field("contact", jaimeDoc.getIdentity());
tyrion.field("emergency_contact", embeddedDoc);
contentMap.put(tyrionDoc.getIdentity(), tyrion);
final Map<ORID, List<ORID>> traverseMap = new HashMap<ORID, List<ORID>>();
List<ORID> jaimeTraverse = new ArrayList<ORID>();
jaimeTraverse.add(jaimeDoc.getIdentity());
traverseMap.put(jaimeDoc.getIdentity(), jaimeTraverse);
List<ORID> cerseiTraverse = new ArrayList<ORID>();
cerseiTraverse.add(cerseiDoc.getIdentity());
cerseiTraverse.add(jaimeDoc.getIdentity());
traverseMap.put(cerseiDoc.getIdentity(), cerseiTraverse);
List<ORID> tyrionTraverse = new ArrayList<ORID>();
tyrionTraverse.add(tyrionDoc.getIdentity());
tyrionTraverse.add(jaimeDoc.getIdentity());
traverseMap.put(tyrionDoc.getIdentity(), tyrionTraverse);
for (ODocument o : database.browseClass("NestedLinkCreationFieldTypes")) {
ODocument content = contentMap.get(o.getIdentity());
Assert.assertTrue(content.hasSameContentOf(o));
List<ORID> traverse = traverseMap.remove(o.getIdentity());
for (OIdentifiable id : new OSQLSynchQuery<ODocument>("traverse * from " + o.getIdentity().toString())) {
Assert.assertTrue(traverse.remove(id.getIdentity()));
}
Assert.assertTrue(traverse.isEmpty());
}
Assert.assertTrue(traverseMap.isEmpty());
}
public void testInnerDocCreation() {
ODocument adamDoc = new ODocument("InnerDocCreation");
adamDoc.fromJSON("{\"name\":\"adam\"}");
adamDoc.save();
ODocument eveDoc = new ODocument("InnerDocCreation");
eveDoc.fromJSON("{\"@type\":\"d\",\"name\":\"eve\",\"friends\":[" + adamDoc.toJSON() + "]}");
eveDoc.save();
Map<ORID, ODocument> contentMap = new HashMap<ORID, ODocument>();
ODocument adam = new ODocument("InnerDocCreation");
adam.field("name", "adam");
contentMap.put(adamDoc.getIdentity(), adam);
ODocument eve = new ODocument("InnerDocCreation");
eve.field("name", "eve");
List<ORID> friends = new ArrayList<ORID>();
friends.add(adamDoc.getIdentity());
eve.field("friends", friends);
contentMap.put(eveDoc.getIdentity(), eve);
Map<ORID, List<ORID>> traverseMap = new HashMap<ORID, List<ORID>>();
List<ORID> adamTraverse = new ArrayList<ORID>();
adamTraverse.add(adamDoc.getIdentity());
traverseMap.put(adamDoc.getIdentity(), adamTraverse);
List<ORID> eveTraverse = new ArrayList<ORID>();
eveTraverse.add(eveDoc.getIdentity());
eveTraverse.add(adamDoc.getIdentity());
traverseMap.put(eveDoc.getIdentity(), eveTraverse);
for (ODocument o : database.browseClass("InnerDocCreation")) {
ODocument content = contentMap.get(o.getIdentity());
Assert.assertTrue(content.hasSameContentOf(o));
}
for (ODocument o : database.browseClass("InnerDocCreation")) {
List<ORID> traverse = traverseMap.remove(o.getIdentity());
for (OIdentifiable id : new OSQLSynchQuery<ODocument>("traverse * from " + o.getIdentity().toString())) {
Assert.assertTrue(traverse.remove(id.getIdentity()));
}
Assert.assertTrue(traverse.isEmpty());
}
Assert.assertTrue(traverseMap.isEmpty());
}
public void testInnerDocCreationFieldTypes() {
ODocument adamDoc = new ODocument("InnerDocCreationFieldTypes");
adamDoc.fromJSON("{\"name\":\"adam\"}");
adamDoc.save();
ODocument eveDoc = new ODocument("InnerDocCreationFieldTypes");
eveDoc.fromJSON("{\"@type\":\"d\", \"@fieldTypes\" : \"friends=z\", \"name\":\"eve\",\"friends\":[" + adamDoc.getIdentity()
+ "]}");
eveDoc.save();
Map<ORID, ODocument> contentMap = new HashMap<ORID, ODocument>();
ODocument adam = new ODocument("InnerDocCreationFieldTypes");
adam.field("name", "adam");
contentMap.put(adamDoc.getIdentity(), adam);
ODocument eve = new ODocument("InnerDocCreationFieldTypes");
eve.field("name", "eve");
List<ORID> friends = new ArrayList<ORID>();
friends.add(adamDoc.getIdentity());
eve.field("friends", friends);
contentMap.put(eveDoc.getIdentity(), eve);
Map<ORID, List<ORID>> traverseMap = new HashMap<ORID, List<ORID>>();
List<ORID> adamTraverse = new ArrayList<ORID>();
adamTraverse.add(adamDoc.getIdentity());
traverseMap.put(adamDoc.getIdentity(), adamTraverse);
List<ORID> eveTraverse = new ArrayList<ORID>();
eveTraverse.add(eveDoc.getIdentity());
eveTraverse.add(adamDoc.getIdentity());
traverseMap.put(eveDoc.getIdentity(), eveTraverse);
for (ODocument o : database.browseClass("InnerDocCreationFieldTypes")) {
ODocument content = contentMap.get(o.getIdentity());
Assert.assertTrue(content.hasSameContentOf(o));
}
for (ODocument o : database.browseClass("InnerDocCreationFieldTypes")) {
List<ORID> traverse = traverseMap.remove(o.getIdentity());
for (OIdentifiable id : new OSQLSynchQuery<ODocument>("traverse * from " + o.getIdentity().toString())) {
Assert.assertTrue(traverse.remove(id.getIdentity()));
}
Assert.assertTrue(traverse.isEmpty());
}
Assert.assertTrue(traverseMap.isEmpty());
}
public void testJSONTxDoc() {
if (!database.getMetadata().getSchema().existsClass("JSONTxDocOne"))
database.getMetadata().getSchema().createClass("JSONTxDocOne");
if (!database.getMetadata().getSchema().existsClass("JSONTxDocTwo"))
database.getMetadata().getSchema().createClass("JSONTxDocTwo");
ODocument adamDoc = new ODocument("JSONTxDocOne");
adamDoc.field("name", "adam");
adamDoc.save();
database.begin();
ODocument eveDoc = new ODocument("JSONTxDocOne");
eveDoc.field("name", "eve");
eveDoc.save();
ODocument nestedWithTypeD = new ODocument("JSONTxDocTwo");
nestedWithTypeD.fromJSON("{\"@type\":\"d\",\"event_name\":\"world cup 2014\",\"admin\":[" + eveDoc.toJSON() + ","
+ adamDoc.toJSON() + "]}");
nestedWithTypeD.save();
database.commit();
Assert.assertEquals(database.countClass("JSONTxDocOne"), 2);
Map<ORID, ODocument> contentMap = new HashMap<ORID, ODocument>();
ODocument adam = new ODocument("JSONTxDocOne");
adam.field("name", "adam");
contentMap.put(adamDoc.getIdentity(), adam);
ODocument eve = new ODocument("JSONTxDocOne");
eve.field("name", "eve");
contentMap.put(eveDoc.getIdentity(), eve);
for (ODocument o : database.browseClass("JSONTxDocOne")) {
ODocument content = contentMap.get(o.getIdentity());
Assert.assertTrue(content.hasSameContentOf(o));
}
}
public void testInvalidLink() {
ODocument nullRefDoc = new ODocument();
nullRefDoc.fromJSON("{\"name\":\"Luca\", \"ref\":\"#-1:-1\"}");
// Assert.assertNull(nullRefDoc.rawField("ref"));
String json = nullRefDoc.toJSON();
int pos = json.indexOf("\"ref\":");
Assert.assertTrue(pos > -1);
Assert.assertEquals(json.charAt(pos + "\"ref\":".length()), 'n');
}
public void testOtherJson(){
new ODocument().fromJSON("{\"Salary\":1500.0,\"Type\":\"Person\",\"Address\":[{\"Zip\":\"JX2 MSX\",\"Type\":\"Home\",\"Street1\":\"13 Marge Street\",\"Country\":\"Holland\",\"Id\":\"Address-28813211\",\"City\":\"Amsterdam\",\"From\":\"1996-02-01\",\"To\":\"1998-01-01\"},{\"Zip\":\"90210\",\"Type\":\"Work\",\"Street1\":\"100 Hollywood Drive\",\"Country\":\"USA\",\"Id\":\"Address-11595040\",\"City\":\"Los Angeles\",\"From\":\"2009-09-01\"}],\"Id\":\"Person-7464251\",\"Name\":\"Stan\"}");
}
@Test
public void testScientificNotation() {
ODocument doc = new ODocument();
doc.fromJSON("{'number1': -9.2741500e-31, 'number2': 741800E+290}");
double number1 = doc.field("number1");
Assert.assertEquals(number1, -9.27415E-31);
double number2 = doc.field("number2");
Assert.assertEquals(number2, 741800E+290);
}
}