Слишком много элементов для кортежа: 27, разрешено: 22

Я новичок в Slick и использую Slick 3.1.1. Мой стол выглядит так

import java.sql.{Blob, Timestamp}

import slick.collection.heterogeneous.HNil

import slick.driver.MySQLDriver.api._


case class AnomalyC(id: Int, serviceName: String, serviceId: String, timeUpdated: Timestamp, timestamp: Timestamp, anomalyCategoryId: Int,
                    userGroup:Int, riskValue: Float, activityTypeId: Int, destinationHost: String, userName: String, tenantId: Int, information:Blob, timeCreated: Timestamp, userId: Int, anomalyType:Int, anomalyValue:String, measure:Int,
                    userAction:Int, uniqueIdentifier:Int, similarCount:Int, trainingValue:String, state: Int, riskLevel:Int, userRiskLevel:Int,
                    userRiskScore: Float, response:Int)
class Anomaly(tag:Tag) extends Table[AnomalyC](tag, "Anomaly") {
  def id = column[Int]("id")
  def serviceName = column[String]("ServiceName")
  def serviceId = column[Int]("ServiceId")
  def timeUpdated = column[Timestamp]("TimeUpdated")
  def timestamp = column[Timestamp]("Timestamp")
  def anomalyCategoryId = column[Int]("AnomalyCategoryId")
  def userGroup = column[Int]("UserGroup")
  def riskValue = column[Float]("RiskValue")
  def activityTypeId = column[Int]("ActivityTypeId")
  def destinationHost = column[String]("DestinationHost")
  def userName = column[String]("UserName")
  def tenantId = column[Int]("TenantId")
  def information = column[Blob]("Information")
  def timeCreated = column[Timestamp]("TimeCreated")
  def userId = column[Int]("UserId")
  def anomalyType = column[Int]("AnomalyType")
  def anomalyValue = column[String]("AnomalyValue")
  def measure = column[Int]("Measure")
  def userAction = column[Int]("UserAction")
  def uniqueIdentifier = column[String]("UniqueIdentifier")
  def similarCount = column[Int]("SimilarCount")
  def trainingValue = column[String]("TrainingValue")
  def state = column[Int]("State")
  def riskLevel = column[Int]("RiskLevel")
  def userRiskLevel = column[Int]("UserRiskLevel")
  def userRiskScore = column[Float]("UserRiskScore")
  def response = column[Int]("Response")

  def * = (id, serviceName, serviceId, timeUpdated, timestamp, anomalyCategoryId, userGroup,
    riskValue, activityTypeId, destinationHost, userName, tenantId, information, timeCreated, userId, anomalyType, anomalyValue,
    measure, userAction, uniqueIdentifier, similarCount, trainingValue, state, riskLevel, userRiskLevel, userRiskScore, response)

}

Когда я запускаю это, я получаю сообщение об ошибке

