private void setupTable()

in kudu/src/main/java/site/ycsb/db/KuduYCSBClient.java [172:264]


  private void setupTable() throws DBException {
    Properties prop = getProperties();
    synchronized (KuduYCSBClient.class) {
      if (tableSetup) {
        return;
      }
      int numTablets = getIntFromProp(prop, PRE_SPLIT_NUM_TABLETS_OPT, 4);
      if (numTablets > MAX_TABLETS) {
        throw new DBException("Specified number of tablets (" + numTablets
            + ") must be equal " + "or below " + MAX_TABLETS);
      }
      int numReplicas = getIntFromProp(prop, TABLE_NUM_REPLICAS, DEFAULT_NUM_REPLICAS);
      long recordCount = Long.parseLong(prop.getProperty(RECORD_COUNT_PROPERTY, DEFAULT_RECORD_COUNT));
      if (recordCount == 0) {
        recordCount = Integer.MAX_VALUE;
      }
      int blockSize = getIntFromProp(prop, BLOCK_SIZE_OPT, BLOCK_SIZE_DEFAULT);
      int fieldCount = getIntFromProp(prop, CoreWorkload.FIELD_COUNT_PROPERTY,
                                      Integer.parseInt(CoreWorkload.FIELD_COUNT_PROPERTY_DEFAULT));
      final String fieldprefix = prop.getProperty(CoreWorkload.FIELD_NAME_PREFIX,
                                                  CoreWorkload.FIELD_NAME_PREFIX_DEFAULT);

      List<ColumnSchema> columns = new ArrayList<ColumnSchema>(fieldCount + 1);

      ColumnSchema keyColumn = new ColumnSchema.ColumnSchemaBuilder(KEY, STRING)
                                               .key(true)
                                               .desiredBlockSize(blockSize)
                                               .build();
      columns.add(keyColumn);
      COLUMN_NAMES.add(KEY);
      for (int i = 0; i < fieldCount; i++) {
        String name = fieldprefix + i;
        COLUMN_NAMES.add(name);
        columns.add(new ColumnSchema.ColumnSchemaBuilder(name, STRING)
                                    .desiredBlockSize(blockSize)
                                    .build());
      }
      schema = new Schema(columns);

      CreateTableOptions builder = new CreateTableOptions();

      if (partitionSchema.equals("hashPartition")) {
        builder.setRangePartitionColumns(new ArrayList<String>());
        List<String> hashPartitionColumns = new ArrayList<>();
        hashPartitionColumns.add(KEY);
        builder.addHashPartitions(hashPartitionColumns, numTablets);
      } else if (partitionSchema.equals("rangePartition")) {
        if (!orderedinserts) {
          // We need to use ordered keys to determine how to split range partitions.
          throw new DBException("Must specify `insertorder=ordered` if using rangePartition schema.");
        }

        String maxKeyValue = String.valueOf(recordCount);
        if (zeropadding < maxKeyValue.length()) {
          throw new DBException(String.format("Invalid zeropadding value: %d, zeropadding needs to be larger "
              + "or equal to number of digits in the record number: %d.", zeropadding, maxKeyValue.length()));
        }

        List<String> rangePartitionColumns = new ArrayList<>();
        rangePartitionColumns.add(KEY);
        builder.setRangePartitionColumns(rangePartitionColumns);
        // Add rangePartitions
        long lowerNum = 0;
        long upperNum = 0;
        int remainder = (int) recordCount % numTablets;
        for (int i = 0; i < numTablets; i++) {
          lowerNum = upperNum;
          upperNum = lowerNum + recordCount / numTablets;
          if (i < remainder) {
            ++upperNum;
          }
          PartialRow lower = schema.newPartialRow();
          lower.addString(KEY, CoreWorkload.buildKeyName(lowerNum, zeropadding, orderedinserts));
          PartialRow upper = schema.newPartialRow();
          upper.addString(KEY, CoreWorkload.buildKeyName(upperNum, zeropadding, orderedinserts));
          builder.addRangePartition(lower, upper);
        }
      } else {
        throw new DBException("Invalid partition_schema specified: " + partitionSchema
            + ", must specify `partition_schema=hashPartition` or `partition_schema=rangePartition`");
      }
      builder.setNumReplicas(numReplicas);

      try {
        client.createTable(tableName, schema, builder);
      } catch (Exception e) {
        if (!e.getMessage().contains("already exists")) {
          throw new DBException("Couldn't create the table", e);
        }
      }
      tableSetup = true;
    }
  }