/******************************************************************************* * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2019) * * contact.vitam@culture.gouv.fr * * This software is a computer program whose purpose is to implement a digital archiving back-office system managing * high volumetry securely and efficiently. * * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as * circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". * * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the * successive licensors have only limited liability. * * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or * developing or reproducing the software by the user in light of its specific status of free software, that may mean * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data * to be ensured and, more generally, to use and operate it in the same conditions as regards security. * * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you * accept its terms. *******************************************************************************/ package fr.gouv.vitam.metadata.core.database.collections; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.and; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.eq; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.exists; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.gt; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.in; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.isNull; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.lt; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.match; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.missing; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.ne; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.nin; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.or; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.path; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.range; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.size; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.term; import static fr.gouv.vitam.common.database.builder.query.VitamFieldsHelper.all; import static fr.gouv.vitam.common.database.builder.query.VitamFieldsHelper.id; import static fr.gouv.vitam.common.database.builder.query.VitamFieldsHelper.tenant; import static fr.gouv.vitam.common.database.builder.query.action.UpdateActionHelper.add; import static fr.gouv.vitam.common.database.builder.query.action.UpdateActionHelper.inc; import static fr.gouv.vitam.common.database.builder.query.action.UpdateActionHelper.min; import static fr.gouv.vitam.common.database.builder.query.action.UpdateActionHelper.push; import static fr.gouv.vitam.common.database.builder.query.action.UpdateActionHelper.set; import static fr.gouv.vitam.common.database.builder.query.action.UpdateActionHelper.unset; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.junit.Assume.assumeTrue; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import org.bson.Document; import org.bson.conversions.Bson; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.mongodb.BasicDBList; import com.mongodb.MongoClient; import com.mongodb.MongoClientOptions; import com.mongodb.ServerAddress; import com.mongodb.client.MongoDatabase; import de.flapdoodle.embed.mongo.MongodExecutable; import de.flapdoodle.embed.mongo.MongodProcess; import de.flapdoodle.embed.mongo.MongodStarter; import de.flapdoodle.embed.mongo.config.MongodConfigBuilder; import de.flapdoodle.embed.mongo.config.Net; import de.flapdoodle.embed.mongo.distribution.Version; import de.flapdoodle.embed.process.runtime.Network; import fr.gouv.vitam.common.LocalDateUtil; import fr.gouv.vitam.common.database.builder.query.PathQuery; import fr.gouv.vitam.common.database.builder.query.VitamFieldsHelper; import fr.gouv.vitam.common.database.builder.request.configuration.BuilderToken; import fr.gouv.vitam.common.database.builder.request.exception.InvalidCreateOperationException; import fr.gouv.vitam.common.database.builder.request.multiple.Delete; import fr.gouv.vitam.common.database.builder.request.multiple.Insert; import fr.gouv.vitam.common.database.builder.request.multiple.Select; import fr.gouv.vitam.common.database.builder.request.multiple.Update; import fr.gouv.vitam.common.database.parser.request.multiple.DeleteParserMultiple; import fr.gouv.vitam.common.database.parser.request.multiple.InsertParserMultiple; import fr.gouv.vitam.common.database.parser.request.multiple.RequestParserHelper; import fr.gouv.vitam.common.database.parser.request.multiple.RequestParserMultiple; import fr.gouv.vitam.common.database.parser.request.multiple.SelectParserMultiple; import fr.gouv.vitam.common.database.parser.request.multiple.UpdateParserMultiple; import fr.gouv.vitam.common.database.server.elasticsearch.ElasticsearchNode; import fr.gouv.vitam.common.exception.InvalidParseOperationException; import fr.gouv.vitam.common.exception.VitamApplicationServerException; import fr.gouv.vitam.common.guid.GUID; import fr.gouv.vitam.common.guid.GUIDFactory; import fr.gouv.vitam.common.json.JsonHandler; import fr.gouv.vitam.common.junit.JunitHelper; import fr.gouv.vitam.common.junit.JunitHelper.ElasticsearchTestConfiguration; import fr.gouv.vitam.common.logging.VitamLogger; import fr.gouv.vitam.common.logging.VitamLoggerFactory; import fr.gouv.vitam.common.thread.RunWithCustomExecutor; import fr.gouv.vitam.common.thread.RunWithCustomExecutorRule; import fr.gouv.vitam.common.thread.VitamThreadPoolExecutor; import fr.gouv.vitam.common.thread.VitamThreadUtils; import fr.gouv.vitam.metadata.api.exception.MetaDataAlreadyExistException; import fr.gouv.vitam.metadata.api.exception.MetaDataExecutionException; import fr.gouv.vitam.metadata.api.exception.MetaDataNotFoundException; public class DbRequestTest { private static final VitamLogger LOGGER = VitamLoggerFactory.getInstance(DbRequestTest.class); @Rule public RunWithCustomExecutorRule runInThread = new RunWithCustomExecutorRule(VitamThreadPoolExecutor.getDefaultExecutor()); @ClassRule public static TemporaryFolder tempFolder = new TemporaryFolder(); private static final Integer TENANT_ID_0 = new Integer(0); private static final Integer TENANT_ID_1 = new Integer(1); private final static String CLUSTER_NAME = "vitam-cluster"; private final static String HOST_NAME = "127.0.0.1"; private static ElasticsearchTestConfiguration config = null; private static ElasticsearchAccessMetadata esClient; private static final String DATABASE_HOST = "localhost"; private static final boolean CREATE = false; private static final boolean DROP = false; private static final String MY_INT = "MyInt"; private static final String CREATED_DATE = "CreatedDate"; private static final String DESCRIPTION = "Description"; private static final String TITLE = "Title"; private static final String MY_BOOLEAN = "MyBoolean"; private static final String MY_FLOAT = "MyFloat"; private static final String UNKNOWN_VAR = "unknown"; private static final String VALUE_MY_TITLE = "MyTitle"; private static final String VALUE_TENANT = "MyTitle"; private static final String ARRAY_VAR = "ArrayVar"; private static final String ARRAY2_VAR = "Array2Var"; private static final String EMPTY_VAR = "EmptyVar"; static final int tenantId = 0; static final List tenantList = new ArrayList(){{add(TENANT_ID_0);}}; static final int platformId = 10; static MongoDbAccessMetadataImpl mongoDbAccess; static MongodExecutable mongodExecutable; static MongoClient mongoClient; static MongoDbVarNameAdapter mongoDbVarNameAdapter; static MongodProcess mongod; private static JunitHelper junitHelper; private static int port; private static final String REQUEST_SELECT_TEST_1 = "{$query: {$eq: {\"#id\" : \"aebaaaaaaaaaaaabaahbcakzu2stfryabbaq\" }}, $projection : []}"; private static final String REQUEST_SELECT_TEST_2 = "{$query: {$eq: {\"#id\" : \"aeaqaaaaaaaaaaababid6akzxqwg6qqaaaaq\" }}, $projection : []}"; private static final String REQUEST_SELECT_TEST_3 = "{$query: {$eq: {\"#id\" : \"aeaqaaaaaaaaaaababid6akzxqwg6qqaaaar\" }}, $projection : []}"; private static final String REQUEST_SELECT_TEST_4 = "{$query: {$eq: {\"#id\" : \"aeaqaaaaaaaaaaababid6akzxqwg6qqaaaas\" }}, $projection : []}"; private static final String REQUEST_UPDATE_TEST = "{$query: {$eq: {\"id\" : \"id\" }}}"; private static final String REQUEST_INSERT_TEST_1 = "{ \"#id\": \"aebaaaaaaaaaaaabaahbcakzu2stfryabbaq\", \"title\": \"title1\" }"; private static final String REQUEST_INSERT_TEST_2 = "{ \"#id\": \"aeaqaaaaaaaaaaababid6akzxqwg6qqaaaaq\", \"title\": \"title2\" }"; private static final String REQUEST_INSERT_TEST_3 = "{ \"#id\": \"aeaqaaaaaaaaaaababid6akzxqwg6qqaaaar\", \"title\": \"title3\" }"; private static final String REQUEST_INSERT_TEST_4 = "{ \"#id\": \"aeaqaaaaaaaaaaababid6akzxqwg6qqaaaas\", \"title\": \"title4\" }"; private static final String REQUEST_SELECT_TEST_ES_1 = "{$query: { $match : { 'Description' : 'OK' , '$max_expansions' : 1 } }}"; private static final String REQUEST_SELECT_TEST_ES_2 = "{$query: { $match : { 'Description' : 'dèscription OK' , '$max_expansions' : 1 } }}"; private static final String REQUEST_SELECT_TEST_ES_3 = "{$query: { $match : { 'Description' : 'est OK description' , '$max_expansions' : 1 } }}"; private static final String REQUEST_SELECT_TEST_ES_4 = "{$query: { $or : [ { $match : { 'Title' : 'Vitam' , '$max_expansions' : 1 } }, " + "{$match : { 'Description' : 'vitam' , '$max_expansions' : 1 } }" + "] } }"; private static final String REQUEST_INSERT_TEST_ES = "{ \"#id\": \"aebaaaaaaaaaaaabaahbcakzu2stfryaaaaq\", \"#tenant\": 0, \"Title\": \"title vitam\", \"Description\": \"description est OK\" }"; private static final String REQUEST_INSERT_TEST_ES_2 = "{ \"#id\": \"aeaqaaaaaet33ntwablhaaku6z67pzqaaaar\", \"#tenant\": 0, \"Title\": \"title vitam\", \"Description\": \"description est OK\" }"; private static final String REQUEST_INSERT_TEST_ES_3 = "{ \"#id\": \"aeaqaaaaaet33ntwablhaaku6z67pzqaaaat\", \"#tenant\": 0, \"Title\": \"title vitam\", \"Description\": \"description est OK\" }"; private static final String REQUEST_INSERT_TEST_ES_4 = "{ \"#id\": \"aeaqaaaaaet33ntwablhaaku6z67pzqaaaas\", \"#tenant\": 0, \"Title\": \"title sociales test_underscore othervalue france.pdf\", \"Description\": \"description est OK\" }"; private static final String REQUEST_UPDATE_INDEX_TEST_ELASTIC = "{$query: { $eq : [ { $term : { 'Title' : 'vitam' , '$max_expansions' : 1 } }] } }"; private static final String REQUEST_UPDATE_INDEX_TEST = "{$roots:['aeaqaaaaaaaaaaabab4roakztdjqziaaaaaq'],$query:[],$filter:{},$action:[{$set:{'date':'09/09/2015'}},{$set:{'title':'Archive2'}}]}"; private static final String REQUEST_SELECT_TEST_ES_UPDATE = "{$query: { $match : { '#id' : 'aeaqaaaaaaaaaaabab4roakztdjqziaaaaaq' , '$max_expansions' : 1 } }}"; private static final String REQUEST_INSERT_TEST_ES_UPDATE = "{ \"#id\": \"aeaqaaaaaaaaaaabab4roakztdjqziaaaaaq\", \"#tenant\": 0, \"title\": \"Archive3\" }"; /** * @throws java.lang.Exception */ @BeforeClass public static void setUp() throws Exception { junitHelper = JunitHelper.getInstance(); try { config = JunitHelper.startElasticsearchForTest(tempFolder, CLUSTER_NAME); } catch (final VitamApplicationServerException e1) { assumeTrue(false); } final List<ElasticsearchNode> nodes = new ArrayList<>(); nodes.add(new ElasticsearchNode(HOST_NAME, config.getTcpPort())); esClient = new ElasticsearchAccessMetadata(CLUSTER_NAME, nodes); final MongodStarter starter = MongodStarter.getDefaultInstance(); port = junitHelper.findAvailablePort(); mongodExecutable = starter.prepare(new MongodConfigBuilder() .version(Version.Main.PRODUCTION) .net(new Net(port, Network.localhostIsIPv6())) .build()); mongod = mongodExecutable.start(); final MongoClientOptions options = MongoDbAccessMetadataImpl.getMongoClientOptions(); mongoClient = new MongoClient(new ServerAddress(DATABASE_HOST, port), options); mongoDbAccess = new MongoDbAccessMetadataImpl(mongoClient, "vitam-test", CREATE, esClient, tenantList); mongoDbVarNameAdapter = new MongoDbVarNameAdapter(); } /** * @throws java.lang.Exception */ @AfterClass public static void tearDown() throws Exception { if (config == null) { return; } if (DROP) { for (final MetadataCollections col : MetadataCollections.values()) { if (col.getCollection() != null) { col.getCollection().drop(); } } } mongoDbAccess.close(); mongod.stop(); mongodExecutable.stop(); junitHelper.releasePort(port); JunitHelper.stopElasticsearchForTest(config); esClient.close(); } /** * Test method for * {@link fr.gouv.vitam.database.collections.DbRequest#execRequest(fr.gouv.vitam.request.parser.RequestParser, fr.gouv.vitam.database.collections.Result)} * . * * @throws MetaDataExecutionException */ @Test(expected = MetaDataExecutionException.class) @RunWithCustomExecutor public void testExecRequest() throws MetaDataExecutionException { // input data VitamThreadUtils.getVitamSession().setTenantId(tenantId); final GUID uuid = GUIDFactory.newUnitGUID(tenantId); try { final DbRequest dbRequest = new DbRequest(); // INSERT final JsonNode insertRequest = createInsertRequestWithUUID(uuid); // Now considering insert request and parsing it as in Data Server (POST command) final InsertParserMultiple insertParser = new InsertParserMultiple(mongoDbVarNameAdapter); try { insertParser.parse(insertRequest); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("InsertParser: {}", insertParser); // Now execute the request executeRequest(dbRequest, insertParser); // SELECT JsonNode selectRequest = createSelectRequestWithUUID(uuid); // Now considering select request and parsing it as in Data Server (GET command) final SelectParserMultiple selectParser = new SelectParserMultiple(mongoDbVarNameAdapter); try { selectParser.parse(selectRequest); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectParser: {}", selectParser); // Now execute the request executeRequest(dbRequest, selectParser); // UPDATE final JsonNode updateRequest = createUpdateRequestWithUUID(uuid); // Now considering update request and parsing it as in Data Server (PATCH command) final UpdateParserMultiple updateParser = new UpdateParserMultiple(mongoDbVarNameAdapter); try { updateParser.parse(updateRequest); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("UpdateParser: {}", updateParser); // Now execute the request executeRequest(dbRequest, updateParser); // SELECT ALL selectRequest = createSelectAllRequestWithUUID(uuid); // Now considering select request and parsing it as in Data Server (GET command) try { selectParser.parse(selectRequest); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectParser: {}", selectParser); // Now execute the request executeRequest(dbRequest, selectParser); // DELETE final JsonNode deleteRequest = createDeleteRequestWithUUID(uuid); // Now considering delete request and parsing it as in Data Server (DELETE command) final DeleteParserMultiple deleteParser = new DeleteParserMultiple(mongoDbVarNameAdapter); try { deleteParser.parse(deleteRequest); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("DeleteParser: " + deleteParser.toString()); // Now execute the request executeRequest(dbRequest, deleteParser); } catch (MetaDataAlreadyExistException e1) { e1.printStackTrace(); fail(e1.getMessage()); } catch (MetaDataNotFoundException e1) { e1.printStackTrace(); fail(e1.getMessage()); } catch (InstantiationException e1) { e1.printStackTrace(); fail(e1.getMessage()); } catch (IllegalAccessException e1) { e1.printStackTrace(); fail(e1.getMessage()); } catch (InvalidParseOperationException e1) { e1.printStackTrace(); fail(e1.getMessage()); } finally { // clean MetadataCollections.C_UNIT.getCollection().deleteOne(new Document(MetadataDocument.ID, uuid.toString())); } } /** * Test method for * {@link fr.gouv.vitam.database.collections.DbRequest#execRequest(fr.gouv.vitam.request.parser.RequestParser, fr.gouv.vitam.database.collections.Result)} * . */ @Test(expected = MetaDataExecutionException.class) @RunWithCustomExecutor public void testExecRequestThroughRequestParserHelper() throws MetaDataExecutionException { VitamThreadUtils.getVitamSession().setTenantId(tenantId); // input data final GUID uuid = GUIDFactory.newUnitGUID(tenantId); try { final DbRequest dbRequest = new DbRequest(); RequestParserMultiple requestParser = null; // INSERT final JsonNode insertRequest = createInsertRequestWithUUID(uuid); // Now considering insert request and parsing it as in Data Server (POST command) try { requestParser = RequestParserHelper.getParser(insertRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("InsertParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // SELECT JsonNode selectRequest = createSelectRequestWithUUID(uuid); // Now considering select request and parsing it as in Data Server (GET command) try { requestParser = RequestParserHelper.getParser(selectRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // UPDATE final JsonNode updateRequest = createUpdateRequestWithUUID(uuid); // Now considering update request and parsing it as in Data Server (PATCH command) try { requestParser = RequestParserHelper.getParser(updateRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("UpdateParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // SELECT ALL selectRequest = createSelectAllRequestWithUUID(uuid); // Now considering select request and parsing it as in Data Server (GET command) try { requestParser = RequestParserHelper.getParser(selectRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // DELETE final JsonNode deleteRequest = createDeleteRequestWithUUID(uuid); // Now considering delete request and parsing it as in Data Server (DELETE command) try { requestParser = RequestParserHelper.getParser(deleteRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("DeleteParser: " + requestParser.toString()); executeRequest(dbRequest, requestParser); } catch (MetaDataAlreadyExistException e1) { e1.printStackTrace(); fail(e1.getMessage()); } catch (MetaDataNotFoundException e1) { e1.printStackTrace(); fail(e1.getMessage()); } catch (InstantiationException e1) { e1.printStackTrace(); fail(e1.getMessage()); } catch (IllegalAccessException e1) { e1.printStackTrace(); fail(e1.getMessage()); } catch (InvalidParseOperationException e1) { e1.printStackTrace(); fail(e1.getMessage()); } finally { // clean MetadataCollections.C_UNIT.getCollection().deleteOne(new Document(MetadataDocument.ID, uuid.toString())); } } /** * Test method for * {@link fr.gouv.vitam.database.collections.DbRequest#execRequest(fr.gouv.vitam.request.parser.RequestParser, fr.gouv.vitam.database.collections.Result)} * . * * @throws InvalidParseOperationException * @throws IllegalAccessException * @throws InstantiationException * @throws MetaDataNotFoundException * @throws MetaDataAlreadyExistException * @throws MetaDataExecutionException */ @Test(expected = MetaDataExecutionException.class) @RunWithCustomExecutor public void testExecRequestThroughAllCommands() throws MetaDataExecutionException, MetaDataAlreadyExistException, MetaDataNotFoundException, InstantiationException, IllegalAccessException, InvalidParseOperationException { VitamThreadUtils.getVitamSession().setTenantId(tenantId); // input data final GUID uuid = GUIDFactory.newUnitGUID(tenantId); try { final DbRequest dbRequest = new DbRequest(); RequestParserMultiple requestParser = null; // INSERT final JsonNode insertRequest = createInsertRequestWithUUID(uuid); // Now considering insert request and parsing it as in Data Server (POST command) try { requestParser = RequestParserHelper.getParser(insertRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("InsertParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // SELECT JsonNode selectRequest = createSelectRequestWithUUID(uuid); // Now considering select request and parsing it as in Data Server (GET command) try { requestParser = RequestParserHelper.getParser(selectRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // UPDATE final JsonNode updateRequest = clientRichUpdateBuild(uuid); // Now considering update request and parsing it as in Data Server (PATCH command) try { requestParser = RequestParserHelper.getParser(updateRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("UpdateParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // SELECT ALL selectRequest = createSelectAllRequestWithUUID(uuid); // Now considering select request and parsing it as in Data Server (GET command) try { requestParser = RequestParserHelper.getParser(selectRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // SELECT ALL selectRequest = clientRichSelectAllBuild(uuid); // Now considering select request and parsing it as in Data Server (GET command) try { requestParser = RequestParserHelper.getParser(selectRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // DELETE final JsonNode deleteRequest = createDeleteRequestWithUUID(uuid); // Now considering delete request and parsing it as in Data Server (DELETE command) try { requestParser = RequestParserHelper.getParser(deleteRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("DeleteParser: " + requestParser.toString()); // Now execute the request executeRequest(dbRequest, requestParser); } finally { // clean MetadataCollections.C_UNIT.getCollection().deleteOne(new Document(MetadataDocument.ID, uuid.toString())); } } /** * Test method for * {@link fr.gouv.vitam.database.collections.DbRequest#execRequest(fr.gouv.vitam.request.parser.RequestParser, fr.gouv.vitam.database.collections.Result)} * . * * @throws Exception */ @Test(expected = MetaDataExecutionException.class) @RunWithCustomExecutor public void testExecRequestMultiple() throws Exception { // input data VitamThreadUtils.getVitamSession().setTenantId(tenantId); final GUID uuid = GUIDFactory.newUnitGUID(tenantId); final GUID uuid2 = GUIDFactory.newUnitGUID(tenantId); final GUID uuid3 = GUIDFactory.newUnitGUID(tenantId); try { final DbRequest dbRequest = new DbRequest(); RequestParserMultiple requestParser = null; // INSERT JsonNode insertRequest = createInsertRequestWithUUID(uuid); // Now considering insert request and parsing it as in Data Server (POST command) requestParser = RequestParserHelper.getParser(insertRequest, mongoDbVarNameAdapter); LOGGER.debug("InsertParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); insertRequest = createInsertChild2ParentRequest(uuid2, uuid, 2); // Now considering insert request and parsing it as in Data Server (POST command) requestParser = RequestParserHelper.getParser(insertRequest, mongoDbVarNameAdapter); LOGGER.debug("InsertParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // SELECT JsonNode selectRequest = createSelectRequestWithUUID(uuid); // Now considering select request and parsing it as in Data Server (GET command) try { requestParser = RequestParserHelper.getParser(selectRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // SELECT selectRequest = clientSelect2Build(uuid2); // Now considering select request and parsing it as in Data Server (GET command) try { requestParser = RequestParserHelper.getParser(selectRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // SELECT selectRequest = clientSelectMultipleBuild(uuid, uuid2); // Now considering select request and parsing it as in Data Server (GET command) try { requestParser = RequestParserHelper.getParser(selectRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // UPDATE final JsonNode updateRequest = createUpdateRequestWithUUID(uuid); // Now considering update request and parsing it as in Data Server (PATCH command) try { requestParser = RequestParserHelper.getParser(updateRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("UpdateParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // SELECT ALL selectRequest = createSelectAllRequestWithUUID(uuid); // Now considering select request and parsing it as in Data Server (GET command) try { requestParser = RequestParserHelper.getParser(selectRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // INSERT a third AU insertRequest = createInsertChild2ParentRequest(uuid3, uuid2, 3); // Now considering insert request and parsing it as in Data Server (POST command) requestParser = RequestParserHelper.getParser(insertRequest, mongoDbVarNameAdapter); LOGGER.debug("InsertParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // Check $size Select select = new Select(); try { select.addUsedProjection(id(), TITLE, DESCRIPTION, VitamFieldsHelper.allunitups()) .addQueries(eq(id(), uuid.toString()), size(VitamFieldsHelper.allunitups(), 2).setDepthLimit(3)); } catch (InvalidCreateOperationException | InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectString: " + select.getFinalSelect().toString()); JsonNode selectJson = select.getFinalSelect(); // Now considering select request and parsing it as in Data Server (GET command) try { requestParser = RequestParserHelper.getParser(selectJson, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectParser: {}", requestParser); // Now execute the request executeRequest(dbRequest, requestParser); // DELETE JsonNode deleteRequest = clientDelete2Build(uuid2); // Now considering delete request and parsing it as in Data Server (DELETE command) try { requestParser = RequestParserHelper.getParser(deleteRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("DeleteParser: " + requestParser.toString()); // Now execute the request executeRequest(dbRequest, requestParser); deleteRequest = createDeleteRequestWithUUID(uuid); // Now considering delete request and parsing it as in Data Server (DELETE command) try { requestParser = RequestParserHelper.getParser(deleteRequest, mongoDbVarNameAdapter); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("DeleteParser: " + requestParser.toString()); // Now execute the request executeRequest(dbRequest, requestParser); } finally { // clean MetadataCollections.C_UNIT.getCollection().deleteOne(new Document(MetadataDocument.ID, uuid.toString())); MetadataCollections.C_UNIT.getCollection().deleteOne(new Document(MetadataDocument.ID, uuid2.toString())); } } @Test @RunWithCustomExecutor public void testInsertUnitRequest() throws Exception { final GUID uuid = GUIDFactory.newUnitGUID(tenantId); final GUID uuid2 = GUIDFactory.newUnitGUID(tenantId); VitamThreadUtils.getVitamSession().setTenantId(0); final DbRequest dbRequest = new DbRequest(); RequestParserMultiple requestParser = null; requestParser = RequestParserHelper.getParser(createInsertRequestWithUUID(uuid), mongoDbVarNameAdapter); executeRequest(dbRequest, requestParser); assertEquals(1, MetadataCollections.C_UNIT.getCollection().count()); requestParser = RequestParserHelper.getParser(createInsertChild2ParentRequest(uuid2, uuid, 2), mongoDbVarNameAdapter); executeRequest(dbRequest, requestParser); assertEquals(2, MetadataCollections.C_UNIT.getCollection().count()); } /** * @param dbRequest * @param requestParser * @throws InvalidParseOperationException * @throws IllegalAccessException * @throws InstantiationException * @throws MetaDataNotFoundException * @throws MetaDataAlreadyExistException * @throws MetaDataExecutionException */ private void executeRequest(DbRequest dbRequest, RequestParserMultiple requestParser) throws MetaDataExecutionException, MetaDataAlreadyExistException, MetaDataNotFoundException, InstantiationException, IllegalAccessException, InvalidParseOperationException { final Result result = dbRequest.execRequest(requestParser, null); LOGGER.debug("XXXXXXXX " + requestParser.getClass().getSimpleName() + " Result XXXXXXXX: " + result); assertEquals("Must have 1 result", result.getNbResult(), 1); assertEquals("Must have 1 result", result.getCurrentIds().size(), 1); } /** * @param uuid * @return */ private JsonNode createDeleteRequestWithUUID(GUID uuid) { final Delete delete = new Delete(); try { delete.addQueries(and().add(eq(id(), uuid.toString()), eq(TITLE, VALUE_MY_TITLE))); } catch (final InvalidCreateOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("DeleteString: " + delete.getFinalDelete().toString()); return delete.getFinalDelete(); } /** * @param uuid * @return */ private JsonNode createSelectAllRequestWithUUID(GUID uuid) { final Select select = new Select(); try { select.addUsedProjection(all()) .addQueries(and().add(eq(id(), uuid.toString()), eq(TITLE, VALUE_MY_TITLE))); } catch (InvalidCreateOperationException | InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } // selectRequestString = select.getFinalSelect().toString(); LOGGER.debug("SelectAllString: " + select.getFinalSelect().toString()); return select.getFinalSelect(); } /** * @param uuid * @return */ private JsonNode createUpdateRequestWithUUID(GUID uuid) { final Update update = new Update(); try { update.addActions(set("NewVar", false), inc(MY_INT, 2), set(DESCRIPTION, "New description")) .addQueries(and().add(eq(id(), uuid.toString()), eq(TITLE, VALUE_MY_TITLE))); } catch (final InvalidCreateOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("UpdateString: " + update.getFinalUpdate().toString()); return update.getFinalUpdate(); } /** * @param uuid * @return */ private JsonNode createSelectRequestWithUUID(GUID uuid) { final Select select = new Select(); try { select.addUsedProjection(id(), TITLE, DESCRIPTION) .addQueries(and().add(eq(id(), uuid.toString()), eq(TITLE, VALUE_MY_TITLE))); } catch (InvalidCreateOperationException | InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectString: " + select.getFinalSelect().toString()); return select.getFinalSelect(); } /** * @param uuid * @return */ private JsonNode createInsertRequestWithUUID(GUID uuid) { // INSERT final List<String> list = Arrays.asList("val1", "val2"); final ObjectNode data = JsonHandler.createObjectNode().put(id(), uuid.toString()) .put(TITLE, VALUE_MY_TITLE).put(DESCRIPTION, "Ma description est bien détaillée") .put(CREATED_DATE, "" + LocalDateUtil.now()).put(MY_INT, 20) .put(tenant(), tenantId) .put(MY_BOOLEAN, false).putNull(EMPTY_VAR).put(MY_FLOAT, 2.0); try { data.putArray(ARRAY_VAR).addAll((ArrayNode) JsonHandler.toJsonNode(list)); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } try { data.putArray(ARRAY2_VAR).addAll((ArrayNode) JsonHandler.toJsonNode(list)); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } final Insert insert = new Insert(); insert.addData(data); LOGGER.debug("InsertString: " + insert.getFinalInsert().toString()); return insert.getFinalInsert(); } /** * @param uuid child * @param uuid2 parent * @return */ private JsonNode createInsertChild2ParentRequest(GUID child, GUID parent, int rank) throws Exception { final ObjectNode data = JsonHandler.createObjectNode().put(id(), child.toString()) .put(TITLE, VALUE_MY_TITLE + rank).put(DESCRIPTION, "Ma description vitam" + rank) .put(CREATED_DATE, "" + LocalDateUtil.now()).put(MY_INT, 10); final Insert insert = new Insert(); insert.addData(data).addQueries(eq(VitamFieldsHelper.id(), parent.toString()).setDepthLimit(rank)); LOGGER.debug("InsertString: " + insert.getFinalInsert().toString()); return insert.getFinalInsert(); } /** * @param uuid * @return */ private JsonNode clientRichSelectAllBuild(GUID uuid) { final Select select = new Select(); try { select.addUsedProjection(all()) .addQueries(and().add(eq(id(), uuid.toString()), eq(TITLE, VALUE_MY_TITLE), exists(CREATED_DATE), missing(UNKNOWN_VAR), isNull(EMPTY_VAR), or().add(in(ARRAY_VAR, "val1"), nin(ARRAY_VAR, "val3")), gt(MY_INT, 1), lt(MY_INT, 100), ne(MY_BOOLEAN, true), range(MY_FLOAT, 1.0, false, 100.0, true), term(TITLE, VALUE_MY_TITLE), size(ARRAY2_VAR, 2))); } catch (InvalidCreateOperationException | InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectAllString: " + select.getFinalSelect().toString()); return select.getFinalSelect(); } /** * @param uuid * @return */ private JsonNode clientRichUpdateBuild(GUID uuid) { final Update update = new Update(); try { update.addActions(set("NewVar", false), inc(MY_INT, 2), set(DESCRIPTION, "New description"), unset(UNKNOWN_VAR), push(ARRAY_VAR, "val2"), min(MY_FLOAT, 1.5), add(ARRAY2_VAR, "val2")) .addQueries(and().add(eq(id(), uuid.toString()), eq(TITLE, VALUE_MY_TITLE))); } catch (final InvalidCreateOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("UpdateString: " + update.getFinalUpdate().toString()); return update.getFinalUpdate(); } /** * @param uuid * @return */ private JsonNode clientSelect2Build(GUID uuid) { final Select select = new Select(); try { select.addUsedProjection(id(), TITLE, DESCRIPTION) .addQueries(eq(id(), uuid.toString()).setDepthLimit(2)); } catch (InvalidCreateOperationException | InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectString: " + select.getFinalSelect().toString()); return select.getFinalSelect(); } /** * @param uuid father * @param uuid2 son * @return */ private JsonNode clientSelectMultipleBuild(GUID uuid, GUID uuid2) { final Select select = new Select(); try { select.addUsedProjection(id(), TITLE, DESCRIPTION) .addQueries(and().add(eq(id(), uuid.toString()), eq(TITLE, VALUE_MY_TITLE)), eq(id(), uuid2.toString())); } catch (InvalidCreateOperationException | InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("SelectString: " + select.getFinalSelect().toString()); return select.getFinalSelect(); } /** * @param uuid * @return */ private JsonNode clientDelete2Build(GUID uuid) { final Delete delete = new Delete(); try { delete.addQueries(path(uuid.toString())); } catch (final InvalidCreateOperationException e) { e.printStackTrace(); fail(e.getMessage()); } LOGGER.debug("DeleteString: " + delete.getFinalDelete().toString()); return delete.getFinalDelete(); } @Test @RunWithCustomExecutor public void testResult() throws Exception { VitamThreadUtils.getVitamSession().setTenantId(0); final DbRequest dbRequest = new DbRequest(); final InsertParserMultiple insertParser = new InsertParserMultiple(mongoDbVarNameAdapter); LOGGER.debug("InsertParser: {}", insertParser); final Result result = dbRequest.execRequest(insertParser, null); assertEquals("Document{{results=null}}", result.getFinal().toString()); final Bson projection = null; result.setFinal(projection); assertEquals(1, result.currentIds.size()); assertEquals(1, (int) result.nbResult); result.putFrom(result); assertEquals(1, result.currentIds.size()); assertEquals(1, (int) result.nbResult); final Set<String> currentIds = new HashSet<>(); currentIds.add("UNITS"); currentIds.add("OBJECTGROUPS"); result.setCurrentIds(currentIds); assertEquals(2, result.currentIds.size()); } @Test public void testMongoDbAccess() { for (final MetadataCollections col : MetadataCollections.values()) { if (col.getCollection() != null) { col.getCollection().drop(); } } final MongoDatabase db = mongoDbAccess.getMongoDatabase(); assertEquals(0, db.getCollection("Unit").count()); assertEquals(0, db.getCollection("Objectgroup").count()); mongoDbAccess = new MongoDbAccessMetadataImpl(mongoClient, "vitam-test", CREATE, esClient, tenantList); assertNotNull(mongoDbAccess.toString()); } private ObjectNode createInsertRequestGO(GUID uuid, GUID uuidParent) throws InvalidParseOperationException { // Create Insert command as in Internal Vitam Modules final Insert insert = new Insert(); insert.resetFilter(); insert.addHintFilter(BuilderToken.FILTERARGS.OBJECTGROUPS.exactToken()); final JsonNode json = JsonHandler.getFromString("{\"#id\":\"" + uuid + "\", \"#qualifiers\" :{\"Physique Master\" : {\"PhysiqueOId\" : \"abceff\", \"Description\" : \"Test\"}}, \"title\":\"title1\"}"); insert.addData((ObjectNode) json); insert.addRoots(uuidParent.getId()); final ObjectNode insertRequest = insert.getFinalInsert(); LOGGER.debug("InsertString: " + insertRequest); return insertRequest; } @Test @RunWithCustomExecutor public void testInsertGORequest() throws Exception { final GUID uuid = GUIDFactory.newUnitGUID(tenantId); VitamThreadUtils.getVitamSession().setTenantId(0); final DbRequest dbRequest = new DbRequest(); RequestParserMultiple requestParser = null; requestParser = RequestParserHelper.getParser(createInsertRequestWithUUID(uuid), mongoDbVarNameAdapter); executeRequest(dbRequest, requestParser); Result result = checkExistence(dbRequest, uuid, false); assertFalse(result.isError()); final GUID uuid2 = GUIDFactory.newObjectGroupGUID(tenantId); requestParser = new InsertParserMultiple(mongoDbVarNameAdapter); requestParser.parse(createInsertRequestGO(uuid2, uuid)); executeRequest(dbRequest, requestParser); result = checkExistence(dbRequest, uuid2, true); assertFalse(result.isError()); } private Result checkExistence(DbRequest dbRequest, GUID uuid, boolean isOG) throws InvalidCreateOperationException, InvalidParseOperationException, MetaDataExecutionException, MetaDataAlreadyExistException, MetaDataNotFoundException, InstantiationException, IllegalAccessException { final Select select = new Select(); select.addQueries(eq(VitamFieldsHelper.id(), uuid.getId())); if (isOG) { select.addHintFilter(BuilderToken.FILTERARGS.OBJECTGROUPS.exactToken()); } final SelectParserMultiple selectParser = new SelectParserMultiple(mongoDbVarNameAdapter); selectParser.parse(select.getFinalSelect()); return dbRequest.execRequest(selectParser, null); } @Test @RunWithCustomExecutor public void testUnitParentForlastInsertFilterProjection() throws Exception { final DbRequest dbRequest = new DbRequest(); VitamThreadUtils.getVitamSession().setTenantId(tenantId); final GUID uuid = GUIDFactory.newObjectGroupGUID(tenantId); final GUID uuidUnit = GUIDFactory.newUnitGUID(tenantId); final JsonNode insertRequest = createInsertRequestWithUUID(uuidUnit); final InsertParserMultiple insertParser = new InsertParserMultiple(mongoDbVarNameAdapter); try { insertParser.parse(insertRequest); } catch (final InvalidParseOperationException e) { fail(e.getMessage()); } executeRequest(dbRequest, insertParser); final Insert insert = new Insert(); insert.resetFilter(); insert.addHintFilter(BuilderToken.FILTERARGS.OBJECTGROUPS.exactToken()); insert.addRoots(uuidUnit.getId()); final ObjectNode json = (ObjectNode) JsonHandler.getFromString("{\"#id\":\"" + uuid + "\", \"#qualifiers\" :{\"Physique Master\" : {\"PhysiqueOId\" : \"abceff\", \"Description\" : \"Test\"}}, \"title\":\"title1\"}"); insert.addData(json); final ObjectNode insertNode = insert.getFinalInsert(); final RequestParserMultiple requestParser = new InsertParserMultiple(mongoDbVarNameAdapter); requestParser.parse(insertNode); executeRequest(dbRequest, requestParser); assertFalse(requestParser.getRequest().getRoots().isEmpty()); // Check _og Result result = checkExistence(dbRequest, uuidUnit, false); assertFalse(result.isError()); BasicDBList list = (BasicDBList) result.getFinal().get(Result.RESULT_FIELD); final Document unit = (Document) list.get(0); assertTrue(unit.getString("_og").equals(uuid.getId())); // Check _up is set as _og result = checkExistence(dbRequest, uuid, true); assertFalse(result.isError()); list = (BasicDBList) result.getFinal().get(Result.RESULT_FIELD); final Document og = (Document) list.get(0); System.err.println(og); System.err.println(og.get("_up")); System.err.println(uuidUnit.getId()); assertTrue(((List<String>) og.get("_up")).contains(uuidUnit.getId())); } @Test @RunWithCustomExecutor public void testRequestWithObjectGroupQuery() throws Exception { VitamThreadUtils.getVitamSession().setTenantId(tenantId); final GUID uuid01 = GUIDFactory.newUnitGUID(tenantId); final DbRequest dbRequest = new DbRequest(); RequestParserMultiple requestParser = RequestParserHelper.getParser(createInsertRequestWithUUID(uuid01), mongoDbVarNameAdapter); executeRequest(dbRequest, requestParser); Result result = checkExistence(dbRequest, uuid01, false); assertFalse(result.isError()); final GUID uuid02 = GUIDFactory.newUnitGUID(tenantId); requestParser = RequestParserHelper.getParser(createInsertRequestWithUUID(uuid02), mongoDbVarNameAdapter); executeRequest(dbRequest, requestParser); result = checkExistence(dbRequest, uuid02, false); assertFalse(result.isError()); final GUID uuid1 = GUIDFactory.newObjectGroupGUID(tenantId); final GUID uuid2 = GUIDFactory.newObjectGroupGUID(tenantId); final Insert insert = new Insert(); insert.addHintFilter(BuilderToken.FILTERARGS.OBJECTGROUPS.exactToken()); final ObjectNode json = (ObjectNode) JsonHandler.getFromString("{\"#id\":\"" + uuid1 + "\", \"#qualifiers\" :{\"Physique Master\" : {\"PhysiqueOId\" : \"abceff\", \"Description\" : \"Test\"}}, \"title\":\"title1\"}"); final ObjectNode json1 = (ObjectNode) JsonHandler.getFromString("{\"#id\":\"" + uuid2 + "\", \"#qualifiers\" :{\"Physique Master\" : {\"PhysiqueOId\" : \"abceff\", \"Description1\" : \"Test\"}}, \"title\":\"title1\"}"); insert.addData(json).addRoots(uuid01.getId()); ObjectNode insertRequestString = insert.getFinalInsert(); requestParser = new InsertParserMultiple(mongoDbVarNameAdapter); requestParser.parse(insertRequestString); executeRequest(dbRequest, requestParser); final PathQuery query = path(uuid02.getId()); insert.reset().addQueries(query).addHintFilter(BuilderToken.FILTERARGS.OBJECTGROUPS.exactToken()); insert.addData(json1); insertRequestString = insert.getFinalInsert(); final RequestParserMultiple requestParser1 = new InsertParserMultiple(mongoDbVarNameAdapter); requestParser1.parse(insertRequestString); executeRequest(dbRequest, requestParser1); } @Test @RunWithCustomExecutor public void testSelectResult() throws Exception { VitamThreadUtils.getVitamSession().setTenantId(tenantId); final DbRequest dbRequest = new DbRequest(); final JsonNode selectRequest = JsonHandler.getFromString(REQUEST_SELECT_TEST_2); final SelectParserMultiple selectParser = new SelectParserMultiple(); selectParser.parse(selectRequest); LOGGER.debug("SelectParser: {}", selectRequest); final Result result = dbRequest.execRequest(selectParser, null); assertEquals("Document{{results=null}}", result.getFinal().toString()); } @Test @RunWithCustomExecutor public void shouldSelectUnitResult() throws Exception { VitamThreadUtils.getVitamSession().setTenantId(tenantId); final DbRequest dbRequest = new DbRequest(); final JsonNode insertRequest = buildQueryJsonWithOptions("", REQUEST_INSERT_TEST_1); final InsertParserMultiple insertParser = new InsertParserMultiple(mongoDbVarNameAdapter); insertParser.parse(insertRequest); LOGGER.debug("InsertParser: {}", insertParser); Result result = dbRequest.execRequest(insertParser, null); LOGGER.debug("ExecInsert: {}", result); final JsonNode selectRequest = JsonHandler.getFromString(REQUEST_SELECT_TEST_1); final SelectParserMultiple selectParser = new SelectParserMultiple(mongoDbVarNameAdapter); selectParser.parse(selectRequest); LOGGER.debug("SelectParser: {}", selectRequest); final Result result2 = dbRequest.execRequest(selectParser, null); LOGGER.debug("ExecSelect: {}", result); assertEquals(1, result2.nbResult); } @Test @RunWithCustomExecutor public void shouldSelectNoResultSinceOtherTenantUsed() throws Exception { VitamThreadUtils.getVitamSession().setTenantId(5); final DbRequest dbRequest = new DbRequest(); // unit is insterted with tenantId = 0 final JsonNode insertRequest = buildQueryJsonWithOptions("", REQUEST_INSERT_TEST_2); final InsertParserMultiple insertParser = new InsertParserMultiple(mongoDbVarNameAdapter); insertParser.parse(insertRequest); LOGGER.debug("InsertParser: {}", insertParser); dbRequest.execRequest(insertParser, null); final JsonNode selectRequest = JsonHandler.getFromString(REQUEST_SELECT_TEST_2); final SelectParserMultiple selectParser = new SelectParserMultiple(); selectParser.parse(selectRequest); LOGGER.debug("SelectParser: {}", selectRequest); final Result result2 = dbRequest.execRequest(selectParser, null); assertEquals(0, result2.nbResult); } @Test @RunWithCustomExecutor public void shouldSelectUnitResultWithES() throws Exception { VitamThreadUtils.getVitamSession().setTenantId(TENANT_ID_0); esClient.deleteIndex(MetadataCollections.C_UNIT, TENANT_ID_0); esClient.addIndex(MetadataCollections.C_UNIT, TENANT_ID_0); //OG ??? final DbRequest dbRequest = new DbRequest(); final JsonNode insertRequest = buildQueryJsonWithOptions("", REQUEST_INSERT_TEST_ES); final InsertParserMultiple insertParser = new InsertParserMultiple(mongoDbVarNameAdapter); insertParser.parse(insertRequest); LOGGER.debug("InsertParser: {}", insertParser); dbRequest.execRequest(insertParser, null); final JsonNode selectRequest1 = JsonHandler.getFromString(REQUEST_SELECT_TEST_ES_1); final SelectParserMultiple selectParser1 = new SelectParserMultiple(); selectParser1.parse(selectRequest1); LOGGER.debug("SelectParser: {}", selectRequest1); esClient.refreshIndex(MetadataCollections.C_UNIT, TENANT_ID_0); final Result resultSelect1 = dbRequest.execRequest(selectParser1, null); assertEquals(1, resultSelect1.nbResult); final JsonNode selectRequest2 = JsonHandler.getFromString(REQUEST_SELECT_TEST_ES_2); final SelectParserMultiple selectParser2 = new SelectParserMultiple(); selectParser2.parse(selectRequest2); LOGGER.debug("SelectParser: {}", selectRequest2); final Result resultSelect2 = dbRequest.execRequest(selectParser2, null); assertEquals(1, resultSelect2.nbResult); final JsonNode selectRequest3 = JsonHandler.getFromString(REQUEST_SELECT_TEST_ES_3); final SelectParserMultiple selectParser3 = new SelectParserMultiple(); selectParser3.parse(selectRequest3); LOGGER.debug("SelectParser: {}", selectRequest3); final Result resultSelect3 = dbRequest.execRequest(selectParser3, null); assertEquals(1, resultSelect3.nbResult); final JsonNode selectRequest4 = JsonHandler.getFromString(REQUEST_SELECT_TEST_ES_4); final SelectParserMultiple selectParser4 = new SelectParserMultiple(); selectParser4.parse(selectRequest4); LOGGER.debug("SelectParser: {}", selectRequest4); final Result resultSelect4 = dbRequest.execRequest(selectParser4, null); assertEquals(1, resultSelect4.nbResult); Insert insert = new Insert(); insert.parseData(REQUEST_INSERT_TEST_ES_2).addRoots("aebaaaaaaaaaaaabaahbcakzu2stfryaaaaq"); insertParser.parse(insert.getFinalInsert()); LOGGER.debug("InsertParser: {}", insertParser); dbRequest.execRequest(insertParser, null); esClient.refreshIndex(MetadataCollections.C_UNIT, TENANT_ID_0); Select select = new Select(); select.addQueries(match("Description", "description OK").setDepthLimit(1)) .addRoots("aebaaaaaaaaaaaabaahbcakzu2stfryaaaaq"); selectParser1.parse(select.getFinalSelect()); LOGGER.debug("SelectParser: {}", selectParser1.getRequest()); final Result resultSelectRel0 = dbRequest.execRequest(selectParser1, null); assertEquals(1, resultSelectRel0.nbResult); assertEquals("aeaqaaaaaet33ntwablhaaku6z67pzqaaaar", resultSelectRel0.getCurrentIds().iterator().next().toString()); select = new Select(); select.addQueries(match("Description", "description OK").setDepthLimit(1)) .addRoots("aebaaaaaaaaaaaabaahbcakzu2stfryaaaaq"); selectParser1.parse(select.getFinalSelect()); LOGGER.debug("SelectParser: {}", selectParser1.getRequest()); final Result resultSelectRel1 = dbRequest.execRequest(selectParser1, null); assertEquals(1, resultSelectRel1.nbResult); assertEquals("aeaqaaaaaet33ntwablhaaku6z67pzqaaaar", resultSelectRel1.getCurrentIds().iterator().next().toString()); select = new Select(); select.addQueries(match("Description", "description OK").setDepthLimit(3)) .addRoots("aebaaaaaaaaaaaabaahbcakzu2stfryaaaaq"); selectParser1.parse(select.getFinalSelect()); LOGGER.debug("SelectParser: {}", selectParser1.getRequest()); final Result resultSelectRel3 = dbRequest.execRequest(selectParser1, null); assertEquals(1, resultSelectRel3.nbResult); assertEquals("aeaqaaaaaet33ntwablhaaku6z67pzqaaaar", resultSelectRel3.getCurrentIds().iterator().next().toString()); insert = new Insert(); insert.parseData(REQUEST_INSERT_TEST_ES_3).addRoots("aeaqaaaaaet33ntwablhaaku6z67pzqaaaar"); insertParser.parse(insert.getFinalInsert()); LOGGER.debug("InsertParser: {}", insertParser); dbRequest.execRequest(insertParser, null); esClient.refreshIndex(MetadataCollections.C_UNIT, TENANT_ID_0); final Result resultSelectRel4 = dbRequest.execRequest(selectParser1, null); assertEquals(2, resultSelectRel4.nbResult); for (final String root : resultSelectRel4.getCurrentIds()) { assertTrue(root.equalsIgnoreCase("aeaqaaaaaet33ntwablhaaku6z67pzqaaaat") || root.equalsIgnoreCase("aeaqaaaaaet33ntwablhaaku6z67pzqaaaar")); } insert = new Insert(); insert.parseData(REQUEST_INSERT_TEST_ES_4).addRoots("aebaaaaaaaaaaaabaahbcakzu2stfryaaaaq"); insertParser.parse(insert.getFinalInsert()); LOGGER.debug("InsertParser: {}", insertParser); dbRequest.execRequest(insertParser, null); esClient.refreshIndex(MetadataCollections.C_UNIT, TENANT_ID_0); select = new Select(); select.addQueries(match("Title", "othervalue").setDepthLimit(1)) .addRoots("aebaaaaaaaaaaaabaahbcakzu2stfryaaaaq"); selectParser1.parse(select.getFinalSelect()); LOGGER.debug("SelectParser: {}", selectParser1.getRequest()); final Result resultSelectRel5 = dbRequest.execRequest(selectParser1, null); assertEquals(1, resultSelectRel5.nbResult); assertEquals("aeaqaaaaaet33ntwablhaaku6z67pzqaaaas", resultSelectRel5.getCurrentIds().iterator().next().toString()); // Check for "France.pdf" select = new Select(); select.addRoots("aebaaaaaaaaaaaabaahbcakzu2stfryaaaaq").addQueries(match("Title", "Frânce").setDepthLimit(1)); selectParser1.parse(select.getFinalSelect()); LOGGER.debug("SelectParser: {}", selectParser1.getRequest()); final Result resultSelectRel6 = dbRequest.execRequest(selectParser1, null); assertEquals(1, resultSelectRel6.nbResult); assertEquals("aeaqaaaaaet33ntwablhaaku6z67pzqaaaas", resultSelectRel6.getCurrentIds().iterator().next().toString()); // Check for "social vs sociales" select = new Select(); select.addRoots("aebaaaaaaaaaaaabaahbcakzu2stfryaaaaq").addQueries(match("Title", "social").setDepthLimit(1)); selectParser1.parse(select.getFinalSelect()); LOGGER.debug("SelectParser: {}", selectParser1.getRequest()); final Result resultSelectRel7 = dbRequest.execRequest(selectParser1, null); assertEquals(1, resultSelectRel7.nbResult); assertEquals("aeaqaaaaaet33ntwablhaaku6z67pzqaaaas", resultSelectRel7.getCurrentIds().iterator().next().toString()); // Check for "name_with_underscore" select = new Select(); select.addRoots("aebaaaaaaaaaaaabaahbcakzu2stfryaaaaq") .addQueries(match("Title", "underscore").setDepthLimit(1)); selectParser1.parse(select.getFinalSelect()); LOGGER.debug("SelectParser: {}", selectParser1.getRequest()); final Result resultSelectRel8 = dbRequest.execRequest(selectParser1, null); assertEquals(1, resultSelectRel8.nbResult); assertEquals("aeaqaaaaaet33ntwablhaaku6z67pzqaaaas", resultSelectRel8.getCurrentIds().iterator().next().toString()); } @Test @RunWithCustomExecutor public void shouldSelectUnitResultWithESTenant1() throws Exception { VitamThreadUtils.getVitamSession().setTenantId(TENANT_ID_1); esClient.addIndex(MetadataCollections.C_UNIT, TENANT_ID_1); final DbRequest dbRequest = new DbRequest(); final JsonNode insertRequest = buildQueryJsonWithOptions("", REQUEST_INSERT_TEST_ES); final InsertParserMultiple insertParser = new InsertParserMultiple(mongoDbVarNameAdapter); insertParser.parse(insertRequest); LOGGER.debug("InsertParser: {}", insertParser); dbRequest.execRequest(insertParser, null); final JsonNode selectRequest1 = JsonHandler.getFromString(REQUEST_SELECT_TEST_ES_1); final SelectParserMultiple selectParser1 = new SelectParserMultiple(); selectParser1.parse(selectRequest1); LOGGER.debug("SelectParser: {}", selectRequest1); esClient.refreshIndex(MetadataCollections.C_UNIT, TENANT_ID_1); final Result resultSelect1 = dbRequest.execRequest(selectParser1, null); assertEquals(1, resultSelect1.nbResult); esClient.deleteIndex(MetadataCollections.C_UNIT, TENANT_ID_1); } @Test @RunWithCustomExecutor public void testUpdateUnitResult() throws Exception { VitamThreadUtils.getVitamSession().setTenantId(TENANT_ID_0); // insert title ARchive 3 final DbRequest dbRequest = new DbRequest(); final InsertParserMultiple insertParser = new InsertParserMultiple(mongoDbVarNameAdapter); final Insert insert = new Insert(); insert.parseData(REQUEST_INSERT_TEST_ES_UPDATE).addRoots("aeaqaaaaaaaaaaabab4roakztdjqziaaaaaq"); insertParser.parse(insert.getFinalInsert()); LOGGER.debug("InsertParser: {}", insertParser); dbRequest.execRequest(insertParser, null); esClient.refreshIndex(MetadataCollections.C_UNIT, TENANT_ID_0); // update title Archive 3 to Archive 2 final JsonNode updateRequest = JsonHandler.getFromString(REQUEST_UPDATE_INDEX_TEST); final UpdateParserMultiple updateParser = new UpdateParserMultiple(); updateParser.parse(updateRequest); LOGGER.debug("UpdateParser: {}", updateParser.getRequest()); final Result result2 = dbRequest.execRequest(updateParser, null); LOGGER.debug("result2", result2.getNbResult()); assertEquals(1, result2.nbResult); esClient.refreshIndex(MetadataCollections.C_UNIT, TENANT_ID_0); // check old value should not exist in the collection final JsonNode selectRequest2 = JsonHandler.getFromString(REQUEST_SELECT_TEST_ES_UPDATE); final SelectParserMultiple selectParser2 = new SelectParserMultiple(); final Select select1 = new Select(); select1.addQueries(eq("title", "Archive3").setDepthLimit(1)) .addRoots("aeaqaaaaaaaaaaabab4roakztdjqziaaaaaq"); selectParser2.parse(select1.getFinalSelect()); LOGGER.debug("SelectParser: {}", selectRequest2); final Result resultSelectRel6 = dbRequest.execRequest(selectParser2, null); assertEquals(0, resultSelectRel6.nbResult); // check new value should exist in the collection final JsonNode selectRequest1 = JsonHandler.getFromString(REQUEST_SELECT_TEST_ES_UPDATE); final SelectParserMultiple selectParser1 = new SelectParserMultiple(); final Select select = new Select(); select.addQueries(eq("title", "Archive2").setDepthLimit(1)).addRoots("aeaqaaaaaaaaaaabab4roakztdjqziaaaaaq"); selectParser1.parse(select.getFinalSelect()); LOGGER.debug("SelectParser: {}", selectRequest1); final Result resultSelectRel5 = dbRequest.execRequest(selectParser1, null); assertEquals(1, resultSelectRel5.nbResult); assertEquals("aeaqaaaaaaaaaaabab4roakztdjqziaaaaaq", resultSelectRel5.getCurrentIds().iterator().next().toString()); } private static final JsonNode buildQueryJsonWithOptions(String query, String data) throws Exception { return JsonHandler.getFromString(new StringBuilder() .append("{ $roots : [ '' ], ") .append("$query : [ " + query + " ], ") .append("$data : " + data + " }") .toString()); } @Test @RunWithCustomExecutor public void testInsertUnitWithTenant() throws Exception { VitamThreadUtils.getVitamSession().setTenantId(TENANT_ID_0); esClient.addIndex(MetadataCollections.C_UNIT, TENANT_ID_0); esClient.addIndex(MetadataCollections.C_UNIT, TENANT_ID_1); final DbRequest dbRequest = new DbRequest(); final JsonNode insertRequest = buildQueryJsonWithOptions("", REQUEST_INSERT_TEST_1); final InsertParserMultiple insertParser = new InsertParserMultiple(mongoDbVarNameAdapter); insertParser.parse(insertRequest); LOGGER.debug("InsertParser: {}", insertParser); dbRequest.execRequest(insertParser, null); final JsonNode selectRequest = JsonHandler.getFromString(REQUEST_SELECT_TEST_1); final SelectParserMultiple selectParser = new SelectParserMultiple(); selectParser.parse(selectRequest); LOGGER.debug("SelectParser: {}", selectRequest); VitamThreadUtils.getVitamSession().setTenantId(TENANT_ID_1); final Result result3 = dbRequest.execRequest(selectParser, null); assertEquals(0, result3.nbResult); } private JsonNode createInsertRequestGOTenant(GUID uuid) throws InvalidParseOperationException { // INSERT final List<String> list = Arrays.asList("val1", "val2"); final ObjectNode data = JsonHandler.createObjectNode().put(id(), uuid.toString()) .put(TITLE, VALUE_MY_TITLE).put(DESCRIPTION, "Ma description est bien détaillée") .put(CREATED_DATE, "" + LocalDateUtil.now()).put(MY_INT, 20) .put(tenant(), tenantId) .put(MY_BOOLEAN, false).putNull(EMPTY_VAR).put(MY_FLOAT, 2.0); try { data.putArray(ARRAY_VAR).addAll((ArrayNode) JsonHandler.toJsonNode(list)); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } try { data.putArray("_up").addAll((ArrayNode) JsonHandler.toJsonNode(list)); } catch (final InvalidParseOperationException e) { e.printStackTrace(); fail(e.getMessage()); } final Insert insert = new Insert(); insert.addHintFilter(BuilderToken.FILTERARGS.OBJECTGROUPS.exactToken()); insert.addData(data); LOGGER.debug("InsertString: " + insert.getFinalInsert().toString()); return insert.getFinalInsert(); } @Test @RunWithCustomExecutor public void testInsertGOWithTenant() throws Exception { VitamThreadUtils.getVitamSession().setTenantId(TENANT_ID_0); esClient.addIndex(MetadataCollections.C_OBJECTGROUP, TENANT_ID_0); esClient.addIndex(MetadataCollections.C_OBJECTGROUP, TENANT_ID_1); final GUID uuid = GUIDFactory.newObjectGroupGUID(TENANT_ID_0); final DbRequest dbRequest = new DbRequest(); RequestParserMultiple requestParser = null; requestParser = RequestParserHelper.getParser(createInsertRequestGOTenant(uuid), mongoDbVarNameAdapter); executeRequest(dbRequest, requestParser); final Select select = new Select(); select.addQueries(eq(VitamFieldsHelper.id(), uuid.getId())); select.addHintFilter(BuilderToken.FILTERARGS.OBJECTGROUPS.exactToken()); final SelectParserMultiple selectParser = new SelectParserMultiple(mongoDbVarNameAdapter); selectParser.parse(select.getFinalSelect()); final Result result = dbRequest.execRequest(selectParser, null); assertEquals(1, result.nbResult); VitamThreadUtils.getVitamSession().setTenantId(TENANT_ID_1); final Result result2 = dbRequest.execRequest(selectParser, null); assertEquals(0, result2.nbResult); } }