Class: JpAddressComplement::Importers::CsvImporter

Inherits:
Object
  • Object
show all
Includes:
KenAll
Defined in:
lib/jp_address_complement/importers/csv_importer.rb

Overview

UTF-8 版 KEN_ALL(utf_ken_all.csv)を読み込み、jp_address_complement_postal_codes テーブルに upsert する UTF-8 形式の CSV を前提として処理する

Constant Summary collapse

KEY_COLUMNS =

バッチ削除・ユニークキーとして使うカラム群

%i[postal_code pref_code city town kana_pref kana_city kana_town].freeze
DELETE_CHUNK_SIZE =

SQLite のデフォルト式木深度制限(1000)対策。 reduce(:or) で N 件 OR 結合すると深さ ≈ N + 6 になるため、500 件に収める(深さ ≈ 506)。

500
BATCH_SIZE =

: Integer

1000

Constants included from KenAll

KenAll::COL_CITY, KenAll::COL_HAS_ALIAS, KenAll::COL_IS_LARGE_OFFICE, KenAll::COL_IS_PARTIAL, KenAll::COL_KANA_CITY, KenAll::COL_KANA_PREF, KenAll::COL_KANA_TOWN, KenAll::COL_POSTAL_CODE, KenAll::COL_PREF, KenAll::COL_PREF_CODE, KenAll::COL_TOWN

Instance Method Summary collapse

Constructor Details

#initialize(csv_path) ⇒ CsvImporter

Returns a new instance of CsvImporter.



31
32
33
# File 'lib/jp_address_complement/importers/csv_importer.rb', line 31

def initialize(csv_path)
  @csv_path = csv_path
end

Instance Method Details

#import ⇒ ImportResult

CSV を読み込み、upsert 後に古いバージョンの行を一括削除する。戻り値は ImportResult。 バージョンは既存レコードの最大値+1 で、別テーブルでは管理しない。

Returns:

Raises:



39
40
41
42
43
44
45
46
47
48
# File 'lib/jp_address_complement/importers/csv_importer.rb', line 39

def import
  raise ImportError, "CSV ファイルが見つかりません: #{@csv_path}" unless File.exist?(@csv_path)

  import_version = (PostalCode.maximum(:version) || 0) + 1
  total_upserted, keys_in_csv = read_and_upsert(import_version)
  raise ImportError, '有効行が0件のためインポートを実行しません(空CSVは拒否します)' if keys_in_csv.empty?

  deleted = delete_obsolete(import_version)
  ImportResult.new(upserted: total_upserted, deleted: deleted)
end