type Job {
  id: ID!
  jobId: String!
  userId: String!
  projectId: String!
  clusterId: String!
  startTime: Time!
  duration: Int!
  numNodes: Int!
}

type JobData {
  load_one: JobMetric
  mem_used: JobMetric
  mem_bw: JobMetric
  flops_any: JobMetric
  flops_dp: JobMetric
  flops_sp: JobMetric
  cpi_avg: JobMetric
  clock_speed: JobMetric
  total_power: JobMetric
  traffic_read_eth: JobMetric
  traffic_write_eth: JobMetric
  traffic_read_lustre: JobMetric
  traffic_write_lustre: JobMetric
  reg_read_lustre: JobMetric
  reg_write_lustre: JobMetric
  inodes_lustre: JobMetric
  pkg_rate_read_ib: JobMetric
  pkg_rate_write_ib: JobMetric
  congestion_ib: JobMetric
}

type JobMetric {
  unit: String!
  scope: JobMetricScope!
  timestep: Int!
  series: [JobMetricSeries]!
}

enum JobMetricScope {
  node
  cpu
  socket
}

type JobMetricSeries {
  node_id: String!
  statistics: JobMetricStatistics
  data: [Float]!
}

type JobMetricStatistics {
  avg: Float!
  min: Float!
  max: Float!
}

type Query {
  jobById(jobId: String!): Job
  jobs(filter: JobFilterList, page: PageRequest, order: OrderByInput): JobResultList!
  jobsStatistics(filter: JobFilterList): JobsStatistics!

  jobDataById(jobId: String!): JobData
  jobAvailableMetricsById(jobId: String!, selectMetrics: [String]): [JobMetricWithName]!
}

input StartJobInput {
  jobId: String!
  userId: String!
  projectId: String!
  clusterId: String!
  startTime: Time!
  numNodes: Int!
}

input StopJobInput {
  stopTime: Time!
}

input AddJobInput {
  jobId: String!
  userId: String!
  projectId: String!
  clusterId: String!
  startTime: Time!
  duration: Int!
  numNodes: Int!
}


input JobFilterList {
  list: [JobFilter]
}

input JobFilter {
  jobId: StringInput
  userId: StringInput
  projectId: StringInput
  clusterId: StringInput
  duration: IntRange
  numNodes: IntRange
  startTime: TimeRange
  hasProfile: Boolean
}

input OrderByInput {
  field: String!
  order: SortDirectionEnum = ASC
}

enum SortDirectionEnum {
  DESC
  ASC
}

input StringInput {
  eq: String
  contains: String
  startsWith: String
  endsWith: String
}

input IntRange {
  from: Int!
  to: Int!
}

input FloatRange {
  from: Float!
  to: Float!
}

input TimeRange {
  from: Time!
  to: Time!
}

type JobResultList {
  items: [Job]!
  offset: Int
  limit: Int
  count: Int
}

type JobMetricWithName {
  name: String!
  metric: JobMetric!
}

type HistoPoint {
  count: Int!
  value: Int!
}

type JobsStatistics  {
  totalJobs: Int!
  shortJobs: Int!
  totalWalltime: Int!
  totalCoreHours: Int!
  histWalltime: [HistoPoint]!
  histNumNodes: [HistoPoint]!
}

input PageRequest {
  itemsPerPage: Int
  page: Int
}

scalar Time