/* * 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 com.torodb.core.TableRef; import com.torodb.core.TableRefFactory; import com.torodb.core.d2r.DefaultIdentifierFactory; import com.torodb.core.impl.TableRefFactoryImpl; import com.torodb.core.transaction.metainf.FieldType; import com.torodb.core.transaction.metainf.ImmutableMetaCollection; import com.torodb.core.transaction.metainf.ImmutableMetaDatabase; import com.torodb.core.transaction.metainf.ImmutableMetaDocPart; import com.torodb.core.transaction.metainf.ImmutableMetaField; import com.torodb.core.transaction.metainf.ImmutableMetaSnapshot; import org.junit.Assert; import org.junit.Before; import org.junit.Test; public class IdentifierFactoryImplTest { private DefaultIdentifierFactory identifierFactory; private TableRefFactory tableRefFactory = new TableRefFactoryImpl(); @Before public void setUp() throws Exception { this.identifierFactory = new DefaultIdentifierFactory(new MockIdentifierInterface()); } @Test public void emptyDatabaseToIdentifierTest() { ImmutableMetaSnapshot metaSnapshot = new ImmutableMetaSnapshot.Builder().build(); String identifier = identifierFactory.toDatabaseIdentifier(metaSnapshot, ""); Assert.assertEquals("", identifier); } @Test public void unallowedDatabaseToIdentifierTest() { ImmutableMetaSnapshot metaSnapshot = new ImmutableMetaSnapshot.Builder().build(); String identifier = identifierFactory.toDatabaseIdentifier(metaSnapshot, "unallowed_schema"); Assert.assertEquals("_unallowed_schema", identifier); } @Test public void databaseToIdentifierTest() { ImmutableMetaSnapshot metaSnapshot = new ImmutableMetaSnapshot.Builder().build(); String identifier = identifierFactory.toDatabaseIdentifier(metaSnapshot, "database"); Assert.assertEquals("database", identifier); } @Test public void long128DatabaseToIdentifierTest() { ImmutableMetaSnapshot metaSnapshot = new ImmutableMetaSnapshot.Builder().build(); String identifier = identifierFactory.toDatabaseIdentifier(metaSnapshot, "database_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long"); Assert.assertEquals( "database_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long", identifier); } @Test public void longForCounterDatabaseToIdentifierTest() { ImmutableMetaSnapshot metaSnapshot = new ImmutableMetaSnapshot.Builder().build(); String identifier = identifierFactory.toDatabaseIdentifier(metaSnapshot, "database_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long"); Assert.assertEquals( "database_long_long_long_long_long_long_long_long_long_long_longong_long_long_long_long_long_long_long_long_long_long_long_long_1", identifier); } @Test public void longForCounterWithCollisionCharacterDatabaseToIdentifierTest() { ImmutableMetaSnapshot metaSnapshot = new ImmutableMetaSnapshot.Builder() .put(new ImmutableMetaDatabase.Builder("database_collider", "database_long_long_long_long_long_long_long_long_long_long_longong_long_long_long_long_long_long_long_long_long_long_long_long_1")) .build(); String identifier = identifierFactory.toDatabaseIdentifier(metaSnapshot, "database_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long"); Assert.assertEquals( "database_long_long_long_long_long_long_long_long_long_long_longong_long_long_long_long_long_long_long_long_long_long_long_long_2", identifier); } @Test public void emptyCollectionDocPartRootToIdentifierTest() { ImmutableMetaDatabase metaDatabase = new ImmutableMetaDatabase.Builder("database", "database") .build(); String identifier = identifierFactory.toDocPartIdentifier(metaDatabase, "", createTableRef()); Assert.assertEquals("", identifier); } @Test public void unallowedCollectionDocPartRootToIdentifierTest() { ImmutableMetaDatabase metaDatabase = new ImmutableMetaDatabase.Builder("database", "database") .build(); String identifier = identifierFactory.toDocPartIdentifier(metaDatabase, "unallowed_table", createTableRef()); Assert.assertEquals("_unallowed_table", identifier); } @Test public void docPartRootToIdentifierTest() { ImmutableMetaDatabase metaDatabase = new ImmutableMetaDatabase.Builder("database", "database") .build(); String identifier = identifierFactory.toDocPartIdentifier(metaDatabase, "collecti", createTableRef()); Assert.assertEquals("collecti", identifier); } @Test public void docPartObjectChildToIdentifierTest() { ImmutableMetaDatabase metaDatabase = new ImmutableMetaDatabase.Builder("database", "database") .build(); String identifier = identifierFactory.toDocPartIdentifier(metaDatabase, "collecti", createTableRef("object")); Assert.assertEquals("collecti_object", identifier); } @Test public void docPartArrayChildToIdentifierTest() { ImmutableMetaDatabase metaDatabase = new ImmutableMetaDatabase.Builder("database", "database") .build(); String identifier = identifierFactory.toDocPartIdentifier(metaDatabase, "collecti", createTableRef("array")); Assert.assertEquals("collecti_array", identifier); } @Test public void docPartArrayInArrayChildToIdentifierTest() { ImmutableMetaDatabase metaDatabase = new ImmutableMetaDatabase.Builder("database", "database") .build(); String identifier = identifierFactory.toDocPartIdentifier(metaDatabase, "collecti", createTableRef("array", "2")); Assert.assertEquals("collecti_array$2", identifier); } @Test public void docPartObjectArrayInArrayObjectToIdentifierTest() { ImmutableMetaDatabase metaDatabase = new ImmutableMetaDatabase.Builder("database", "database") .build(); String identifier = identifierFactory.toDocPartIdentifier(metaDatabase, "collecti", createTableRef("object", "array", "2", "object")); Assert.assertEquals("collecti_object_array$2_object", identifier); } @Test public void emptyDocPartToIdentifierTest() { ImmutableMetaDatabase metaDatabase = new ImmutableMetaDatabase.Builder("database", "database") .build(); String identifier = identifierFactory.toDocPartIdentifier(metaDatabase, "collecti", createTableRef("")); Assert.assertEquals("collecti_", identifier); } @Test public void long128DocPartToIdentifierTest() { ImmutableMetaDatabase metaDatabase = new ImmutableMetaDatabase.Builder("database", "database") .build(); String identifier = identifierFactory.toDocPartIdentifier(metaDatabase, "collecti", createTableRef( "long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long")); Assert.assertEquals( "collecti_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long", identifier); } @Test public void longForCounterDocPartToIdentifierTest() { ImmutableMetaDatabase metaDatabase = new ImmutableMetaDatabase.Builder("database", "database") .build(); String identifier = identifierFactory.toDocPartIdentifier(metaDatabase, "collecti", createTableRef( "long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long")); Assert.assertEquals( "collecti_long_long_long_long_long_long_long_long_long_long_longong_long_long_long_long_long_long_long_long_long_long_long_long_1", identifier); } @Test public void longForCounterWithCollisionCharacterDocPartToIdentifierTest() { ImmutableMetaDatabase metaDatabase = new ImmutableMetaDatabase.Builder("database", "database") .put(new ImmutableMetaCollection.Builder("collecti", "collecti") .put(new ImmutableMetaDocPart.Builder(createTableRef(), "collecti_long_long_long_long_long_long_long_long_long_long_longong_long_long_long_long_long_long_long_long_long_long_long_long_1") .build()) .build()) .build(); String identifier = identifierFactory.toDocPartIdentifier(metaDatabase, "collecti", createTableRef( "long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long")); Assert.assertEquals( "collecti_long_long_long_long_long_long_long_long_long_long_longong_long_long_long_long_long_long_long_long_long_long_long_long_2", identifier); } @Test public void emptyFieldToIdentifierTest() { ImmutableMetaDocPart metaDocPart = new ImmutableMetaDocPart.Builder(createTableRef(), "docpart") .build(); String identifier = identifierFactory.toFieldIdentifier(metaDocPart, "", FieldType.STRING); Assert.assertEquals("_s", identifier); } @Test public void unallowedFieldToIdentifierTest() { ImmutableMetaDocPart metaDocPart = new ImmutableMetaDocPart.Builder(createTableRef(), "docpart") .build(); String identifier = identifierFactory.toFieldIdentifier(metaDocPart, "unallowed_column", FieldType.STRING); Assert.assertEquals("_unallowed_column_s", identifier); } @Test public void fieldToIdentifierTest() { ImmutableMetaDocPart metaDocPart = new ImmutableMetaDocPart.Builder(createTableRef(), "docpart") .build(); String identifier = identifierFactory.toFieldIdentifier(metaDocPart, "field", FieldType.STRING); Assert.assertEquals("field_s", identifier); } @Test public void long128FieldToIdentifierTest() { ImmutableMetaDocPart metaDocPart = new ImmutableMetaDocPart.Builder(createTableRef(), "docpart") .build(); String identifier = identifierFactory.toFieldIdentifier(metaDocPart, "field__long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long", FieldType.STRING); Assert.assertEquals( "field__long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_s", identifier); } @Test public void longForCounterFieldToIdentifierTest() { ImmutableMetaDocPart metaDocPart = new ImmutableMetaDocPart.Builder(createTableRef(), "docpart") .build(); String identifier = identifierFactory.toFieldIdentifier(metaDocPart, "field____long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long", FieldType.STRING); Assert.assertEquals( "field____long_long_long_long_long_long_long_long_long_long_lonng_long_long_long_long_long_long_long_long_long_long_long_long_1_s", identifier); } @Test public void longForCounterWithCollisionCharacterFieldToIdentifierTest() { ImmutableMetaDocPart metaDocPart = new ImmutableMetaDocPart.Builder(createTableRef(), "docpart") .put(new ImmutableMetaField("field_collider", "field____long_long_long_long_long_long_long_long_long_long_lonng_long_long_long_long_long_long_long_long_long_long_long_long_1_s", FieldType.STRING)) .build(); String identifier = identifierFactory.toFieldIdentifier(metaDocPart, "field____long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long", FieldType.STRING); Assert.assertEquals( "field____long_long_long_long_long_long_long_long_long_long_lonng_long_long_long_long_long_long_long_long_long_long_long_long_2_s", identifier); } private TableRef createTableRef(String... names) { TableRef tableRef = tableRefFactory.createRoot(); for (String name : names) { try { int index = Integer.parseInt(name); tableRef = tableRefFactory.createChild(tableRef, index); } catch (NumberFormatException ex) { tableRef = tableRefFactory.createChild(tableRef, name); } } return tableRef; } }