package org.basex.data; import static org.basex.query.func.Function.*; import java.util.*; import java.util.List; import org.basex.core.*; import org.basex.core.cmd.*; import org.basex.query.*; import org.junit.*; import org.junit.Test; import org.junit.runner.*; import org.junit.runners.*; import org.junit.runners.Parameterized.*; /** * This class tests the {@link MainOptions#UPDINDEX} and {@link MainOptions#AUTOOPTIMIZE} options. * * @author BaseX Team 2005-17, BSD License * @author Christian Gruen */ @RunWith(Parameterized.class) public final class IndexTest extends AdvancedQueryTest { /** Main memory flag. */ @Parameter public Object mainmem; /** * Mainmem parameters. * @return parameters */ @Parameters public static Collection<Object[]> params() { final List<Object[]> params = new ArrayList<>(); params.add(new Object[] { false }); params.add(new Object[] { true }); return params; } /** Test file. */ public static final String FILE = "src/test/resources/selective.xml"; /** * Initializes a test. */ @Before public void before() { set(MainOptions.MAINMEM, mainmem); } /** * Finalize test. */ @After public void after() { execute(new DropDB(NAME)); set(MainOptions.TOKENINDEX, false); set(MainOptions.UPDINDEX, false); set(MainOptions.AUTOOPTIMIZE, false); set(MainOptions.MAINMEM, false); } /** * Test. */ @Test public void updindexText() { set(MainOptions.UPDINDEX, true); execute(new CreateDB(NAME)); for(int i = 0; i < 5; i++) { execute(new Replace("x.xml", "<x><a>A</a><a>B</a></x>")); } query(_DB_TEXT.args(NAME, "A"), "A"); query(_DB_TEXT.args(NAME, "B"), "B"); query(_DB_INFO.args(NAME) + "//textindex/text()", "true"); } /** * Test. */ @Test public void updindexText2() { set(MainOptions.UPDINDEX, true); execute(new CreateDB(NAME)); for(int i = 0; i < 5; i++) { execute(new Replace("x.xml", "<x><a>A</a><a>B</a></x>")); execute(new Replace("x.xml", "<x><a>A</a><a>C</a></x>")); } query(_DB_TEXT.args(NAME, "A"), "A"); query(_DB_TEXT.args(NAME, "C"), "C"); query(_DB_TEXT.args(NAME, "B"), ""); } /** * Test. */ @Test public void updindexText3() { set(MainOptions.UPDINDEX, true); execute(new CreateDB(NAME)); for(int i = 0; i < 5; i++) { execute(new Replace("x.xml", "<x><a>A</a><a>BC</a><a>DEF</a></x>")); } query(_DB_TEXT.args(NAME, "A"), "A"); query(_DB_TEXT.args(NAME, "BC"), "BC"); query(_DB_TEXT.args(NAME, "DEF"), "DEF"); } /** * Test. */ @Test public void updindexAttribute() { set(MainOptions.UPDINDEX, true); execute(new CreateDB(NAME)); for(int i = 0; i < 5; i++) { execute(new Add("a", "<x c='c'/>")); execute(new Add("a", "<x a='a' b='b'/>")); execute(new Replace("a", "<x/>")); } query(_DB_ATTRIBUTE.args(NAME, "a"), ""); query(_DB_ATTRIBUTE.args(NAME, "b"), ""); query(_DB_ATTRIBUTE.args(NAME, "c"), ""); } /** * Test. */ @Test public void updindexToken() { set(MainOptions.UPDINDEX, true); set(MainOptions.TOKENINDEX, true); execute(new CreateDB(NAME)); execute(new Add("a", "<x c='c'/>")); query(_DB_TOKEN.args(NAME, "a"), ""); query(DATA.args(_DB_TOKEN.args(NAME, "c")), "c"); for(int i = 0; i < 5; i++) { execute(new Add("a", "<x c='c'/>")); execute(new Add("a", "<x a='a' b='b'/>")); execute(new Replace("a", "<x/>")); } query(_DB_TOKEN.args(NAME, "a"), ""); query(_DB_TOKEN.args(NAME, "b"), ""); query(_DB_TOKEN.args(NAME, "c"), ""); query(_DB_INFO.args(NAME) + "//tokenindex/text()", "true"); } /** * Test. */ @Test public void updindexReplace1() { set(MainOptions.UPDINDEX, true); execute(new CreateDB(NAME, "<X><A>q</A><B>q</B></X>")); query("replace node /X/A with 'x', replace node /X/B with 'y'", ""); } /** * Test. */ @Test public void updindexReplace2() { set(MainOptions.UPDINDEX, true); execute(new CreateDB(NAME)); execute(new Replace("A", "<X a='?' b='a' c='1'/>")); execute(new Replace("A", "<X a='?' b='b' c='2'/>")); execute(new Replace("A", "<X/>")); } /** * Test. */ @Test public void updindexOpenClose1() { final boolean openClose = !(Boolean) mainmem; set(MainOptions.UPDINDEX, true); execute(new CreateDB(NAME)); for(int i = 0; i < 5; i++) { if(openClose) execute(new Open(NAME)); execute(new Replace("x.xml", "<x><a>A</a><a>BC</a></x>")); if(openClose) execute(new Close()); } query(_DB_TEXT.args(NAME, "A"), "A"); query(_DB_TEXT.args(NAME, "BC"), "BC"); } /** * Test. */ @Test public void updindexOpenClose2() { final boolean openClose = !(Boolean) mainmem; set(MainOptions.UPDINDEX, true); execute(new CreateDB(NAME)); execute(new Replace("A", "<a/>")); execute(new Replace("B", "<a a='1'/>")); execute(new Replace("C", "<a a='1'/>")); execute(new Replace("A", "<a a='1'/>")); if(openClose) { execute(new Close()); execute(new Open(NAME)); } execute(new Delete("A")); } /** * Test. */ @Test public void autooptimize() { set(MainOptions.AUTOOPTIMIZE, true); execute(new CreateDB(NAME)); query(_DB_INFO.args(NAME) + "//textindex/text()", "true"); execute(new Replace("x.xml", "<a>A</a>")); query(_DB_INFO.args(NAME) + "//textindex/text()", "true"); query(_DB_REPLACE.args(NAME, "x.xml", "<a>B</a>")); query(_DB_INFO.args(NAME) + "//textindex/text()", "true"); set(MainOptions.AUTOOPTIMIZE, false); execute(new Optimize()); execute(new Replace("x.xml", "<a>C</a>")); query(_DB_INFO.args(NAME) + "//textindex/text()", "false"); execute(new Optimize()); query(_DB_INFO.args(NAME) + "//textindex/text()", "true"); query(_DB_REPLACE.args(NAME, "x.xml", "<a>D</a>")); query(_DB_INFO.args(NAME) + "//textindex/text()", "false"); } }