Выяснение состояния страницы с помощью драйвера Cassandra GOCQL (Golang) - PullRequest
0 голосов
/ 28 февраля 2019

Я пытался обернуть голову, как подкачка в 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 Ответ

0 голосов
/ 28 февраля 2019

Итак, как выясняется, WillSwitchPage() никогда не вернет true в любой точке цикла.Не уверен почему.Я думаю, это из-за того, что я использую MapScan() для управления внутренним циклом.

В любом случае, я нашел решение, проверив байт [] для самого состояния страницы в en dof цикла запроса.,Если драйвер достигает конца и не заполняет страницу, состояние страницы будет иметь 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
   }
}
...