Что-то, о чем здесь не упоминалось, хотя и немного похоже на вторую альтернативу принятого ответа, но отличается и невысокой стоимостью для большого иерархического запроса и простых элементов (insert update delete), будет добавлять столбец постоянных путей для каждого элемента.
some like:
id | name | path
19 | category1 | /19
20 | category2 | /19/20
21 | category3 | /19/20/21
22 | category4 | /19/20/21/22
Пример:
-- get children of category3:
SELECT * FROM my_table WHERE path LIKE '/19/20/21%'
-- Reparent an item:
UPDATE my_table SET path = REPLACE(path, '/19/20', '/15/16') WHERE path LIKE '/19/20/%'
Оптимизировать длину пути и ORDER BY path
, используя кодировку base36, вместо этого действительный числовой идентификатор пути
]
// base10 => base36
'1' => '1',
'10' => 'A',
'100' => '2S',
'1000' => 'RS',
'10000' => '7PS',
'100000' => '255S',
'1000000' => 'LFLS',
'1000000000' => 'GJDGXS',
'1000000000000' => 'CRE66I9S'
https://en.wikipedia.org/wiki/Base36
Подавление разделителя '/' с помощью фиксированной длины и отступов до encoded id
Подробное объяснение оптимизации здесь: https://bojanz.wordpress.com/2014/04/25/storing-hierarchical-data-materialized-path/
TODO
построение функции или процедуры для разделения пути для возвращающих предков одного элемента
Перед добавлением заголовка браузера в ArrayList «Заголовки» вы должны переключиться на вновь открытое окно и затем выполнить getTitle
. Пожалуйста, обратитесь к Модифицированному коду:
package practice;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.ArrayList;
import java.util.Set;
public class WindowSwitchProgram {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "src\\main\\resources\\drivers\\win\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("http://seleniumpractise.blogspot.com/");
driver.findElement(By.linkText("Multiple window examples")).click();
String parentWindw = driver.getWindowHandle();
ArrayList Titles = new ArrayList();
driver.findElement(By.xpath("//*[@id='post-body-6170641642826198246']/a[1]")).click();
Titles.add(driver.getTitle());
driver.switchTo().window(parentWindw);
driver.findElement(By.xpath("//*[@id=\"post-body-6170641642826198246\"]/a[2]")).click();
driver.switchTo().window(driver.getWindowHandles().toArray()[1].toString());
Titles.add(driver.getTitle());
driver.switchTo().window(parentWindw);
driver.findElement(By.xpath("//*[@id=\"post-body-6170641642826198246\"]/a[3]")).click();
//System.out.println(driver.getTitle());
driver.switchTo().window(driver.getWindowHandles().toArray()[2].toString());
Titles.add(driver.getTitle());
driver.switchTo().window(parentWindw);
Set allWindwHandles = driver.getWindowHandles();
int winCount = allWindwHandles.size();
System.out.println(winCount);
ArrayList tabs = new ArrayList(allWindwHandles);
for (int j = 1; j < winCount; j++) {
driver.switchTo().window(tabs.get(j).toString());
System.out.println(driver.getTitle());
System.out.println(Titles.get(j - 1));
}
}
}