Error:(57, 11) too many elements for tuple: 27, allowed: 22
  def * = (id, serviceName, serviceId, timeUpdated, timestamp, anomalyCategoryId, userGroup,
          ^

Что я делаю?


person daydreamer    schedule 12.05.2016    source источник
comment
Как было предложено, в настоящее время лучше всего использовать HLists. Вот пример, включая то, как вы настраиваете возможность генерации кода Slick для автоматически определять огромные таблицы для вас.   -  person ecoe    schedule 13.06.2018


Ответы (5)


Вы можете использовать HLists. Slick имеет свою собственную реализацию или, возможно, для лучшей совместимости вы можете использовать Shapeless. Вот статья, в которой это объясняется: http://underscore.io/blog/posts/2015/08/08/slickless.html

В качестве альтернативы вы можете использовать класс case вместо кортежа.

person cvogt    schedule 12.05.2016
comment
Какой бесформенный? Я использую Maven, какой вы принимаете? mvnrepository.com/search?q=shapeless - person daydreamer; 13.05.2016
comment
этот: github.com/milessabin/shapeless . Похоже, это новейший com.chuusai:shapeless:2.3.1 - person cvogt; 13.05.2016
comment
На самом деле вложенный кортеж был бы еще одним вариантом! - person cvogt; 13.05.2016

Следующее сработало для меня на основе направления, предоставленного @cvogt.

import java.sql.{Blob, Timestamp}

import slick.collection.heterogeneous.HNil
import slick.collection.heterogeneous.syntax._
import slick.driver.MySQLDriver.api._

class Anomaly(tag:Tag) extends Table[Int :: String :: Int :: Timestamp :: Timestamp :: Int :: Int :: Float :: Int :: String
   :: String :: Int ::Blob :: Timestamp :: Int ::Int ::String ::Int ::Int ::String ::Int ::String :: Int ::Int ::Int ::
  Float :: Int :: HNil ](tag, "Anomaly") {

  def id = column[Int]("id")
  def serviceName = column[String]("ServiceName")
  def serviceId = column[Int]("ServiceId")
  def timeUpdated = column[Timestamp]("TimeUpdated")
  def timestamp = column[Timestamp]("Timestamp")
  def anomalyCategoryId = column[Int]("AnomalyCategoryId")
  def userGroup = column[Int]("UserGroup")
  def riskValue = column[Float]("RiskValue")
  def activityTypeId = column[Int]("ActivityTypeId")
  def destinationHost = column[String]("DestinationHost")
  def userName = column[String]("UserName")
  def tenantId = column[Int]("TenantId")
  def information = column[Blob]("Information")
  def timeCreated = column[Timestamp]("TimeCreated")
  def userId = column[Int]("UserId")
  def anomalyType = column[Int]("AnomalyType")
  def anomalyValue = column[String]("AnomalyValue")
  def measure = column[Int]("Measure")
  def userAction = column[Int]("UserAction")
  def uniqueIdentifier = column[String]("UniqueIdentifier")
  def similarCount = column[Int]("SimilarCount")
  def trainingValue = column[String]("TrainingValue")
  def state = column[Int]("State")
  def riskLevel = column[Int]("RiskLevel")
  def userRiskLevel = column[Int]("UserRiskLevel")
  def userRiskScore = column[Float]("UserRiskScore")
  def response = column[Int]("Response")

   def *  = id :: serviceName :: serviceId :: timeUpdated :: timestamp :: anomalyCategoryId :: userGroup ::
  riskValue :: activityTypeId :: destinationHost :: userName :: tenantId :: information :: timeCreated :: userId :: anomalyType :: anomalyValue ::
  measure :: userAction :: uniqueIdentifier :: similarCount :: trainingValue :: state :: riskLevel :: userRiskLevel :: userRiskScore :: response :: HNil
}

Сборка запускается и тест проходит, однако я все еще вижу, что IntelliJ жалуется на следующую ошибку

введите здесь описание изображения

person daydreamer    schedule 12.05.2016

Согласно ответу @insan-e, я переписал это, и это тоже работает. Мне больше нравится этот подход, однако я не понимаю весь код целиком.

import java.sql.{Blob, Timestamp}

import slick.driver.MySQLDriver.api._

case class Anomaly1(id:Int, serviceName:String, serviceId: Int, timeUpdated: Timestamp, timeStamp: Timestamp,
                    anomalyCategoryId: Int, userGroup: Int, riskValue: Float, activityTypeId: Int, destinationHost: String, userName: String)

case class Anomaly2(tenantId: Int, information:Blob, timeCreated: Timestamp, userId: Int, anomalyType:Int, anomalyValue: String, measure: Int, userAction: Int,
                   uniqueIdentifier: String, similarCount: Int, trainingValue: String, state: Int, riskLevel: Int,
                    userRiskLevel: Int, userRiskScore: Float, response: Int)

case class AnomalyRow(anomaly1: Anomaly1, anomaly2: Anomaly2)

class Anomaly(tag:Tag) extends Table[AnomalyRow](tag, "Anomaly") {

  def id = column[Int]("id")
  def serviceName = column[String]("ServiceName")
  def serviceId = column[Int]("ServiceId")
  def timeUpdated = column[Timestamp]("TimeUpdated")
  def timestamp = column[Timestamp]("Timestamp")
  def anomalyCategoryId = column[Int]("AnomalyCategoryId")
  def userGroup = column[Int]("UserGroup")
  def riskValue = column[Float]("RiskValue")
  def activityTypeId = column[Int]("ActivityTypeId")
  def destinationHost = column[String]("DestinationHost")
  def userName = column[String]("UserName")
  def tenantId = column[Int]("TenantId")
  def information = column[Blob]("Information")
  def timeCreated = column[Timestamp]("TimeCreated")
  def userId = column[Int]("UserId")
  def anomalyType = column[Int]("AnomalyType")
  def anomalyValue = column[String]("AnomalyValue")
  def measure = column[Int]("Measure")
  def userAction = column[Int]("UserAction")
  def uniqueIdentifier = column[String]("UniqueIdentifier")
  def similarCount = column[Int]("SimilarCount")
  def trainingValue = column[String]("TrainingValue")
  def state = column[Int]("State")
  def riskLevel = column[Int]("RiskLevel")
  def userRiskLevel = column[Int]("UserRiskLevel")
  def userRiskScore = column[Float]("UserRiskScore")
  def response = column[Int]("Response")

  private type Anomaly1TupleType = (Int, String, Int, Timestamp, Timestamp, Int, Int, Float, Int, String, String)
  private type Anomaly2TupleType = (Int, Blob, Timestamp, Int, Int, String, Int, Int, String, Int, String, Int, Int, Int, Float, Int)
  private type AnomalyRowTupleType = (Anomaly1TupleType, Anomaly2TupleType)

  private val anomalyShapedValue = (
    (id, serviceName, serviceId, timeUpdated, timestamp, anomalyCategoryId, userGroup, riskValue, activityTypeId, destinationHost, userName),
    (tenantId, information, timeCreated, userId, anomalyType, anomalyValue, measure, userAction, uniqueIdentifier, similarCount, trainingValue, state, riskLevel, userRiskLevel, userRiskScore, response)
    ).shaped[AnomalyRowTupleType]

  private val toAnomalyRow: (AnomalyRowTupleType => AnomalyRow) = { anomalyTuple =>
    AnomalyRow(anomaly1 = Anomaly1.tupled.apply(anomalyTuple._1), anomaly2 = Anomaly2.tupled.apply(anomalyTuple._2))
  }

  private val toAnomalyTuple: (AnomalyRow => Option[AnomalyRowTupleType]) = { anomalyRow =>
    Some(Anomaly1.unapply(anomalyRow.anomaly1).get, Anomaly2.unapply(anomalyRow.anomaly2).get)
  }

  def * = anomalyShapedValue <> (toAnomalyRow, toAnomalyTuple)
}
person daydreamer    schedule 13.05.2016
comment
Хорошо.. Но не работает, если какое-либо из ваших полей имеет тип BigDecimal - person smaiakov; 04.07.2018

Как уже сказал cvogt, вы можете использовать вложенные case-классы, с ними гораздо проще работать, см. здесь. Я знаю, что HLists сильны, но ИМХО люди слишком сильно их заставляют... Что не так с классами case? хD

Вы должны составить свой класс AnomalyC из 2 или более классов case, содержащих ‹= 22 поля.

person insan-e    schedule 13.05.2016

Поскольку slick не допускает более 22 столбцов и жалуется, что методы tuple и unapply не найдены. Самое простое решение — использовать вложенные классы case, если это возможно. Пример :

https://github.com/timgent/spray-slick-template/blob/master/src/main/scala/com/timmeh/openhr/openholidays/model/LargeTableExample1.scala

person Shilpa    schedule 21.06.2018