Выяснение состояния страницы с помощью драйвера Cassandra GOCQL (Golang)
Я пытался обернуть голову, как работает подкачка в Apache Cassandra с функциями драйвера в GOlang.
У меня есть следующий код для извлечения строк
/// Assume all other prerequisites.
session, _ := cluster.CreateSession()
session.SetPageSize(100)
var pagestate []byte
query := session.Query(`select * from keyspace.my_table`)
query = query.PageState(pagestate)
if err := query.Exec(); != nil {
panic(err)
}
iter := query.Iter()
for {
row := map[string]interface{}{}
if !iter.MapScan(row) {
pagestate = iter.PageState()
break
}
/// Do whatever I need with row.
}
Чего я добиваюсь: таблица, на которую я ссылаюсь, огромная, более 18 тыс. Строк, и я хочу получить все из них для специальной операции наиболее эффективным способом, используя встроенную в драйвер страницу подкачки, чтобы запрос победил ' время истекло.
Проблема: я не уверен, как заставить запрос возобновить работу в состоянии предыдущей страницы. Я не уверен, включает ли это выполнение запроса в цикле и управление состоянием страницы за его пределами или нет. Я понимаю, как получить и установить состояние страницы, я не могу понять, как повторять запрос с новым состоянием страницы каждый раз без надлежащего условия остановки, когда вся подкачка страниц завершена.
Моя лучшая попытка:
var pagestate []byte
query := session.Query(`select * from keyspace.my_table`)
for {
query = query.PageState(pagestate)
if err := query.Exec(); != nil {
panic(err)
}
iter := query.Iter()
/// I don't know if I'm using this bool correct or not.
/// My assumption is that this would return false when a new page isn't
/// avaliable, thus meaning that all the pages have been filled and
/// the loop can exit.
if !iter.WillSwitchPage() {
break
}
for {
row := map[string]interface{}{}
if !iter.MapScan(row) {
pagestate = iter.PageState()
break
}
/// Do whatever I need with row.
}
}
Я делаю это правильно, или есть лучший способ добиться этого?
1 ответ
Итак, как оказалось, WillSwitchPage()
никогда не вернет true в любой точке цикла. Не уверен почему. Я думаю, это из-за того, как я использую MapScan()
контролировать внутренний цикл.
В любом случае, я нашел решение, проверив байт [] для самого состояния страницы в конце цикла запроса. Если драйвер достигает конца и не заполняет страницу, состояние страницы будет иметь 0 элементов, поэтому я использую это как условие остановки. Это может или не может быть самым элегантным или предполагаемым способом справиться с нумерацией драйверов, но он работает так, как хотел.
var pagestate []byte
query := session.Query(`select * from keyspace.my_table`)
for {
query = query.PageState(pagestate)
if err := query.Exec(); != nil {
panic(err)
}
iter := query.Iter()
for {
row := map[string]interface{}{}
if !iter.MapScan(row) {
pagestate = iter.PageState()
break
}
/// Do whatever I need with row.
}
if len(pagestate) == 0 {
break
}
}