Full Code of redis-developer/riot for AI

main a752f35ab966 cached
346 files
2.4 MB
646.6k tokens
1718 symbols
1 requests
Download .txt
Showing preview only (2,594K chars total). Download the full file or copy to clipboard to get everything.
Repository: redis-developer/riot
Branch: main
Commit: a752f35ab966
Files: 346
Total size: 2.4 MB

Directory structure:
gitextract_hqj_qnqk/

├── .github/
│   └── workflows/
│       ├── build.yml
│       ├── cache.yml
│       ├── early-access.yml
│       ├── publish.yml
│       ├── release.yml
│       ├── step-jlink.yml
│       ├── step-precheck.yml
│       └── trigger-early-access.yml
├── .gitignore
├── LICENSE
├── README.adoc
├── VERSION
├── build.gradle
├── core/
│   ├── riot-core/
│   │   ├── gradle.properties
│   │   ├── riot-core.gradle
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── redis/
│   │       │   │           └── riot/
│   │       │   │               └── core/
│   │       │   │                   ├── AbstractCallableCommand.java
│   │       │   │                   ├── AbstractJobCommand.java
│   │       │   │                   ├── BaseCommand.java
│   │       │   │                   ├── CompositeExecutionStrategy.java
│   │       │   │                   ├── Expression.java
│   │       │   │                   ├── IO.java
│   │       │   │                   ├── LoggingMixin.java
│   │       │   │                   ├── MainCommand.java
│   │       │   │                   ├── NoopItemWriter.java
│   │       │   │                   ├── PrintExceptionMessageHandler.java
│   │       │   │                   ├── ProcessingItemWriter.java
│   │       │   │                   ├── ProgressArgs.java
│   │       │   │                   ├── ProgressStepExecutionListener.java
│   │       │   │                   ├── ProgressStyle.java
│   │       │   │                   ├── QuietMapAccessor.java
│   │       │   │                   ├── RetryPolicy.java
│   │       │   │                   ├── RiotDuration.java
│   │       │   │                   ├── RiotException.java
│   │       │   │                   ├── RiotUtils.java
│   │       │   │                   ├── RiotVersion.java
│   │       │   │                   ├── SkipPolicy.java
│   │       │   │                   ├── Step.java
│   │       │   │                   ├── StepArgs.java
│   │       │   │                   ├── StepConfiguration.java
│   │       │   │                   ├── TemplateExpression.java
│   │       │   │                   ├── ThrottledItemWriter.java
│   │       │   │                   └── processor/
│   │       │   │                       ├── CollectionToMapFunction.java
│   │       │   │                       ├── ConsumerUnaryOperator.java
│   │       │   │                       ├── FieldExtractorFactory.java
│   │       │   │                       ├── FunctionPredicate.java
│   │       │   │                       ├── IdFunctionBuilder.java
│   │       │   │                       ├── MapFilteringFunction.java
│   │       │   │                       ├── MapFlatteningFunction.java
│   │       │   │                       ├── ObjectToDoubleFunction.java
│   │       │   │                       ├── ObjectToLongFunction.java
│   │       │   │                       ├── ObjectToStringFunction.java
│   │       │   │                       ├── PredicateOperator.java
│   │       │   │                       ├── RegexNamedGroupFunction.java
│   │       │   │                       └── StringToMapFunction.java
│   │       │   └── resources/
│   │       │       └── com/
│   │       │           └── redis/
│   │       │               └── riot/
│   │       │                   └── core/
│   │       │                       └── RiotVersion.properties
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── redis/
│   │           │           └── riot/
│   │           │               └── core/
│   │           │                   └── ConverterTests.java
│   │           └── resources/
│   │               ├── beers1.csv
│   │               └── beers2.csv
│   ├── riot-faker/
│   │   ├── gradle.properties
│   │   ├── riot-faker.gradle
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── redis/
│   │       │               └── riot/
│   │       │                   └── faker/
│   │       │                       └── FakerItemReader.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── redis/
│   │                       └── riot/
│   │                           └── faker/
│   │                               └── FakerReaderTests.java
│   ├── riot-file/
│   │   ├── gradle.properties
│   │   ├── riot-file.gradle
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── redis/
│   │       │               └── riot/
│   │       │                   └── file/
│   │       │                       ├── AbstractReaderFactory.java
│   │       │                       ├── AbstractWriterFactory.java
│   │       │                       ├── DelimitedReaderFactory.java
│   │       │                       ├── DelimitedWriterFactory.java
│   │       │                       ├── FileOptions.java
│   │       │                       ├── FileReaderRegistry.java
│   │       │                       ├── FileReaderResult.java
│   │       │                       ├── FileWriterRegistry.java
│   │       │                       ├── FileWriterResult.java
│   │       │                       ├── FixedWidthReaderFactory.java
│   │       │                       ├── FormattedWriterFactory.java
│   │       │                       ├── GoogleStorageOptions.java
│   │       │                       ├── GoogleStorageProtocolResolver.java
│   │       │                       ├── HeaderCallbackHandler.java
│   │       │                       ├── JsonLineAggregator.java
│   │       │                       ├── JsonLinesReaderFactory.java
│   │       │                       ├── JsonLinesWriterFactory.java
│   │       │                       ├── JsonReaderFactory.java
│   │       │                       ├── JsonWriterFactory.java
│   │       │                       ├── MapFieldSetMapper.java
│   │       │                       ├── NamedInputStreamResource.java
│   │       │                       ├── ObjectMapperLineMapper.java
│   │       │                       ├── OutputStreamResource.java
│   │       │                       ├── ReadOptions.java
│   │       │                       ├── ReaderFactory.java
│   │       │                       ├── ResourceFactory.java
│   │       │                       ├── ResourceMap.java
│   │       │                       ├── RiotResourceLoader.java
│   │       │                       ├── RiotResourceMap.java
│   │       │                       ├── RuntimeIOException.java
│   │       │                       ├── S3Options.java
│   │       │                       ├── S3ProtocolResolver.java
│   │       │                       ├── StdInProtocolResolver.java
│   │       │                       ├── StdOutProtocolResolver.java
│   │       │                       ├── SystemInResource.java
│   │       │                       ├── SystemOutResource.java
│   │       │                       ├── UncustomizedUrlResource.java
│   │       │                       ├── WriteOptions.java
│   │       │                       ├── WriterFactory.java
│   │       │                       ├── XmlReaderFactory.java
│   │       │                       ├── XmlWriterFactory.java
│   │       │                       └── xml/
│   │       │                           ├── XmlItemReader.java
│   │       │                           ├── XmlItemReaderBuilder.java
│   │       │                           ├── XmlObjectReader.java
│   │       │                           ├── XmlResourceItemWriter.java
│   │       │                           └── XmlResourceItemWriterBuilder.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── redis/
│   │                       └── riot/
│   │                           └── file/
│   │                               └── ReaderTests.java
│   └── riot-test/
│       ├── gradle.properties
│       ├── riot-test.gradle
│       └── src/
│           └── main/
│               └── java/
│                   └── com/
│                       └── redis/
│                           └── riot/
│                               └── test/
│                                   └── AbstractRiotTestBase.java
├── docs/
│   ├── LICENSE
│   └── guide/
│       ├── gradle.properties
│       ├── guide.gradle
│       └── src/
│           └── docs/
│               ├── asciidoc/
│               │   ├── _links.adoc
│               │   ├── changelog.adoc
│               │   ├── concepts.adoc
│               │   ├── cookbook.adoc
│               │   ├── databases.adoc
│               │   ├── datagen.adoc
│               │   ├── elasticache.adoc
│               │   ├── export.adoc
│               │   ├── faq.adoc
│               │   ├── files.adoc
│               │   ├── import.adoc
│               │   ├── index.adoc
│               │   ├── install.adoc
│               │   ├── introduction.adoc
│               │   ├── ping.adoc
│               │   ├── replication.adoc
│               │   └── usage.adoc
│               └── resources/
│                   ├── images/
│                   │   └── Diagrams.drawio
│                   ├── order.json
│                   └── redis-dump.json
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── jreleaser.yml
├── plugins/
│   ├── LICENSE
│   └── riot/
│       ├── gradle.properties
│       ├── riot.gradle
│       └── src/
│           ├── main/
│           │   ├── java/
│           │   │   └── com/
│           │   │       └── redis/
│           │   │           └── riot/
│           │   │               ├── AbstractCompareCommand.java
│           │   │               ├── AbstractExportCommand.java
│           │   │               ├── AbstractFileExport.java
│           │   │               ├── AbstractFileImport.java
│           │   │               ├── AbstractImportCommand.java
│           │   │               ├── AbstractRedisCommand.java
│           │   │               ├── AbstractRedisExportCommand.java
│           │   │               ├── AbstractRedisImportCommand.java
│           │   │               ├── AbstractRedisTargetExportCommand.java
│           │   │               ├── Compare.java
│           │   │               ├── CompareLoggingWriteListener.java
│           │   │               ├── CompareMode.java
│           │   │               ├── CompareStepListener.java
│           │   │               ├── ContentType.java
│           │   │               ├── DataSourceArgs.java
│           │   │               ├── DatabaseExport.java
│           │   │               ├── DatabaseImport.java
│           │   │               ├── DatabaseReaderArgs.java
│           │   │               ├── EvaluationContextArgs.java
│           │   │               ├── ExportStepHelper.java
│           │   │               ├── ExpressionProcessor.java
│           │   │               ├── FakerImport.java
│           │   │               ├── FileArgs.java
│           │   │               ├── FileExport.java
│           │   │               ├── FileImport.java
│           │   │               ├── FileReaderArgs.java
│           │   │               ├── FileTypeArgs.java
│           │   │               ├── FileWriterArgs.java
│           │   │               ├── Generate.java
│           │   │               ├── GenerateArgs.java
│           │   │               ├── GoogleStorageArgs.java
│           │   │               ├── ImportProcessorArgs.java
│           │   │               ├── JdbcCursorItemReaderFactory.java
│           │   │               ├── KeyFilterArgs.java
│           │   │               ├── KeyValueDeserializer.java
│           │   │               ├── KeyValueFilter.java
│           │   │               ├── KeyValueProcessorArgs.java
│           │   │               ├── MemoryUsageArgs.java
│           │   │               ├── Ping.java
│           │   │               ├── PingExecution.java
│           │   │               ├── PingExecutionItemReader.java
│           │   │               ├── RangeConverter.java
│           │   │               ├── ReadFrom.java
│           │   │               ├── RedisArgs.java
│           │   │               ├── RedisClientArgs.java
│           │   │               ├── RedisContext.java
│           │   │               ├── RedisReaderArgs.java
│           │   │               ├── RedisReaderLiveArgs.java
│           │   │               ├── RedisURIConverter.java
│           │   │               ├── RedisWriterArgs.java
│           │   │               ├── Replicate.java
│           │   │               ├── ReplicateReadLogger.java
│           │   │               ├── ReplicateWriteLogger.java
│           │   │               ├── Riot.java
│           │   │               ├── RiotMainCommand.java
│           │   │               ├── S3Args.java
│           │   │               ├── SourceRedisArgs.java
│           │   │               ├── TargetRedisArgs.java
│           │   │               ├── ToMapFunction.java
│           │   │               ├── Versions.java
│           │   │               ├── function/
│           │   │               │   ├── HashToMapFunction.java
│           │   │               │   ├── KeyValueMap.java
│           │   │               │   ├── MapToFieldFunction.java
│           │   │               │   ├── ObjectMapperFunction.java
│           │   │               │   ├── StreamItemProcessor.java
│           │   │               │   ├── StreamToMapFunction.java
│           │   │               │   ├── StringKeyValue.java
│           │   │               │   ├── TimeSeriesToMapFunction.java
│           │   │               │   ├── ToGeoValue.java
│           │   │               │   ├── ToSample.java
│           │   │               │   ├── ToScoredValue.java
│           │   │               │   ├── ToStringKeyValue.java
│           │   │               │   ├── ToSuggestion.java
│           │   │               │   └── ZsetToMapFunction.java
│           │   │               └── operation/
│           │   │                   ├── AbstractMemberOperationCommand.java
│           │   │                   ├── AbstractOperationCommand.java
│           │   │                   ├── DelCommand.java
│           │   │                   ├── ExpireCommand.java
│           │   │                   ├── ExpireTtlArgs.java
│           │   │                   ├── FieldFilterArgs.java
│           │   │                   ├── GeoaddCommand.java
│           │   │                   ├── HsetCommand.java
│           │   │                   ├── JsonSetCommand.java
│           │   │                   ├── LpushCommand.java
│           │   │                   ├── MemberOperationArgs.java
│           │   │                   ├── OperationCommand.java
│           │   │                   ├── RpushCommand.java
│           │   │                   ├── SaddCommand.java
│           │   │                   ├── ScoreArgs.java
│           │   │                   ├── SetCommand.java
│           │   │                   ├── SugaddCommand.java
│           │   │                   ├── TsAddCommand.java
│           │   │                   ├── XaddCommand.java
│           │   │                   └── ZaddCommand.java
│           │   └── resources/
│           │       └── com/
│           │           └── redis/
│           │               └── riot/
│           │                   └── banner.txt
│           └── test/
│               ├── java/
│               │   └── com/
│               │       └── redis/
│               │           └── riot/
│               │               ├── AbstractRiotApplicationTestBase.java
│               │               ├── DbTests.java
│               │               ├── FileTests.java
│               │               ├── KeyValueSerdeTests.java
│               │               ├── PostgresDeltaTests.java
│               │               ├── PostgresTests.java
│               │               ├── ProcessorTests.java
│               │               ├── REServerStack.java
│               │               ├── REStack.java
│               │               ├── RedisArgsTests.java
│               │               ├── RedisContainerFactory.java
│               │               ├── RiotTests.java
│               │               ├── SqlScriptRunner.java
│               │               ├── StackFileTests.java
│               │               ├── StackREContainer.java
│               │               ├── StackREServer.java
│               │               └── StackRiotTests.java
│               └── resources/
│                   ├── compare-key-processor
│                   ├── db/
│                   │   ├── northwind.sql
│                   │   ├── oracle.sql
│                   │   └── postgres-delta.sql
│                   ├── db-export-postgresql
│                   ├── db-import-postgresql
│                   ├── db-import-postgresql-multithreaded
│                   ├── db-import-postgresql-noop
│                   ├── db-import-postgresql-set
│                   ├── faker-hset
│                   ├── faker-sadd
│                   ├── faker-tsadd
│                   ├── faker-tsadd-options
│                   ├── faker-xadd
│                   ├── faker-zadd
│                   ├── file-export-json
│                   ├── file-export-json-gz
│                   ├── file-export-xml
│                   ├── file-import-bad
│                   ├── file-import-csv
│                   ├── file-import-csv-max
│                   ├── file-import-csv-skiplines
│                   ├── file-import-exclude
│                   ├── file-import-filetype
│                   ├── file-import-filter
│                   ├── file-import-fw
│                   ├── file-import-gcs
│                   ├── file-import-geo-processor
│                   ├── file-import-geoadd
│                   ├── file-import-hset-expire
│                   ├── file-import-hset-expire-abs
│                   ├── file-import-hset-sadd
│                   ├── file-import-include
│                   ├── file-import-json
│                   ├── file-import-json-elastic-hset
│                   ├── file-import-json-elastic-jsonset
│                   ├── file-import-json-gz-hset
│                   ├── file-import-json-hset
│                   ├── file-import-process
│                   ├── file-import-process-elvis
│                   ├── file-import-process-faker
│                   ├── file-import-process-var
│                   ├── file-import-psv
│                   ├── file-import-regex
│                   ├── file-import-s3
│                   ├── file-import-sugadd
│                   ├── file-import-tsv
│                   ├── file-import-xml
│                   ├── files/
│                   │   ├── accounts.fw
│                   │   ├── airports.csv
│                   │   ├── bad.psv
│                   │   ├── beers.csv
│                   │   ├── beers.json
│                   │   ├── beers.jsonl
│                   │   ├── beers1.csv
│                   │   ├── beers2.csv
│                   │   ├── es_test-index.json
│                   │   ├── lacity.csv
│                   │   ├── nobels.json
│                   │   ├── redis-export.json
│                   │   ├── redis.json
│                   │   ├── sample.psv
│                   │   ├── sample.tsv
│                   │   ├── timestamp.json
│                   │   └── trades.xml
│                   ├── generate
│                   ├── generate-hash-index
│                   ├── generate-json-index
│                   ├── replicate
│                   ├── replicate-dry-run
│                   ├── replicate-hll
│                   ├── replicate-key-exclude
│                   ├── replicate-key-processor
│                   ├── replicate-key-processor-compare-none
│                   ├── replicate-live
│                   ├── replicate-live-key-exclude
│                   ├── replicate-live-keyslot
│                   ├── replicate-live-only-struct
│                   ├── replicate-live-read-threads
│                   ├── replicate-live-struct
│                   ├── replicate-live-threads
│                   ├── replicate-no-stream-id
│                   ├── replicate-no-stream-id-prune
│                   └── replicate-struct
├── riot
├── settings.gradle
└── src/
    ├── jreleaser/
    │   └── changelog.tpl
    └── media/
        └── riot.icns

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/build.yml
================================================
name: Build

on:
  pull_request:

permissions:
  contents: read

jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Java
        uses: actions/setup-java@v4
        with:
          java-version: 21
          distribution: zulu
          cache: gradle

      - name: Build
        shell: bash
        run: ./gradlew build -S


================================================
FILE: .github/workflows/cache.yml
================================================
name: Clear cache

on:
  schedule:
    - cron: '0 3 * * *'
  workflow_dispatch:

jobs:
  clear:
    name: Delete all caches
    runs-on: ubuntu-latest
    steps:
      - name: Clear caches
        uses: easimon/wipe-cache@v2


================================================
FILE: .github/workflows/early-access.yml
================================================
name: EarlyAccess

on:
  push:
    branches: [ main ]

permissions:
  actions: write
  id-token: write
  contents: write

jobs:
  precheck:
    name: Precheck
    uses: redis/riot/.github/workflows/step-precheck.yml@main
    secrets: inherit

  jlink:
    name: Jlink
    needs: [precheck]
    if: endsWith(${{ needs.precheck.outputs.version }}, '-SNAPSHOT')
    uses: redis/riot/.github/workflows/step-jlink.yml@main
    with:
      project-version: ${{ needs.precheck.outputs.version }}
    secrets:
      codecov-token: ${{ secrets.CODECOV_TOKEN }}

  release:
    name: Release
    needs: [precheck, jlink]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: artifacts
          path: plugins/riot/build

      - name: Download repos
        uses: actions/download-artifact@v4
        with:
          name: repos
          path: build/repos/local/release

      - name: Download jlink
        uses: actions/download-artifact@v4
        with:
          name: jlink
          path: out/jreleaser/assemble/riot-standalone/jlink

      - name: Release
        uses: jreleaser/release-action@v2
        with:
          arguments: full-release
        env:
          JRELEASER_DOCKER_DEFAULT_USERNAME: ${{ secrets.DOCKER_USERNAME }}
          JRELEASER_DOCKER_DEFAULT_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
          JRELEASER_GITHUB_PASSWORD: ${{ secrets.GIT_ACCESS_TOKEN }}
          JRELEASER_GITHUB_TOKEN: ${{ secrets.GIT_ACCESS_TOKEN }}
          JRELEASER_GITHUB_USERNAME: ${{ secrets.GIT_USER }}
          JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
          JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }}
          JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_SECRET_KEY }}
          JRELEASER_NEXUS2_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
          JRELEASER_NEXUS2_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
          JRELEASER_PROJECT_VERSION: ${{ needs.precheck.outputs.version }}
          JRELEASER_SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}

      - name: JReleaser release output
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: riot-release
          path: |
            out/jreleaser/trace.log
            out/jreleaser/output.properties

================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish

on:
  workflow_dispatch:
    inputs:
      version:
        description: 'Release version'
        required: true

permissions:
  actions: write
  id-token: write
  contents: write

jobs:
  precheck:
    name: Precheck
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.vars.outputs.VERSION }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4

  publish:
    name: Publish
    needs: [precheck]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: main
          fetch-depth: 0

      - name: Version
        id: vars
        shell: bash
        run: |
          echo "VERSION=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
          echo ${{ github.event.inputs.version }} > VERSION

      - name: Setup Java
        uses: actions/setup-java@v4
        with:
          java-version: ${{ vars.JAVA_VERSION }}
          distribution: ${{ vars.JAVA_DISTRO }}
          cache: gradle

      - name: Deploy
        env:
          GRGIT_USER: ${{ secrets.GIT_USER }}
          GRGIT_PASS: ${{ secrets.GIT_ACCESS_TOKEN }}
        run: |
          ./gradlew -Prelease=true -PreproducibleBuild=true gitPublishPush -S

================================================
FILE: .github/workflows/release.yml
================================================
name: Release

on:
  workflow_dispatch:
    inputs:
      version:
        description: 'Release version'
        required: true
      build-tasks:
        description: 'Build tasks'
        default: 'build aggregateTestReports aggregateJacocoReport publish'
        required: false
        type: string

permissions:
  actions: write
  id-token: write
  contents: write

jobs:
  precheck:
    name: Precheck
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.vars.outputs.VERSION }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Version
        id: vars
        shell: bash
        run: |
          echo "VERSION=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
          echo ${{ github.event.inputs.version }} > VERSION
          git add VERSION
          sed -i -e "s/^\:project-version\:\ .*/:project-version: ${{ github.event.inputs.version }}/g" README.adoc
          git config --global user.email "${{ secrets.COMMIT_EMAIL }}"
          git config --global user.name "Julien Ruaux"
          git commit -a -m "Releasing version ${{ github.event.inputs.version }}"
          git push origin main

  jlink:
    name: Jlink
    needs: [precheck]
    uses: redis/riot/.github/workflows/step-jlink.yml@main
    with:
      project-version: ${{ needs.precheck.outputs.version }}
      tasks: ${{ github.event.inputs.build-tasks }}
    secrets:
      codecov-token: ${{ secrets.CODECOV_TOKEN }}

  release:
    name: Release
    needs: [precheck, jlink]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: main
          fetch-depth: 0

      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: artifacts
          path: plugins/riot/build

      - name: Download repos
        uses: actions/download-artifact@v4
        with:
          name: repos
          path: build/repos/local/release

      - name: Download jlink
        uses: actions/download-artifact@v4
        with:
          name: jlink
          path: out/jreleaser/assemble/riot-standalone/jlink

      - name: Setup Java
        uses: actions/setup-java@v4
        with:
          java-version: ${{ vars.JAVA_VERSION }}
          distribution: ${{ vars.JAVA_DISTRO }}
          cache: gradle

      - name: Deploy
        env:
          GRGIT_USER: ${{ secrets.GIT_USER }}
          GRGIT_PASS: ${{ secrets.GIT_ACCESS_TOKEN }}
        run: |
          ./gradlew -Prelease=true -PreproducibleBuild=true publish gitPublishPush -S

      - name: Upload deploy artifacts
        uses: actions/upload-artifact@v4
        with:
          retention-days: 7
          name: deploy
          path: |
            build/repos/local/release/

      - name: Release
        uses: jreleaser/release-action@v2
        with:
          arguments: full-release
        env:
          JRELEASER_DOCKER_DEFAULT_USERNAME: ${{ secrets.DOCKER_USERNAME }}
          JRELEASER_DOCKER_DEFAULT_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
          JRELEASER_GITHUB_PASSWORD: ${{ secrets.GIT_ACCESS_TOKEN }}
          JRELEASER_GITHUB_TOKEN: ${{ secrets.GIT_ACCESS_TOKEN }}
          JRELEASER_GITHUB_USERNAME: ${{ secrets.GIT_USER }}
          JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
          JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }}
          JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_SECRET_KEY }}
          JRELEASER_NEXUS2_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
          JRELEASER_NEXUS2_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
          JRELEASER_PROJECT_VERSION: ${{ needs.precheck.outputs.version }}
          JRELEASER_SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}

      - name: JReleaser release output
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: riot-release
          path: |
            out/jreleaser/trace.log
            out/jreleaser/output.properties

================================================
FILE: .github/workflows/step-jlink.yml
================================================
name: X-Jlink

on:
  workflow_call:
    inputs:
      project-version:
        required: true
        type: string
      tasks:
        default: 'build aggregateTestReports aggregateJacocoReport publish'
        required: false
        type: string
    secrets:
      codecov-token:
        required: false

permissions:
  contents: read

jobs:
  jlink:
    name: Jlink
    runs-on: ubuntu-latest
    env:
      CI: true
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: main

      - name: Setup Java
        uses: actions/setup-java@v4
        with:
          java-version: ${{ vars.JAVA_VERSION }}
          distribution: ${{ vars.JAVA_DISTRO }}
          cache: gradle

      - name: Version
        if: endsWith(${{ inputs.project-version }}, '-SNAPSHOT') != true
        run: |
          echo ${{ inputs.project-version }} > VERSION

      - name: Build
        run: ./gradlew -Prelease=true -PreproducibleBuild=true ${{ inputs.tasks }} -S
        
      - name: Upload test reports
        if: failure()
        uses: actions/upload-artifact@v4
        with:
          name: test-reports
          path: |
            build/reports/aggregate-tests/

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v4
        env:
          CODECOV_TOKEN: ${{ secrets.codecov-token }}

      - name: Jlink
        uses: jreleaser/release-action@v2
        with:
          arguments: assemble --assembler jlink
          setup-java: false
        env:
          JRELEASER_PROJECT_VERSION: ${{ inputs.project-version }}

      - name: JReleaser output
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: riot-jlink
          path: |
            out/jreleaser/trace.log
            out/jreleaser/output.properties

      - name: Dependencies
        run: |
          ls -l plugins/riot/build/dependencies/flat
          
      - name: Upload repos
        uses: actions/upload-artifact@v4
        with:
          retention-days: 1
          name: repos
          path: |
            build/repos/local/release

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          retention-days: 1
          name: artifacts
          path: |
            plugins/riot/build/libs/
            plugins/riot/build/dependencies/
            plugins/riot/build/distributions/

      - name: Stop Gradle daemon
        shell: bash
        run: ./gradlew -stop

      - name: Upload jlink
        uses: actions/upload-artifact@v4
        with:
          retention-days: 1
          name: jlink
          path: |
            out/jreleaser/assemble/riot-standalone/jlink/*.zip


================================================
FILE: .github/workflows/step-precheck.yml
================================================
name: X-Precheck

on:
  workflow_call:
    outputs:
      version:
        description: version
        value: ${{ jobs.precheck.outputs.version }}

permissions:
  contents: read

jobs:
  precheck:
    name: Precheck
    if: github.repository == 'redis/riot' && startsWith(github.event.head_commit.message, 'Releasing version') != true
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.vars.outputs.VERSION }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Cancel previous run
        uses: styfle/cancel-workflow-action@0.12.1
        with:
          access_token: ${{ secrets.GITHUB_TOKEN }}

      - name: Version
        id: vars
        shell: bash
        run: |
          echo "VERSION=$(cat VERSION)" >> $GITHUB_OUTPUT


================================================
FILE: .github/workflows/trigger-early-access.yml
================================================
name: Trigger Early Access

on:
  workflow_dispatch:

permissions:
  contents: read

jobs:
  earlyaccess:
    name: Trigger Early Access
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Java
        uses: actions/setup-java@v4
        with:
          java-version: ${{ vars.JAVA_VERSION }}
          distribution: ${{ vars.JAVA_DISTRO }}
          cache: gradle

      - name: Build
        run: ./gradlew -PreproducibleBuild=true build -S

      - name: Rename artifacts
        run: |
          mkdir early-access
          cp plugins/riot/build/distributions/riot-*-SNAPSHOT.zip early-access/riot-early-access.zip

      - name: Release early-access artifacts
        uses: marvinpinto/action-automatic-releases@latest
        with:
          automatic_release_tag: early-access
          repo_token: ${{ secrets.GIT_ACCESS_TOKEN }}
          prerelease: true
          title: RIOT Early-Access
          files: |
            early-access/*


================================================
FILE: .gitignore
================================================
/out/
build
.gradle
/.idea
bin
.project
.classpath
.settings
.DS_Store
hs_err_pid*.log
*.bkp

================================================
FILE: LICENSE
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS


================================================
FILE: README.adoc
================================================
:linkattrs:
:project-owner:   redis
:project-name:    riot
:project-group:   com.redis
:project-version: 4.3.0
:project-title:   RIOT

image::docs/guide/src/docs/resources/images/riot.svg[RIOT]

---

[IMPORTANT]
====
*⚠️ This project is no longer maintained.*

RIOT has been superseded by https://github.com/redis/riotx-dist[*RIOT-X*], an enterprise-grade version with enhanced features and active support from Redis, Inc.

* *For new projects:* Please use https://redis.github.io/riotx/[RIOT-X]
* *Existing users:* You can continue using RIOT, but no new features or bug fixes will be provided
* *Support:* All support requests should be directed to the RIOT-X project

https://github.com/redis/riotx-dist[→ Go to RIOT-X on GitHub]
====

---

Get data in and out of Redis with link:http://redis.github.io/riot/[{project-title}]!

Redis Input/Output Tools ({project-title}) is a command-line utility designed to help you get data in and out of Redis.

It supports many different sources and targets:

* Relational databases
* Files (CSV, JSON, XML)
* Data generators (Redis data structures, Faker)
* and Redis itself with live and/or snapshot replication.

== Documentation

link:http://redis.github.io/riot/[redis.github.io/riot]

== Support

*This project is no longer actively maintained.*

For support, please use https://github.com/redis/riotx-dist[RIOT-X], the actively maintained successor to this project.

Existing issues will remain open for historical reference, but new issues and pull requests will not be addressed.

== Badges

image:https://github.com/{project-owner}/{project-name}/actions/workflows/early-access.yml/badge.svg["Build Status", link="https://github.com/{project-owner}/{project-name}/actions/workflows/early-access.yml"]
image:https://img.shields.io/github/release/{project-owner}/{project-name}.svg["Latest", link="https://github.com/{project-owner}/{project-name}/releases/latest"]
image:https://codecov.io/gh/{project-owner}/{project-name}/graph/badge.svg?token=bwm6gyXU0v["Coverage", link="https://codecov.io/gh/{project-owner}/{project-name}"]

== License

{project-title} is licensed under the Apache 2.0 License.
Copyright (C) 2023 Redis, Inc.


================================================
FILE: VERSION
================================================
4.3.0


================================================
FILE: build.gradle
================================================
/*
 * SPDX-License-Identifier: Apache-2.0
 *
 * Copyright 2020-2023 The RIOT authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
config {
    info {
        description = 'RIOT'
        inceptionYear = '2020'
        vendor = 'Redis'
        tags = ['redis', 'tool', 'import', 'export', 'replication']

        links {
            website      = "https://github.com/redis/${project.rootProject.name}"
            issueTracker = "https://github.com/redis/${project.rootProject.name}/issues"
            scm          = "https://github.com/redis/${project.rootProject.name}.git"
        }

        scm {
            url                 = "https://github.com/redis/${project.rootProject.name}"
            connection          = "scm:git:https://github.com/redis/${project.rootProject.name}.git"
            developerConnection = "scm:git:git@github.com:redis/${project.rootProject.name}.git"
        }

        specification {
            enabled = true
        }

        implementation {
            enabled = true
        }
        
        people {
            clearDomainSet()
            person {
                id    = 'jruaux'
                name  = 'Julien Ruaux'
                roles = ['developer', 'author']
            }
        }
    }

    docs {
        javadoc {
            autoLinks {
                enabled = false
            }
        }
    }
    
    licensing {
        enabled = false
    }

    coverage {
        jacoco {
            enabled = true
            toolVersion = jacocoPluginVersion
        }
    }
}

allprojects {
    repositories {
        mavenLocal()
        maven {
            url 'https://s01.oss.sonatype.org/content/repositories/snapshots/'
        }
    }

    tasks.withType(GenerateModuleMetadata) {
        enabled = false
    }

    tasks.withType(JavaCompile) {
        options.encoding = 'UTF-8'
    }
}

subprojects { subproj ->
    if (!subproj.name.contains('guide')) {
    
        config {
	        info {
	            description = project.project_description
	        }
            coverage {
                jacoco {
		            toolVersion = jacocoPluginVersion
                }
            }
	    }

	    license {
	        exclude('build/**')
	    }

	    dependencies {
            compileOnly 'org.projectlombok:lombok'
            annotationProcessor 'org.projectlombok:lombok'
            testImplementation 'org.junit.jupiter:junit-jupiter-api'
            testImplementation 'org.junit.jupiter:junit-jupiter-params'
            testImplementation 'org.junit.jupiter:junit-jupiter-engine'
            testImplementation 'org.junit.platform:junit-platform-launcher'
            testImplementation 'org.testcontainers:junit-jupiter'
	        testImplementation group: 'com.redis', name: 'testcontainers-redis', version: testcontainersRedisVersion
	    }

	    test {
	        useJUnitPlatform()
	    }

	    configurations {
	        all*.exclude module: 'spring-boot-starter-logging'
	        all*.exclude module: 'commons-logging'
	    }

	    bootJar {
            enabled = false
        }

        jar {
            enabled = true
            archiveClassifier = ''
        }

	}
}

subprojects { p ->
    config {
        coverage {
            jacoco {
                enabled = hasTestsAt(p.file('src/test'))
            }
        }
    }
    
    configurations.all {
        resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            if (details.requested.name == 'lettuce-core' ) {
                details.useVersion lettuceVersion
            }
        }
    }
}

gradleProjects {
    subprojects {
        dirs(['core']) {
            compileJava {
                options.compilerArgs += ["-AprojectPath=${project.group}/${project.name}"]
            }

            if (!(project.findProperty('automatic.module.name.skip') ?: false).toBoolean()) {
                jar {
                    manifest {
                        attributes('Automatic-Module-Name': project.findProperty('automatic.module.name'))
                    }
                }
            }
        }
    }
}

boolean hasTestsAt(File testDir) {
    testDir.exists() && testDir.listFiles()?.size()
}

================================================
FILE: core/riot-core/gradle.properties
================================================
#
# SPDX-License-Identifier: Apache-2.0
#
# Copyright 2022-2023 The RIOT authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
project_description = RIOT Core
automatic.module.name = com.redis.riot.core


================================================
FILE: core/riot-core/riot-core.gradle
================================================
/*
 * SPDX-License-Identifier: Apache-2.0
 *
 * Copyright 2020-2023 The RIOT authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
dependencies {
    api 'org.slf4j:slf4j-api'
    implementation 'org.slf4j:slf4j-simple'
    api group: 'info.picocli', name: 'picocli', version: picocliVersion
    annotationProcessor group: 'info.picocli', name: 'picocli-codegen', version: picocliVersion
    implementation 'org.springframework.boot:spring-boot'
    implementation group: 'me.tongfei', name: 'progressbar', version: progressbarVersion
    api group: 'com.redis', name: 'spring-batch-redis-infrastructure', version: springBatchRedisVersion
    testImplementation 'org.awaitility:awaitility'
}

project.rootProject.gradle.addBuildListener(new BuildAdapter() {
    @Override
    void projectsEvaluated(Gradle gradle) {
        gradle.rootProject.subprojects
            .find { p -> p.name == 'riot-core' }
            .processResources {
                inputs.property('build_date', gradle.rootProject.config.buildInfo.buildDate + ':' + gradle.rootProject.config.buildInfo.buildTime)
                filesMatching(['**/RiotVersion.properties']) {
                    expand(
                        'riot_version': gradle.rootProject.version,
                        'build_date': gradle.rootProject.config.buildInfo.buildDate,
                        'build_time': gradle.rootProject.config.buildInfo.buildTime,
                        'build_revision': gradle.rootProject.config.buildInfo.buildRevision
                    )
                }
            }
    }
})

================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/AbstractCallableCommand.java
================================================
package com.redis.riot.core;

import java.util.concurrent.Callable;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import picocli.CommandLine.Command;
import picocli.CommandLine.Option;

@Command
public abstract class AbstractCallableCommand extends BaseCommand implements Callable<Integer> {

	@Option(names = "--help", usageHelp = true, description = "Show this help message and exit.")
	private boolean helpRequested;

	protected Logger log;

	@Override
	public Integer call() throws Exception {
		initialize();
		try {
			execute();
		} finally {
			teardown();
		}
		return 0;
	}

	protected void initialize() {
		if (log == null) {
			log = LoggerFactory.getLogger(getClass());
		}
	}

	protected abstract void execute();

	protected void teardown() {
		// do nothing
	}

	public Logger getLog() {
		return log;
	}

	public void setLog(Logger log) {
		this.log = log;
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/AbstractJobCommand.java
================================================
package com.redis.riot.core;

import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.ItemWriteListener;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobExecutionException;
import org.springframework.batch.core.JobExecutionListener;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.JobParametersInvalidException;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.job.builder.SimpleJobBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.launch.support.TaskExecutorJobLauncher;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.batch.core.step.builder.FaultTolerantStepBuilder;
import org.springframework.batch.core.step.builder.SimpleStepBuilder;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.batch.core.step.skip.AlwaysSkipItemSkipPolicy;
import org.springframework.batch.core.step.skip.NeverSkipItemSkipPolicy;
import org.springframework.batch.core.step.tasklet.TaskletStep;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemStreamReader;
import org.springframework.batch.item.ItemStreamSupport;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.support.SynchronizedItemReader;
import org.springframework.batch.item.support.SynchronizedItemStreamReader;
import org.springframework.core.task.SyncTaskExecutor;
import org.springframework.core.task.TaskExecutor;
import org.springframework.retry.policy.AlwaysRetryPolicy;
import org.springframework.retry.policy.NeverRetryPolicy;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.CollectionUtils;

import com.redis.spring.batch.JobUtils;
import com.redis.spring.batch.item.AbstractAsyncItemStreamSupport;
import com.redis.spring.batch.item.PollableItemReader;
import com.redis.spring.batch.step.FlushingStepBuilder;

import picocli.CommandLine.ArgGroup;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;

@Command
public abstract class AbstractJobCommand extends AbstractCallableCommand {

	public static final String DEFAULT_JOB_REPOSITORY_NAME = "riot";

	@Option(names = "--job-name", description = "Job name.", paramLabel = "<string>", hidden = true)
	private String jobName;

	@Option(names = "--repeat", description = "After the job completes keep repeating it on a fixed interval (ex 5m, 1h)", paramLabel = "<dur>")
	private RiotDuration repeatEvery;

	@ArgGroup(exclusive = false, heading = "Job options%n")
	private StepArgs stepArgs = new StepArgs();

	private String jobRepositoryName = DEFAULT_JOB_REPOSITORY_NAME;
	private JobRepository jobRepository;
	private PlatformTransactionManager transactionManager;
	private JobLauncher jobLauncher;
	private JobExplorer jobExplorer;

	protected Runnable onJobSuccessCallback;

	@Override
	protected void initialize() {
		super.initialize();
		if (jobName == null) {
			jobName = jobName();
		}
		if (jobRepository == null) {
			try {
				jobRepository = JobUtils.jobRepositoryFactoryBean(jobRepositoryName).getObject();
			} catch (Exception e) {
				throw new RiotException("Could not create job repository", e);
			}
		}
		if (transactionManager == null) {
			transactionManager = JobUtils.resourcelessTransactionManager();
		}
		if (jobLauncher == null) {
			try {
				jobLauncher = jobLauncher();
			} catch (Exception e) {
				throw new RiotException("Could not create job launcher", e);
			}
		}
		if (jobExplorer == null) {
			try {
				jobExplorer = JobUtils.jobExplorerFactoryBean(jobRepositoryName).getObject();
			} catch (Exception e) {
				log.warn("Error getting jobExplorer", e);
				throw new RiotException("Could not create job explorer", e);
			}
		}
	}

	private JobLauncher jobLauncher() throws Exception {
		TaskExecutorJobLauncher launcher = new TaskExecutorJobLauncher();
		launcher.setJobRepository(jobRepository);
		launcher.setTaskExecutor(new SyncTaskExecutor());
		launcher.afterPropertiesSet();
		return launcher;
	}

	protected void configureAsyncStreamSupport(AbstractAsyncItemStreamSupport<?, ?> reader) {
		reader.setJobRepository(jobRepository);
	}

	private JobBuilder jobBuilder() {
		return new JobBuilder(jobName, jobRepository);
	}

	@Override
	protected void execute() {
		Job job = job();
		JobExecution jobExecution;
		try {
			jobExecution = jobLauncher.run(job, new JobParameters());
		} catch (JobExecutionException e) {
			throw new RiotException(e);
		}
		if (JobUtils.isFailed(jobExecution.getExitStatus())) {
			for (StepExecution stepExecution : jobExecution.getStepExecutions()) {
				ExitStatus stepExitStatus = stepExecution.getExitStatus();
				if (JobUtils.isFailed(stepExitStatus)) {
					if (CollectionUtils.isEmpty(stepExecution.getFailureExceptions())) {
						throw new RiotException(stepExitStatus.getExitDescription());
					}
					throw wrapException(stepExecution.getFailureExceptions());
				}
			}
			throw wrapException(jobExecution.getFailureExceptions());
		}
	}

	private String jobName() {
		if (commandSpec == null) {
			return ClassUtils.getShortName(getClass());
		}
		return commandSpec.name();
	}

	private RiotException wrapException(List<Throwable> throwables) {
		if (throwables.isEmpty()) {
			return new RiotException("Job failed");
		}
		return new RiotException(throwables.get(0));
	}

	protected Job job(Step<?, ?>... steps) {
		return job(Arrays.asList(steps));
	}

	protected Job job(Collection<Step<?, ?>> steps) {
		Assert.notEmpty(steps, "At least one step must be specified");
		Iterator<Step<?, ?>> iterator = steps.iterator();
		SimpleJobBuilder job = jobBuilder().start(step(iterator.next()));
		while (iterator.hasNext()) {
			job.next(step(iterator.next()));
		}

		if (repeatEvery != null) {
			job.incrementer(new RunIdIncrementer());
			job.preventRestart();
			job.listener(new RepeatJobExecutionListener(job, steps));
		}

		return job.build();
	}

	private class RepeatJobExecutionListener implements JobExecutionListener {

		private final SimpleJobBuilder job;
		private final Collection<Step<?, ?>> steps;
		private Job lastJob;

		public RepeatJobExecutionListener(SimpleJobBuilder job, Collection<Step<?, ?>> steps) {
			this.job = job;
			this.steps = steps;
		}

		@Override
		public void afterJob(JobExecution jobExecution) {
			if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
				if (null != onJobSuccessCallback) {
					onJobSuccessCallback.run();
				}

				log.info("Finished job, will run again in {}", repeatEvery);
				try {
					Thread.sleep(repeatEvery.getValue().toMillis());
					if (lastJob == null) {
						lastJob = job.build();
					}

					Job nextJob = jobBuilder().start(step(steps.stream().findFirst().get()))
							.incrementer(new RunIdIncrementer()).preventRestart().listener(this).build();

					JobParametersBuilder paramsBuilder = new JobParametersBuilder(jobExecution.getJobParameters(),
							jobExplorer);

					jobLauncher.run(nextJob,
							paramsBuilder.addString("runTime", String.valueOf(System.currentTimeMillis()))
									.getNextJobParameters(lastJob).toJobParameters());
					lastJob = nextJob;
				} catch (InterruptedException | JobExecutionAlreadyRunningException | JobRestartException
						| JobInstanceAlreadyCompleteException | JobParametersInvalidException e) {
					throw new RiotException(e);
				}
			}
			JobExecutionListener.super.afterJob(jobExecution);
		}
	}

	protected boolean shouldShowProgress() {
		return stepArgs.getProgressArgs().getStyle() != ProgressStyle.NONE;
	}

	protected abstract Job job();

	private <I, O> TaskletStep step(Step<I, O> step) {
		log.info("Creating {}", step);
		SimpleStepBuilder<I, O> builder = simpleStep(step);
		if (stepArgs.getRetryPolicy() == RetryPolicy.NEVER && stepArgs.getSkipPolicy() == SkipPolicy.NEVER) {
			log.info("Skipping fault-tolerance for step {}", step.getName());
			return builder.build();
		}
		log.info("Adding fault-tolerance to step {}", step.getName());
		FaultTolerantStepBuilder<I, O> ftStep = builder.faultTolerant();
		step.getSkip().forEach(ftStep::skip);
		step.getNoSkip().forEach(ftStep::noSkip);
		step.getRetry().forEach(ftStep::retry);
		step.getNoRetry().forEach(ftStep::noRetry);
		ftStep.retryLimit(stepArgs.getRetryLimit());
		ftStep.retryPolicy(retryPolicy());
		ftStep.skipLimit(stepArgs.getSkipLimit());
		ftStep.skipPolicy(skipPolicy());
		return ftStep.build();
	}

	private org.springframework.retry.RetryPolicy retryPolicy() {
		switch (stepArgs.getRetryPolicy()) {
		case ALWAYS:
			return new AlwaysRetryPolicy();
		case NEVER:
			return new NeverRetryPolicy();
		default:
			return null;
		}
	}

	private org.springframework.batch.core.step.skip.SkipPolicy skipPolicy() {
		switch (stepArgs.getSkipPolicy()) {
		case ALWAYS:
			return new AlwaysSkipItemSkipPolicy();
		case NEVER:
			return new NeverSkipItemSkipPolicy();
		default:
			return null;
		}
	}

	@SuppressWarnings("removal")
	private <I, O> SimpleStepBuilder<I, O> simpleStep(Step<I, O> step) {
		String stepName = jobName + "-" + step.getName();
		if (stepName.length() > 80) {
			stepName = stepName.substring(0, 69) + "…" + stepName.substring(stepName.length() - 10);
		}
		if (step.getReader() instanceof ItemStreamSupport) {
			((ItemStreamSupport) step.getReader()).setName(stepName + "-reader");
		}
		log.info("Creating step {} with chunk size {}", stepName, stepArgs.getChunkSize());
		SimpleStepBuilder<I, O> builder = new StepBuilder(stepName, jobRepository).<I, O>chunk(stepArgs.getChunkSize(),
				transactionManager);
		builder.reader(reader(step));
		builder.writer(writer(step));
		builder.processor(step.getProcessor());
		builder.taskExecutor(taskExecutor());
		builder.throttleLimit(stepArgs.getThreads());
		step.getExecutionListeners().forEach(builder::listener);
		step.getWriteListeners().forEach(builder::listener);
		if (shouldShowProgress()) {
			ProgressStepExecutionListener<I, O> listener = new ProgressStepExecutionListener<>(step);
			builder.listener((StepExecutionListener) listener);
			builder.listener((ItemWriteListener<?>) listener);
		}
		if (step.isLive()) {
			log.info("Creating flushing step with flush interval {} and idle timeout {}", step.getFlushInterval(),
					step.getIdleTimeout());
			FlushingStepBuilder<I, O> flushingStepBuilder = new FlushingStepBuilder<>(builder);
			flushingStepBuilder.flushInterval(step.getFlushInterval());
			flushingStepBuilder.idleTimeout(step.getIdleTimeout());
			return flushingStepBuilder;
		}
		return builder;
	}

	private TaskExecutor taskExecutor() {
		if (stepArgs.getThreads() == 1) {
			return new SyncTaskExecutor();
		}
		log.info("Creating thread-pool task executor of size {}", stepArgs.getThreads());
		ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
		taskExecutor.setMaxPoolSize(stepArgs.getThreads());
		taskExecutor.setCorePoolSize(stepArgs.getThreads());
		taskExecutor.initialize();
		return taskExecutor;
	}

	private <I, O> ItemReader<? extends I> reader(Step<I, O> step) {
		if (stepArgs.getThreads() == 1 || step.getReader() instanceof PollableItemReader) {
			return step.getReader();
		}
		log.info("Synchronizing reader in step {}", step.getName());
		if (step.getReader() instanceof ItemStreamReader) {
			SynchronizedItemStreamReader<I> synchronizedReader = new SynchronizedItemStreamReader<>();
			synchronizedReader.setDelegate((ItemStreamReader<I>) step.getReader());
			return synchronizedReader;
		}
		return new SynchronizedItemReader<>(step.getReader());
	}

	private <I, O> ItemWriter<? super O> writer(Step<I, O> step) {
		ItemWriter<O> writer = step.getWriter();
		if (stepArgs.isDryRun()) {
			log.info("Using no-op writer");
			writer = new NoopItemWriter<>();
		}
		if (stepArgs.getSleep() != null) {
			log.info("Throttling writer with sleep={}", stepArgs.getSleep());
			writer = new ThrottledItemWriter<>(writer, stepArgs.getSleep().getValue());
		}
		return writer;
	}

	public String getJobName() {
		return jobName;
	}

	public void setJobName(String name) {
		this.jobName = name;
	}

	public StepArgs getJobArgs() {
		return stepArgs;
	}

	public void setJobArgs(StepArgs args) {
		this.stepArgs = args;
	}

	public String getJobRepositoryName() {
		return jobRepositoryName;
	}

	public void setJobRepositoryName(String jobRepositoryName) {
		this.jobRepositoryName = jobRepositoryName;
	}

	public JobRepository getJobRepository() {
		return jobRepository;
	}

	public void setJobRepository(JobRepository jobRepository) {
		this.jobRepository = jobRepository;
	}

	public PlatformTransactionManager getTransactionManager() {
		return transactionManager;
	}

	public void setTransactionManager(PlatformTransactionManager transactionManager) {
		this.transactionManager = transactionManager;
	}

	public JobLauncher getJobLauncher() {
		return jobLauncher;
	}

	public void setJobLauncher(JobLauncher jobLauncher) {
		this.jobLauncher = jobLauncher;
	}

	public JobExplorer getJobExplorer() {
		return jobExplorer;
	}

	public void setJobExplorer(JobExplorer jobExplorer) {
		this.jobExplorer = jobExplorer;
	}
}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/BaseCommand.java
================================================
package com.redis.riot.core;

import java.util.Map;

import picocli.CommandLine.Command;
import picocli.CommandLine.Mixin;
import picocli.CommandLine.Model.CommandSpec;
import picocli.CommandLine.Option;
import picocli.CommandLine.Spec;

@Command(usageHelpAutoWidth = true, mixinStandardHelpOptions = true, abbreviateSynopsis = true)
public class BaseCommand {

	static {
		if (System.getenv().containsKey("RIOT_NO_COLOR")) {
			System.setProperty("picocli.ansi", "false");
		}
	}

	@Spec
	protected CommandSpec commandSpec;

	@Mixin
	LoggingMixin loggingMixin;

	@Option(names = "-D", paramLabel = "<key=value>", description = "Sets a System property.", mapFallbackValue = "", hidden = true)
	void setProperty(Map<String, String> props) {
		props.forEach(System::setProperty);
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/CompositeExecutionStrategy.java
================================================
package com.redis.riot.core;

import picocli.CommandLine.ExecutionException;
import picocli.CommandLine.IExecutionStrategy;
import picocli.CommandLine.ParameterException;
import picocli.CommandLine.ParseResult;

public class CompositeExecutionStrategy implements IExecutionStrategy {

	private final IExecutionStrategy inactive;
	private final IExecutionStrategy active;

	public CompositeExecutionStrategy(IExecutionStrategy inactive, IExecutionStrategy active) {
		this.inactive = inactive;
		this.active = active;
	}

	@Override
	public int execute(ParseResult parseResult) throws ExecutionException, ParameterException {
		inactive.execute(parseResult);
		return active.execute(parseResult);
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/Expression.java
================================================
package com.redis.riot.core;

import java.util.function.Predicate;

import org.springframework.expression.EvaluationContext;
import org.springframework.expression.common.TemplateParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;

public class Expression {

	protected static final SpelExpressionParser PARSER = new SpelExpressionParser();

	protected final org.springframework.expression.Expression spelExpression;

	public Expression(org.springframework.expression.Expression expression) {
		this.spelExpression = expression;
	}

	@Override
	public String toString() {
		return spelExpression.getExpressionString();
	}

	public <T> Predicate<T> predicate(EvaluationContext context) {
		return t -> spelExpression.getValue(context, t, Boolean.class);
	}

	public Object getValue(EvaluationContext context) {
		return spelExpression.getValue(context);
	}

	public Object getValue(EvaluationContext context, Object rootObject) {
		return spelExpression.getValue(context, rootObject);
	}

	public Long getLong(EvaluationContext context, Object rootObject) {
		return spelExpression.getValue(context, rootObject, Long.class);
	}

	public String getString(EvaluationContext context, Object rootObject) {
		return spelExpression.getValue(context, rootObject, String.class);
	}

	public static Expression parse(String expression) {
		return new Expression(PARSER.parseExpression(expression));
	}

	public static TemplateExpression parseTemplate(String expression) {
		return new TemplateExpression(PARSER.parseExpression(expression, new TemplateParserContext()));
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/IO.java
================================================
package com.redis.riot.core;

import java.io.PrintWriter;

public interface IO {

	PrintWriter getOut();

	void setOut(PrintWriter out);

	PrintWriter getErr();

	void setErr(PrintWriter err);

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/LoggingMixin.java
================================================
package com.redis.riot.core;

import static picocli.CommandLine.Spec.Target.MIXEE;

import java.util.LinkedHashMap;
import java.util.Map;

import org.slf4j.event.Level;
import org.slf4j.simple.SimpleLogger;

import picocli.CommandLine.Model.CommandSpec;
import picocli.CommandLine.Option;
import picocli.CommandLine.ParseResult;
import picocli.CommandLine.Spec;

public class LoggingMixin {

	public static final boolean DEFAULT_SHOW_DATE_TIME = true;
	public static final boolean DEFAULT_SHOW_THREAD_NAME = true;
	public static final boolean DEFAULT_SHOW_LOG_NAME = true;
	public static final Level DEFAULT_LEVEL = Level.WARN;

	/**
	 * This mixin is able to climb the command hierarchy because the
	 * {@code @Spec(Target.MIXEE)}-annotated field gets a reference to the command
	 * where it is used.
	 */
	private @Spec(MIXEE) CommandSpec mixee; // spec of the command where the @Mixin is used

	private String file;
	private boolean showDateTime = DEFAULT_SHOW_DATE_TIME;
	private String dateTimeFormat;
	private boolean showThreadId;
	private boolean showThreadName = DEFAULT_SHOW_THREAD_NAME;
	private boolean showLogName = DEFAULT_SHOW_LOG_NAME;
	private boolean showShortLogName;
	private boolean levelInBrackets;
	private Map<String, Level> levels = new LinkedHashMap<>();
	private Level level = DEFAULT_LEVEL;

	private static LoggingMixin getTopLevelCommandLoggingMixin(CommandSpec commandSpec) {
		return ((MainCommand) commandSpec.root().userObject()).loggingMixin;
	}

	@Option(names = "--log-file", description = "Log output target. Can be a path or special values System.out and System.err (default: System.err).", paramLabel = "<file>")
	public void setFile(String file) {
		getTopLevelCommandLoggingMixin(mixee).file = file;
	}

	@Option(names = "--log-time", description = "Include current date and time in log messages. True by default.", negatable = true, defaultValue = "true", fallbackValue = "true")
	public void setShowDateTime(boolean show) {
		getTopLevelCommandLoggingMixin(mixee).showDateTime = show;
	}

	@Option(names = "--log-time-fmt", defaultValue = "yyyy-MM-dd HH:mm:ss.SSS", description = "Date and time format to be used in log messages (default: ${DEFAULT-VALUE}). Use with --log-time.", paramLabel = "<f>")
	public void setDateTimeFormat(String format) {
		getTopLevelCommandLoggingMixin(mixee).dateTimeFormat = format;
	}

	@Option(names = "--log-thread-id", description = "Include current thread ID in log messages.", hidden = true)
	public void setShowThreadId(boolean show) {
		getTopLevelCommandLoggingMixin(mixee).showThreadId = show;
	}

	@Option(names = "--log-thread", description = "Show current thread name in log messages. True by default.", negatable = true, defaultValue = "true", fallbackValue = "true", hidden = true)
	public void setShowThreadName(boolean show) {
		getTopLevelCommandLoggingMixin(mixee).showThreadName = show;
	}

	@Option(names = "--log-name", description = "Show logger instance name in log messages. True by default.", negatable = true, defaultValue = "true", fallbackValue = "true", hidden = true)
	public void setShowLogName(boolean show) {
		getTopLevelCommandLoggingMixin(mixee).showLogName = show;
	}

	@Option(names = "--log-short", description = "Include last component of logger instance name in log messages. True by default.", negatable = true, defaultValue = "true", fallbackValue = "true", hidden = true)
	public void setShowShortLogName(boolean show) {
		getTopLevelCommandLoggingMixin(mixee).showShortLogName = show;
	}

	@Option(names = "--log-level-brck", description = "Output log level string in brackets.", hidden = true)
	public void setLevelInBrackets(boolean enable) {
		getTopLevelCommandLoggingMixin(mixee).levelInBrackets = enable;
	}

	@Option(arity = "1..*", names = "--log", description = "Custom log levels (e.g.: io.lettuce=INFO).", paramLabel = "<lvl>")
	public void setLevels(Map<String, Level> levels) {
		getTopLevelCommandLoggingMixin(mixee).levels = levels;
	}

	@Option(names = { "-d", "--debug" }, description = "Log in debug mode.")
	public void setDebug(boolean enable) {
		if (enable) {
			getTopLevelCommandLoggingMixin(mixee).level = Level.DEBUG;
		}
	}

	@Option(names = { "-i", "--info" }, description = "Set log level to info.")
	public void setInfo(boolean enable) {
		if (enable) {
			getTopLevelCommandLoggingMixin(mixee).level = Level.INFO;
		}
	}

	@Option(names = { "-q", "--quiet" }, description = "Log errors only.")
	public void setError(boolean enable) {
		if (enable) {
			getTopLevelCommandLoggingMixin(mixee).level = Level.ERROR;
		}
	}

	@Option(names = "--log-level", description = "Set log level: ${COMPLETION-CANDIDATES} (default: WARN).", paramLabel = "<lvl>", hidden = true)
	public void setLevel(Level level) {
		getTopLevelCommandLoggingMixin(mixee).level = level;
	}

	public static int executionStrategy(ParseResult parseResult) {
		getTopLevelCommandLoggingMixin(parseResult.commandSpec()).configureLoggers();
		return 0;
	}

	public void configureLoggers() {
		LoggingMixin mixin = getTopLevelCommandLoggingMixin(mixee);
		System.setProperty(SimpleLogger.DEFAULT_LOG_LEVEL_KEY, mixin.level.name());
		if (mixin.file != null) {
			System.setProperty(SimpleLogger.LOG_FILE_KEY, mixin.file);
		}
		setBoolean(SimpleLogger.SHOW_DATE_TIME_KEY, mixin.showDateTime);
		if (mixin.dateTimeFormat != null) {
			System.setProperty(SimpleLogger.DATE_TIME_FORMAT_KEY, mixin.dateTimeFormat);
		}
		setBoolean(SimpleLogger.SHOW_THREAD_ID_KEY, mixin.showThreadId);
		setBoolean(SimpleLogger.SHOW_THREAD_NAME_KEY, mixin.showThreadName);
		setBoolean(SimpleLogger.SHOW_LOG_NAME_KEY, mixin.showLogName);
		setBoolean(SimpleLogger.SHOW_SHORT_LOG_NAME_KEY, mixin.showShortLogName);
		setBoolean(SimpleLogger.LEVEL_IN_BRACKETS_KEY, mixin.levelInBrackets);
		setLogLevel("com.amazonaws.internal", Level.ERROR);
		setLogLevel("com.redis.spring.batch.step.FlushingFaultTolerantStepBuilder", Level.ERROR);
		setLogLevel("org.springframework.batch.core.step.builder.FaultTolerantStepBuilder", Level.ERROR);
		setLogLevel("org.springframework.batch.core.step.item.ChunkMonitor", Level.ERROR);
		mixin.levels.forEach(this::setLogLevel);
	}

	private void setLogLevel(String key, Level level) {
		System.setProperty(SimpleLogger.LOG_KEY_PREFIX + key, level.name());
	}

	private void setBoolean(String property, boolean value) {
		System.setProperty(property, String.valueOf(value));
	}

	public boolean isStacktrace() {
		return level.toInt() <= Level.INFO.toInt();
	}

}

================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/MainCommand.java
================================================
package com.redis.riot.core;

import java.io.PrintWriter;
import java.util.concurrent.Callable;

import org.springframework.util.unit.DataSize;

import picocli.CommandLine;
import picocli.CommandLine.ParseResult;
import picocli.CommandLine.RunLast;

public class MainCommand extends BaseCommand implements Callable<Integer>, IO {

	private PrintWriter out;
	private PrintWriter err;

	@Override
	public Integer call() throws Exception {
		commandSpec.commandLine().usage(out);
		return 0;
	}

	protected CommandLine commandLine() {
		return new CommandLine(this);
	}

	public int run(String... args) {
		CommandLine commandLine = commandLine();
		setOut(commandLine.getOut());
		setErr(commandLine.getErr());
		commandLine.setCaseInsensitiveEnumValuesAllowed(true);
		commandLine.setUnmatchedOptionsAllowedAsOptionParameters(false);
		commandLine.setExecutionExceptionHandler(new PrintExceptionMessageHandler());
		registerConverters(commandLine);
		commandLine.setExecutionStrategy(
				new CompositeExecutionStrategy(LoggingMixin::executionStrategy, this::executionStrategy));
		return commandLine.execute(args);
	}

	protected int executionStrategy(ParseResult parseResult) {
		return new RunLast().execute(parseResult);
	}

	protected void registerConverters(CommandLine commandLine) {
		commandLine.registerConverter(RiotDuration.class, RiotDuration::parse);
		commandLine.registerConverter(DataSize.class, MainCommand::parseDataSize);
		commandLine.registerConverter(Expression.class, Expression::parse);
		commandLine.registerConverter(TemplateExpression.class, Expression::parseTemplate);
	}

	public static DataSize parseDataSize(String string) {
		return DataSize.parse(string.toUpperCase());
	}

	@Override
	public PrintWriter getOut() {
		return out;
	}

	@Override
	public void setOut(PrintWriter out) {
		this.out = out;
	}

	@Override
	public PrintWriter getErr() {
		return err;
	}

	@Override
	public void setErr(PrintWriter err) {
		this.err = err;
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/NoopItemWriter.java
================================================
package com.redis.riot.core;

import org.springframework.batch.item.Chunk;
import org.springframework.batch.item.ItemWriter;

public class NoopItemWriter<T> implements ItemWriter<T> {

	@Override
	public void write(Chunk<? extends T> items) {
		// Do nothing
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/PrintExceptionMessageHandler.java
================================================
package com.redis.riot.core;

import picocli.CommandLine;
import picocli.CommandLine.IExecutionExceptionHandler;
import picocli.CommandLine.ParseResult;

public class PrintExceptionMessageHandler implements IExecutionExceptionHandler {

	public int handleExecutionException(Exception exception, CommandLine cmd, ParseResult parseResult) {

		Throwable finalException = unwrapException(exception);

		if (cmd.getCommand() instanceof BaseCommand) {
			if (((BaseCommand) cmd.getCommand()).loggingMixin.isStacktrace()) {
				finalException.printStackTrace(cmd.getErr());
			}
		}

		// bold red error message
		cmd.getErr().println(cmd.getColorScheme().errorText(finalException.getMessage()));

		return cmd.getExitCodeExceptionMapper() != null ? cmd.getExitCodeExceptionMapper().getExitCode(finalException)
				: cmd.getCommandSpec().exitCodeOnExecutionException();
	}

	private Throwable unwrapException(Exception exception) {
		if (exception instanceof RiotException) {
			RiotException riotException = (RiotException) exception;
			if (riotException.getCause() == null) {
				return riotException;
			}
			return riotException.getCause();
		}
		return exception;
	}

}

================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/ProcessingItemWriter.java
================================================
package com.redis.riot.core;

import org.springframework.batch.item.Chunk;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemStream;
import org.springframework.batch.item.ItemStreamException;
import org.springframework.batch.item.ItemStreamSupport;
import org.springframework.batch.item.ItemStreamWriter;
import org.springframework.batch.item.ItemWriter;
import org.springframework.util.ClassUtils;

public class ProcessingItemWriter<S, T> extends ItemStreamSupport implements ItemStreamWriter<S> {

	private final ItemProcessor<S, T> processor;
	private final ItemWriter<T> writer;

	public ProcessingItemWriter(ItemProcessor<S, T> processor, ItemWriter<T> writer) {
		setName(ClassUtils.getShortName(getClass()));
		this.processor = processor;
		this.writer = writer;
	}

	@Override
	public void open(ExecutionContext executionContext) throws ItemStreamException {
		if (processor instanceof ItemStream) {
			((ItemStream) processor).open(executionContext);

		}
		if (writer instanceof ItemStream) {
			((ItemStream) writer).open(executionContext);
		}
	}

	@Override
	public void close() throws ItemStreamException {
		if (writer instanceof ItemStream) {
			((ItemStream) writer).close();
		}
		if (processor instanceof ItemStream) {
			((ItemStream) processor).close();
		}
	}

	@Override
	public void update(ExecutionContext executionContext) throws ItemStreamException {
		if (processor instanceof ItemStream) {
			((ItemStream) processor).update(executionContext);
		}
		if (writer instanceof ItemStream) {
			((ItemStream) writer).update(executionContext);
		}
	}

	@Override
	public void write(Chunk<? extends S> chunk) throws Exception {
		Chunk<T> processedChunk = new Chunk<>();
		for (S item : chunk) {
			T processedItem = processor.process(item);
			if (processedItem != null) {
				processedChunk.add(processedItem);
			}
		}
		writer.write(processedChunk);
	}

}

================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/ProgressArgs.java
================================================
package com.redis.riot.core;

import lombok.ToString;
import picocli.CommandLine.Option;

@ToString
public class ProgressArgs {

	public static final RiotDuration DEFAULT_UPDATE_INTERVAL = RiotDuration.ofSeconds(1);
	public static final ProgressStyle DEFAULT_STYLE = ProgressStyle.ASCII;

	@Option(names = "--progress", description = "Progress style: ${COMPLETION-CANDIDATES} (default: ${DEFAULT-VALUE}).", paramLabel = "<style>")
	private ProgressStyle style = DEFAULT_STYLE;

	@Option(names = "--progress-rate", description = "Progress update interval (default: ${DEFAULT-VALUE}).", paramLabel = "<dur>", hidden = true)
	private RiotDuration updateInterval = DEFAULT_UPDATE_INTERVAL;

	public ProgressStyle getStyle() {
		return style;
	}

	public void setStyle(ProgressStyle style) {
		this.style = style;
	}

	public RiotDuration getUpdateInterval() {
		return updateInterval;
	}

	public void setUpdateInterval(RiotDuration interval) {
		this.updateInterval = interval;
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/ProgressStepExecutionListener.java
================================================
package com.redis.riot.core;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.ItemWriteListener;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.item.Chunk;

import me.tongfei.progressbar.DelegatingProgressBarConsumer;
import me.tongfei.progressbar.ProgressBar;
import me.tongfei.progressbar.ProgressBarBuilder;
import me.tongfei.progressbar.ProgressBarStyle;

/**
 * Listener tracking writer or step progress with by a progress bar.
 * 
 * @author Julien Ruaux
 * @since 3.1.2
 */
@SuppressWarnings("rawtypes")
public class ProgressStepExecutionListener<I, O> implements StepExecutionListener, ItemWriteListener {

	private final Step<I, O> step;

	private ProgressArgs progressArgs = new ProgressArgs();

	private ProgressBar progressBar;

	public ProgressStepExecutionListener(Step<I, O> step) {
		this.step = step;
	}

	@Override
	public void beforeStep(StepExecution stepExecution) {
		ProgressBarBuilder progressBarBuilder = new ProgressBarBuilder();
		progressBarBuilder.setTaskName(step.getTaskName());
		progressBarBuilder.setStyle(progressBarStyle());
		progressBarBuilder
				.setUpdateIntervalMillis(Math.toIntExact(progressArgs.getUpdateInterval().getValue().toMillis()));
		progressBarBuilder.showSpeed();
		if (progressArgs.getStyle() == ProgressStyle.LOG) {
			Logger logger = LoggerFactory.getLogger(getClass());
			progressBarBuilder.setConsumer(new DelegatingProgressBarConsumer(logger::info));
		}
		progressBarBuilder.setInitialMax(step.maxItemCount());
		this.progressBar = progressBarBuilder.build();
	}

	private ProgressBarStyle progressBarStyle() {
		switch (progressArgs.getStyle()) {
		case BAR:
			return ProgressBarStyle.COLORFUL_UNICODE_BAR;
		case BLOCK:
			return ProgressBarStyle.COLORFUL_UNICODE_BLOCK;
		default:
			return ProgressBarStyle.ASCII;
		}
	}

	@Override
	public void afterWrite(Chunk items) {
		if (progressBar != null) {
			progressBar.stepBy(items.size());
			progressBar.setExtraMessage(step.statusMessage());
		}
	}

	@Override
	public ExitStatus afterStep(StepExecution stepExecution) {
		if (progressBar != null) {
			if (!stepExecution.getStatus().isUnsuccessful()) {
				progressBar.stepTo(progressBar.getMax());
			}
			progressBar.close();
			progressBar = null;
		}
		return stepExecution.getExitStatus();
	}

	public ProgressArgs getProgressArgs() {
		return progressArgs;
	}

	public void setProgressArgs(ProgressArgs args) {
		this.progressArgs = args;
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/ProgressStyle.java
================================================
package com.redis.riot.core;

public enum ProgressStyle {

	BLOCK, BAR, ASCII, LOG, NONE

}

================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/QuietMapAccessor.java
================================================
package com.redis.riot.core;

import org.springframework.context.expression.MapAccessor;
import org.springframework.expression.AccessException;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.TypedValue;
import org.springframework.lang.Nullable;

/**
 * {@link org.springframework.context.expression.MapAccessor} that always
 * returns true for canRead and does not throw AccessExceptions
 */
public class QuietMapAccessor extends MapAccessor {

	@Override
	public boolean canRead(EvaluationContext context, @Nullable Object target, String name) {
		return true;
	}

	@Override
	public TypedValue read(EvaluationContext context, @Nullable Object target, String name) {
		try {
			return super.read(context, target, name);
		} catch (AccessException e) {
			return new TypedValue(null);
		}
	}

}

================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/RetryPolicy.java
================================================
package com.redis.riot.core;

public enum RetryPolicy {

	ALWAYS, NEVER, LIMIT

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/RiotDuration.java
================================================
package com.redis.riot.core;

import java.time.Duration;
import java.time.temporal.ChronoUnit;

import org.springframework.boot.convert.DurationStyle;
import org.springframework.util.Assert;

/**
 * Wrapper around java.time.Duration with a custom toString
 */
public class RiotDuration {

	private final Duration value;
	private final ChronoUnit displayUnit;

	public RiotDuration(long value, ChronoUnit unit) {
		this(Duration.of(value, unit), unit);
	}

	public RiotDuration(Duration duration, ChronoUnit displayUnit) {
		Assert.notNull(duration, "Duration must not be null");
		Assert.notNull(displayUnit, "Unit must not be null");
		this.value = duration;
		this.displayUnit = displayUnit;
	}

	public Duration getValue() {
		return value;
	}

	@Override
	public String toString() {
		return DurationStyle.SIMPLE.print(value, displayUnit);
	}

	public static RiotDuration parse(String string) {
		return new RiotDuration(DurationStyle.SIMPLE.parse(string), ChronoUnit.MILLIS);
	}

	public static RiotDuration of(long value, ChronoUnit unit) {
		return new RiotDuration(value, unit);
	}

	public static RiotDuration of(Duration duration, ChronoUnit unit) {
		return new RiotDuration(duration, unit);
	}

	public static RiotDuration ofSeconds(long seconds) {
		return new RiotDuration(seconds, ChronoUnit.SECONDS);
	}

	public static RiotDuration ofMillis(long millis) {
		return new RiotDuration(millis, ChronoUnit.MILLIS);
	}
}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/RiotException.java
================================================
package com.redis.riot.core;

@SuppressWarnings("serial")
public class RiotException extends RuntimeException {

	public RiotException(String message, Throwable cause) {
		super(message, cause);
	}

	public RiotException(String message) {
		super(message);
	}

	public RiotException(Throwable cause) {
		super(cause);
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/RiotUtils.java
================================================
package com.redis.riot.core;

import static java.nio.charset.StandardCharsets.UTF_8;

import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.time.Duration;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.function.FunctionItemProcessor;
import org.springframework.batch.item.support.CompositeItemProcessor;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.util.ClassUtils;
import org.springframework.util.ObjectUtils;

public abstract class RiotUtils {

	private RiotUtils() {
	}

	public static String mask(char[] password) {
		if (ObjectUtils.isEmpty(password)) {
			return null;
		}
		return mask(password.length);
	}

	private static String mask(int length) {
		return IntStream.range(0, length).mapToObj(i -> "*").collect(Collectors.joining());
	}

	public static String mask(String password) {
		if (ObjectUtils.isEmpty(password)) {
			return null;
		}
		return mask(password.length());
	}

	public static <S, T> ItemProcessor<S, T> processor(Collection<? extends Function<?, ?>> functions) {
		return processor(functions.toArray(new Function[0]));
	}

	@SuppressWarnings("unchecked")
	public static <S, T> ItemProcessor<S, T> processor(Function<?, ?>... functions) {
		return processor(Stream.of(functions).filter(Objects::nonNull).map(FunctionItemProcessor::new)
				.toArray(ItemProcessor[]::new));
	}

	public static <S, T> ItemProcessor<S, T> processor(ItemProcessor<?, ?>... processors) {
		return processor(Stream.of(processors));
	}

	public static <S, T> ItemProcessor<S, T> processor(Iterable<? extends ItemProcessor<?, ?>> processors) {
		return processor(StreamSupport.stream(processors.spliterator(), false));
	}

	@SuppressWarnings("unchecked")
	public static <S, T> ItemProcessor<S, T> processor(Stream<? extends ItemProcessor<?, ?>> processors) {
		List<? extends ItemProcessor<?, ?>> list = processors.filter(Objects::nonNull).collect(Collectors.toList());
		if (list.isEmpty()) {
			return null;
		}
		if (list.size() > 1) {
			CompositeItemProcessor<S, T> composite = new CompositeItemProcessor<>();
			composite.setDelegates(list);
			return composite;
		}
		return (ItemProcessor<S, T>) list.get(0);
	}

	public static boolean isPositive(Duration duration) {
		return duration != null && !duration.isNegative() && !duration.isZero();
	}

	public static PrintStream newPrintStream(OutputStream out) {
		return newPrintStream(out, true);
	}

	public static PrintStream newPrintStream(OutputStream out, boolean autoFlush) {
		try {
			return new PrintStream(out, autoFlush, UTF_8.name());
		} catch (UnsupportedEncodingException e) {
			throw new IllegalArgumentException(e);
		}
	}

	public static PrintWriter newPrintWriter(OutputStream out) {
		return newPrintWriter(out, true);
	}

	public static PrintWriter newPrintWriter(OutputStream out, boolean autoFlush) {
		return new PrintWriter(new BufferedWriter(new OutputStreamWriter(out, UTF_8)), autoFlush);
	}

	public static String toString(ByteArrayOutputStream out) {
		try {
			return out.toString(UTF_8.name());
		} catch (UnsupportedEncodingException e) {
			throw new IllegalArgumentException(e);
		}
	}

	public static void registerFunction(StandardEvaluationContext context, String functionName, Class<?> clazz,
			String methodName, Class<?>... parameterTypes) {
		try {
			context.registerFunction(functionName, clazz.getDeclaredMethod(methodName, parameterTypes));
		} catch (Exception e) {
			throw new UnsupportedOperationException(
					String.format("Could not get method %s.%s", ClassUtils.getQualifiedName(clazz), methodName), e);
		}
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/RiotVersion.java
================================================
package com.redis.riot.core;

import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.ResourceBundle;

public class RiotVersion {

	private static final ResourceBundle BUNDLE = ResourceBundle.getBundle(RiotVersion.class.getName());
	private static final String RIOT_VERSION = BUNDLE.getString("riot_version");
	private static final String SEPARATOR = "------------------------------------------------------------%n";
	private static final String RIOT_FORMAT = "riot %s%n";

	private RiotVersion() {
		// noop
	}

	public static String getVersion() {
		return RIOT_VERSION;
	}

	public static void banner(PrintStream out) {
		banner(out, true);
	}

	public static void banner(PrintStream out, boolean full) {
		banner(RiotUtils.newPrintWriter(out), full);
	}

	public static void banner(PrintWriter out) {
		banner(out, true);
	}

	public static void banner(PrintWriter out, boolean full) {
		banner(out, full, BUNDLE, RIOT_FORMAT, RIOT_VERSION);
	}

	public static void banner(PrintWriter out, boolean full, ResourceBundle bundle, String format, String version) {
		if (full) {
			out.printf(SEPARATOR);
			out.printf(format, version);
			out.printf(SEPARATOR);
			out.printf("Build time:   %s %s%n", bundle.getString("build_date"), bundle.getString("build_time"));
			out.printf("Revision:     %s%n", bundle.getString("build_revision"));
			out.printf("JVM:          %s (%s %s)%n", System.getProperty("java.version"),
					System.getProperty("java.vendor"), System.getProperty("java.vm.version"));
			out.printf(SEPARATOR);
		} else {
			out.printf(format, version);
		}
	}

}

================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/SkipPolicy.java
================================================
package com.redis.riot.core;

public enum SkipPolicy {

	ALWAYS, NEVER, LIMIT

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/Step.java
================================================
package com.redis.riot.core;

import java.time.Duration;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.function.LongSupplier;
import java.util.function.Supplier;

import org.springframework.batch.core.ItemReadListener;
import org.springframework.batch.core.ItemWriteListener;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;

import com.redis.spring.batch.step.FlushingChunkProvider;

import lombok.ToString;

@ToString
public class Step<I, O> {

	private static final long NO_MAX_ITEM_COUNT = -1;
	private static final String EMPTY_STRING = "";
	public static final String DEFAULT_NAME = "step";

	private String name = DEFAULT_NAME;
	private final ItemReader<I> reader;
	private final ItemWriter<O> writer;
	private String taskName;
	private Supplier<String> statusMessageSupplier = () -> EMPTY_STRING;
	private LongSupplier maxItemCountSupplier = () -> NO_MAX_ITEM_COUNT;
	private ItemProcessor<I, O> processor;
	private Set<StepExecutionListener> executionListeners = new LinkedHashSet<>();
	private Set<ItemReadListener<I>> readListeners = new LinkedHashSet<>();
	private Set<ItemWriteListener<O>> writeListeners = new LinkedHashSet<>();
	private boolean live;
	private Duration flushInterval = FlushingChunkProvider.DEFAULT_FLUSH_INTERVAL;
	private Duration idleTimeout = FlushingChunkProvider.DEFAULT_IDLE_TIMEOUT;
	private Collection<Class<? extends Throwable>> skip = new HashSet<>();
	private Collection<Class<? extends Throwable>> noSkip = new HashSet<>();
	private Collection<Class<? extends Throwable>> retry = new HashSet<>();
	private Collection<Class<? extends Throwable>> noRetry = new HashSet<>();

	public Step(ItemReader<I> reader, ItemWriter<O> writer) {
		this.reader = reader;
		this.writer = writer;
	}

	public String getName() {
		return name;
	}

	public Step<I, O> name(String name) {
		this.name = name;
		return this;
	}

	public String getTaskName() {
		return taskName;
	}

	public Step<I, O> taskName(String name) {
		this.taskName = name;
		return this;
	}

	public ItemReader<I> getReader() {
		return reader;
	}

	public ItemProcessor<I, O> getProcessor() {
		return processor;
	}

	public ItemWriter<O> getWriter() {
		return writer;
	}

	public long maxItemCount() {
		return maxItemCountSupplier.getAsLong();
	}

	public String statusMessage() {
		return statusMessageSupplier.get();
	}

	public Supplier<String> getStatusMessageSupplier() {
		return statusMessageSupplier;
	}

	public Step<I, O> statusMessageSupplier(Supplier<String> supplier) {
		this.statusMessageSupplier = supplier;
		return this;
	}

	public LongSupplier getMaxItemCountSupplier() {
		return maxItemCountSupplier;
	}

	public Step<I, O> maxItemCountSupplier(LongSupplier supplier) {
		this.maxItemCountSupplier = supplier;
		return this;
	}

	public Step<I, O> processor(ItemProcessor<I, O> processor) {
		this.processor = processor;
		return this;
	}

	public Step<I, O> maxItemCount(int count) {
		return maxItemCountSupplier(() -> count);
	}

	public Set<ItemReadListener<I>> getReadListeners() {
		return readListeners;
	}

	public Step<I, O> readListener(ItemReadListener<I> listener) {
		this.readListeners.add(listener);
		return this;
	}

	public Set<ItemWriteListener<O>> getWriteListeners() {
		return writeListeners;
	}

	public Step<I, O> writeListener(ItemWriteListener<O> listener) {
		writeListeners.add(listener);
		return this;
	}

	public Set<StepExecutionListener> getExecutionListeners() {
		return executionListeners;
	}

	public Step<I, O> executionListener(StepExecutionListener listener) {
		executionListeners.add(listener);
		return this;
	}

	public Duration getFlushInterval() {
		return flushInterval;
	}

	public Step<I, O> flushInterval(Duration flushInterval) {
		this.flushInterval = flushInterval;
		return this;
	}

	public Duration getIdleTimeout() {
		return idleTimeout;
	}

	public Step<I, O> idleTimeout(Duration idleTimeout) {
		this.idleTimeout = idleTimeout;
		return this;
	}

	public boolean isLive() {
		return live;
	}

	public Step<I, O> live(boolean live) {
		this.live = live;
		return this;
	}

	public Step<I, O> skip(Class<? extends Throwable> exception) {
		skip.add(exception);
		return this;
	}

	public Step<I, O> retry(Class<? extends Throwable> exception) {
		retry.add(exception);
		return this;
	}

	public Step<I, O> noSkip(Class<? extends Throwable> exception) {
		noSkip.add(exception);
		return this;
	}

	public Step<I, O> noRetry(Class<? extends Throwable> exception) {
		noRetry.add(exception);
		return this;
	}

	public Collection<Class<? extends Throwable>> getNoRetry() {
		return noRetry;
	}

	public Collection<Class<? extends Throwable>> getNoSkip() {
		return noSkip;
	}

	public Collection<Class<? extends Throwable>> getRetry() {
		return retry;
	}

	public Collection<Class<? extends Throwable>> getSkip() {
		return skip;
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/StepArgs.java
================================================
package com.redis.riot.core;

import org.springframework.retry.policy.MaxAttemptsRetryPolicy;

import lombok.ToString;
import picocli.CommandLine.ArgGroup;
import picocli.CommandLine.Option;

@ToString
public class StepArgs {

	public static final int DEFAULT_CHUNK_SIZE = 50;
	public static final int DEFAULT_THREADS = 1;
	public static final RetryPolicy DEFAULT_RETRY_POLICY = RetryPolicy.NEVER;
	public static final SkipPolicy DEFAULT_SKIP_POLICY = SkipPolicy.NEVER;
	public static final int DEFAULT_RETRY_LIMIT = MaxAttemptsRetryPolicy.DEFAULT_MAX_ATTEMPTS;

	@Option(names = "--sleep", description = "Duration to wait after each batch write, e.g. 1ms or 3s (default: no sleep).", paramLabel = "<dur>")
	private RiotDuration sleep;

	@Option(names = "--threads", description = "Number of concurrent threads to use for batch processing (default: ${DEFAULT-VALUE}).", paramLabel = "<int>")
	private int threads = DEFAULT_THREADS;

	@Option(names = "--batch", description = "Number of items in each batch (default: ${DEFAULT-VALUE}).", paramLabel = "<size>")
	private int chunkSize = DEFAULT_CHUNK_SIZE;

	@Option(names = "--dry-run", description = "Enable dummy writes.")
	private boolean dryRun;

	@Option(names = "--skip", description = "Skip policy: ${COMPLETION-CANDIDATES} (default: ${DEFAULT-VALUE}).", paramLabel = "<name>")
	private SkipPolicy skipPolicy = DEFAULT_SKIP_POLICY;

	@Option(names = "--skip-limit", description = "Number of skips tolerated before failing. Use with limit skip policy.", paramLabel = "<int>")
	private int skipLimit;

	@Option(names = "--retry", description = "Retry policy: ${COMPLETION-CANDIDATES} (default: ${DEFAULT-VALUE}).", paramLabel = "<name>")
	private RetryPolicy retryPolicy = DEFAULT_RETRY_POLICY;

	@Option(names = "--retry-limit", description = "Number of times to try failed items (default: ${DEFAULT-VALUE}). 0 and 1 both mean no retry. Use with limit retry policy", paramLabel = "<int>")
	private int retryLimit = DEFAULT_RETRY_LIMIT;

	@ArgGroup(exclusive = false)
	private ProgressArgs progressArgs = new ProgressArgs();

	public RiotDuration getSleep() {
		return sleep;
	}

	public void setSleep(RiotDuration sleep) {
		this.sleep = sleep;
	}

	public int getThreads() {
		return threads;
	}

	public void setThreads(int threads) {
		this.threads = threads;
	}

	public int getChunkSize() {
		return chunkSize;
	}

	public void setChunkSize(int chunkSize) {
		this.chunkSize = chunkSize;
	}

	public boolean isDryRun() {
		return dryRun;
	}

	public void setDryRun(boolean dryRun) {
		this.dryRun = dryRun;
	}

	public ProgressArgs getProgressArgs() {
		return progressArgs;
	}

	public void setProgressArgs(ProgressArgs args) {
		this.progressArgs = args;
	}

	public int getSkipLimit() {
		return skipLimit;
	}

	public void setSkipLimit(int skipLimit) {
		this.skipLimit = skipLimit;
	}

	public int getRetryLimit() {
		return retryLimit;
	}

	public void setRetryLimit(int retryLimit) {
		this.retryLimit = retryLimit;
	}

	public SkipPolicy getSkipPolicy() {
		return skipPolicy;
	}

	public void setSkipPolicy(SkipPolicy skipPolicy) {
		this.skipPolicy = skipPolicy;
	}

	public RetryPolicy getRetryPolicy() {
		return retryPolicy;
	}

	public void setRetryPolicy(RetryPolicy retryPolicy) {
		this.retryPolicy = retryPolicy;
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/StepConfiguration.java
================================================
package com.redis.riot.core;

import org.springframework.batch.core.step.builder.SimpleStepBuilder;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;

public interface StepConfiguration {

	<I, O> void configure(SimpleStepBuilder<I, O> step, String name, ItemReader<I> reader, ItemWriter<O> writer);

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/TemplateExpression.java
================================================
package com.redis.riot.core;

import org.springframework.expression.EvaluationContext;

public class TemplateExpression extends Expression {

	public TemplateExpression(org.springframework.expression.Expression expression) {
		super(expression);
	}

	@Override
	public String getValue(EvaluationContext context) {
		return spelExpression.getValue(context, String.class);
	}

	@Override
	public String getValue(EvaluationContext context, Object rootObject) {
		return spelExpression.getValue(context, rootObject, String.class);
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/ThrottledItemWriter.java
================================================
package com.redis.riot.core;

import java.time.Duration;

import org.springframework.batch.item.Chunk;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemStream;
import org.springframework.batch.item.ItemStreamWriter;
import org.springframework.batch.item.ItemWriter;
import org.springframework.util.Assert;

public class ThrottledItemWriter<T> implements ItemStreamWriter<T> {

	private final ItemWriter<T> delegate;
	private final Duration sleep;

	public ThrottledItemWriter(ItemWriter<T> delegate, Duration sleep) {
		Assert.notNull(delegate, "Delegate must not be null");
		Assert.notNull(sleep, "Sleep must not be null");
		Assert.isTrue(sleep.isPositive(), "Sleep duration must be positive");
		this.delegate = delegate;
		this.sleep = sleep;
	}

	@Override
	public void open(ExecutionContext executionContext) {
		if (delegate instanceof ItemStream) {
			((ItemStream) delegate).open(executionContext);
		}
	}

	@Override
	public void update(ExecutionContext executionContext) {
		if (delegate instanceof ItemStream) {
			((ItemStream) delegate).update(executionContext);
		}
	}

	@Override
	public void close() {
		if (delegate instanceof ItemStream) {
			((ItemStream) delegate).close();
		}
	}

	@Override
	public void write(Chunk<? extends T> items) throws Exception {
		delegate.write(items);
		Thread.sleep(sleep);
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/CollectionToMapFunction.java
================================================
package com.redis.riot.core.processor;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

public class CollectionToMapFunction implements Function<Collection<String>, Map<String, String>> {

	public static final String DEFAULT_KEY_FORMAT = "%s";

	private String keyFormat = DEFAULT_KEY_FORMAT;

	public void setKeyFormat(String keyFormat) {
		this.keyFormat = keyFormat;
	}

	@Override
	public Map<String, String> apply(Collection<String> source) {
		Map<String, String> result = new HashMap<>();
		int index = 0;
		for (String element : source) {
			result.put(String.format(keyFormat, index), element);
			index++;
		}
		return result;
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/ConsumerUnaryOperator.java
================================================
package com.redis.riot.core.processor;

import java.util.function.Consumer;
import java.util.function.UnaryOperator;

public class ConsumerUnaryOperator<T> implements UnaryOperator<T> {

	private final Consumer<T> consumer;

	public ConsumerUnaryOperator(Consumer<T> consumer) {
		this.consumer = consumer;
	}

	@Override
	public T apply(T t) {
		consumer.accept(t);
		return t;
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/FieldExtractorFactory.java
================================================
package com.redis.riot.core.processor;

import java.util.Map;
import java.util.function.Function;
import java.util.function.ToDoubleFunction;
import java.util.function.ToLongFunction;

public class FieldExtractorFactory {

	private boolean remove;

	private boolean nullCheck;

	public void setRemove(boolean remove) {
		this.remove = remove;
	}

	public void setNullCheck(boolean nullCheck) {
		this.nullCheck = nullCheck;
	}

	public Function<Map<String, Object>, Object> field(String field) {
		Function<Map<String, Object>, Object> extractor = extractor(field);
		if (nullCheck) {
			return new NullCheckExtractor(field, extractor);
		}
		return extractor;
	}

	private <T> Function<Map<String, T>, T> extractor(String field) {
		if (remove) {
			return s -> s.remove(field);
		}
		return s -> s.get(field);
	}

	public Function<Map<String, Object>, String> string(String field) {
		return field(field).andThen(new ObjectToStringFunction());
	}

	public <T> Function<Map<String, T>, T> field(String field, T defaultValue) {
		return new DefaultValueExtractor<>(extractor(field), defaultValue);
	}

	public ToLongFunction<Map<String, Object>> longField(String field) {
		Function<Map<String, Object>, Object> extractor = extractor(field);
		ObjectToLongFunction function = new ObjectToLongFunction();
		return m -> function.applyAsLong(extractor.apply(m));
	}

	public ToDoubleFunction<Map<String, Object>> doubleField(String field, double defaultValue) {
		Function<Map<String, Object>, Object> extractor = extractor(field);
		ObjectToDoubleFunction function = new ObjectToDoubleFunction(defaultValue);
		return m -> function.applyAsDouble(extractor.apply(m));
	}

	public static class MissingFieldException extends RuntimeException {

		private static final long serialVersionUID = 1L;

		public MissingFieldException(String msg) {
			super(msg);
		}

	}

	private static class DefaultValueExtractor<T> implements Function<Map<String, T>, T> {

		private final Function<Map<String, T>, T> extractor;

		private final T defaultValue;

		public DefaultValueExtractor(Function<Map<String, T>, T> extractor, T defaultValue) {
			this.extractor = extractor;
			this.defaultValue = defaultValue;
		}

		@Override
		public T apply(Map<String, T> source) {
			T value = extractor.apply(source);
			if (value == null) {
				return defaultValue;
			}
			return value;

		}

	}

	private static class NullCheckExtractor implements Function<Map<String, Object>, Object> {

		private final String field;

		private final Function<Map<String, Object>, Object> extractor;

		public NullCheckExtractor(String field, Function<Map<String, Object>, Object> extractor) {
			this.field = field;
			this.extractor = extractor;
		}

		@Override
		public Object apply(Map<String, Object> source) {
			Object value = extractor.apply(source);
			if (value == null) {
				throw new MissingFieldException("Error: Missing required field: '" + field + "'");
			}
			return value;
		}

	}

	public static FieldExtractorFactoryBuilder builder() {
		return new FieldExtractorFactoryBuilder();
	}

	public static class FieldExtractorFactoryBuilder {

		private boolean remove;

		private boolean nullCheck;

		public FieldExtractorFactoryBuilder remove(boolean remove) {
			this.remove = remove;
			return this;
		}

		public FieldExtractorFactoryBuilder nullCheck(boolean nullCheck) {
			this.nullCheck = nullCheck;
			return this;
		}

		public FieldExtractorFactory build() {
			FieldExtractorFactory factory = new FieldExtractorFactory();
			factory.setRemove(remove);
			factory.setNullCheck(nullCheck);
			return factory;
		}

	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/FunctionPredicate.java
================================================
package com.redis.riot.core.processor;

import java.util.function.Function;
import java.util.function.Predicate;

public class FunctionPredicate<S, T> implements Predicate<S> {

	private final Function<S, T> function;
	private final Predicate<T> predicate;

	public FunctionPredicate(Function<S, T> function, Predicate<T> predicate) {
		this.function = function;
		this.predicate = predicate;
	}

	@Override
	public boolean test(S t) {
		return predicate.test(function.apply(t));
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/IdFunctionBuilder.java
================================================
package com.redis.riot.core.processor;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

import org.springframework.util.CollectionUtils;

public class IdFunctionBuilder {

    public static final String DEFAULT_SEPARATOR = ":";

    private String separator = DEFAULT_SEPARATOR;

    private String prefix;

    private final FieldExtractorFactory extractorFactory = FieldExtractorFactory.builder().nullCheck(true).build();

    private final List<String> fields = new ArrayList<>();

    public IdFunctionBuilder remove(boolean remove) {
        this.extractorFactory.setRemove(remove);
        return this;
    }

    public IdFunctionBuilder fields(String... fields) {
        return fields(Arrays.asList(fields));
    }

    public IdFunctionBuilder fields(List<String> fields) {
        if (!CollectionUtils.isEmpty(fields)) {
            this.fields.addAll(fields);
        }
        return this;
    }

    public IdFunctionBuilder prefix(String prefix) {
        this.prefix = prefix;
        return this;
    }

    public IdFunctionBuilder separator(String separator) {
        this.separator = separator;
        return this;
    }

    public Function<Map<String, Object>, String> build() {
        if (fields.isEmpty()) {
            if (prefix != null) {
                return m -> prefix;
            }
            throw new IllegalArgumentException("No prefix and no fields specified");
        }
        if (fields.size() == 1) {
            Function<Map<String, Object>, String> extractor = extractorFactory.string(fields.get(0));
            if (prefix != null) {
                return s -> prefix + separator + extractor.apply(s);
            }
            return extractor::apply;
        }
        List<Function<Map<String, Object>, String>> toStringFunctions = new ArrayList<>();
        if (prefix != null) {
            toStringFunctions.add(s -> prefix);
        }
        for (String field : fields) {
            toStringFunctions.add(extractorFactory.string(field));
        }
        return new ConcatenatingFunction(separator, toStringFunctions);
    }

    public static class ConcatenatingFunction implements Function<Map<String, Object>, String> {

        private final String separator;

        private final List<Function<Map<String, Object>, String>> toStringFunctions;

        public ConcatenatingFunction(String separator, List<Function<Map<String, Object>, String>> toStringFunctions) {
            this.separator = separator;
            this.toStringFunctions = toStringFunctions;
        }

        @Override
        public String apply(Map<String, Object> source) {
            if (source == null) {
                return null;
            }
            StringBuilder builder = new StringBuilder();
            builder.append(toStringFunctions.get(0).apply(source));
            for (int index = 1; index < toStringFunctions.size(); index++) {
                builder.append(separator);
                builder.append(toStringFunctions.get(index).apply(source));
            }
            return builder.toString();
        }

    }

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/MapFilteringFunction.java
================================================
package com.redis.riot.core.processor;

import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.UnaryOperator;

import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;

public class MapFilteringFunction implements UnaryOperator<Map<String, String>> {

    private Collection<String> includes;

    private Collection<String> excludes;

    public MapFilteringFunction excludes(Collection<String> fields) {
        this.excludes = new HashSet<>(fields);
        return this;
    }

    public MapFilteringFunction includes(Collection<String> fields) {
        includes = new HashSet<>(fields);
        return this;
    }

    @Override
    public Map<String, String> apply(Map<String, String> source) {
        Map<String, String> filtered = ObjectUtils.isEmpty(includes) ? source : new LinkedHashMap<>();
        if (!CollectionUtils.isEmpty(includes)) {
            includes.forEach(f -> filtered.put(f, source.get(f)));
        }
        if (!CollectionUtils.isEmpty(excludes)) {
            excludes.forEach(filtered::remove);
        }
        return filtered;
    }

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/MapFlatteningFunction.java
================================================
package com.redis.riot.core.processor;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Function;

import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;

/**
 * Flattens a nested map using . and [] notation for key names
 *
 */
public class MapFlatteningFunction<T> implements Function<Map<String, Object>, Map<String, T>> {

    private final Function<Object, T> elementFunction;

    public MapFlatteningFunction(Function<Object, T> elementFunction) {
        this.elementFunction = elementFunction;
    }

    @Override
    public Map<String, T> apply(Map<String, Object> source) {
        Map<String, T> resultMap = new LinkedHashMap<>();
        flatten("", source.entrySet().iterator(), resultMap);
        return resultMap;
    }

    private void flatten(String prefix, Iterator<? extends Entry<String, Object>> map, Map<String, T> flatMap) {
        String actualPrefix = StringUtils.hasText(prefix) ? prefix.concat(".") : prefix;
        while (map.hasNext()) {
            Entry<String, Object> element = map.next();
            flattenElement(actualPrefix.concat(element.getKey()), element.getValue(), flatMap);
        }
    }

    @SuppressWarnings("unchecked")
    private void flattenElement(String propertyPrefix, @Nullable Object source, Map<String, T> flatMap) {
        if (source == null) {
            return;
        }
        if (source instanceof Iterable) {
            int counter = 0;
            for (Object element : (Iterable<Object>) source) {
                flattenElement(propertyPrefix + "[" + counter + "]", element, flatMap);
                counter++;
            }
        } else if (source instanceof Map) {
            flatten(propertyPrefix, ((Map<String, Object>) source).entrySet().iterator(), flatMap);
        } else {
            ((Map<String, Object>) flatMap).put(propertyPrefix, elementFunction.apply(source));
        }
    }

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/ObjectToDoubleFunction.java
================================================
package com.redis.riot.core.processor;

import java.util.function.ToDoubleFunction;

public class ObjectToDoubleFunction implements ToDoubleFunction<Object> {

    private final double defaultValue;

    public ObjectToDoubleFunction(double defaultValue) {
        this.defaultValue = defaultValue;
    }

    @Override
    public double applyAsDouble(Object value) {
        if (value != null) {
            if (value instanceof Number) {
                return ((Number) value).doubleValue();
            }
            if (value instanceof String) {
                String string = (String) value;
                if (!string.isEmpty()) {
                    return Double.parseDouble(string);
                }
            }
        }
        return defaultValue;
    }

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/ObjectToLongFunction.java
================================================
package com.redis.riot.core.processor;

import java.util.function.ToLongFunction;

import org.springframework.util.StringUtils;

public class ObjectToLongFunction implements ToLongFunction<Object> {

	@Override
	public long applyAsLong(Object source) {
		if (source != null) {
			if (source instanceof Number) {
				return ((Number) source).longValue();
			}
			if (source instanceof String) {
				String string = (String) source;
				if (StringUtils.hasLength(string)) {
					return Long.parseLong(string);
				}
			}
		}
		return 0;
	}

}

================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/ObjectToStringFunction.java
================================================
package com.redis.riot.core.processor;

import java.util.function.Function;

public class ObjectToStringFunction implements Function<Object, String> {

	@Override
	public String apply(Object source) {
		if (source == null) {
			return null;
		}
		return source.toString();
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/PredicateOperator.java
================================================
package com.redis.riot.core.processor;

import java.util.function.Predicate;
import java.util.function.UnaryOperator;

/**
 * Unary operator that only keeps items that match the given predicate., i.e.
 * returns a given item if predicate.test(item) == true, null otherwise
 * 
 * @param <T>
 */
public class PredicateOperator<T> implements UnaryOperator<T> {

	private final Predicate<T> predicate;

	public PredicateOperator(Predicate<T> predicate) {
		this.predicate = predicate;
	}

	@Override
	public T apply(T item) {
		if (predicate.test(item)) {
			return item;
		}
		return null;
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/RegexNamedGroupFunction.java
================================================
package com.redis.riot.core.processor;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexNamedGroupFunction implements Function<String, Map<String, String>> {

	private static final String NAMED_GROUPS = "\\(\\?<([a-zA-Z][a-zA-Z0-9]*)>";

	private final Pattern pattern;
	private final Set<String> namedGroups;

	public RegexNamedGroupFunction(Pattern pattern) {
		this.pattern = pattern;
		this.namedGroups = new TreeSet<>();
		Matcher m = Pattern.compile(NAMED_GROUPS).matcher(pattern.pattern());
		while (m.find()) {
			namedGroups.add(m.group(1));
		}
	}

	@Override
	public Map<String, String> apply(String string) {
		Matcher matcher = pattern.matcher(string);
		if (matcher.find()) {
			Map<String, String> fields = new HashMap<>();
			for (String name : namedGroups) {
				fields.put(name, matcher.group(name));
			}
			return fields;
		}
		return Collections.emptyMap();
	}

}


================================================
FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/StringToMapFunction.java
================================================
package com.redis.riot.core.processor;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import java.util.function.UnaryOperator;

public class StringToMapFunction implements Function<String, Map<String, String>> {

	public static final String DEFAULT_KEY = "value";
	public static final UnaryOperator<String> DEFAULT_KEY_EXTRACTOR = s -> DEFAULT_KEY;

	private UnaryOperator<String> keyExtractor = DEFAULT_KEY_EXTRACTOR;

	public void setKeyExtractor(UnaryOperator<String> keyExtractor) {
		this.keyExtractor = keyExtractor;
	}

	@Override
	public Map<String, String> apply(String t) {
		Map<String, String> result = new HashMap<>();
		result.put(keyExtractor.apply(t), t);
		return result;
	}

}


================================================
FILE: core/riot-core/src/main/resources/com/redis/riot/core/RiotVersion.properties
================================================
riot_version=${riot_version}
build_date=${build_date}
build_time=${build_time}
build_revision=${build_revision}

================================================
FILE: core/riot-core/src/test/java/com/redis/riot/core/ConverterTests.java
================================================
package com.redis.riot.core;

import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.convert.DurationStyle;

import com.redis.riot.core.processor.FieldExtractorFactory.MissingFieldException;
import com.redis.riot.core.processor.IdFunctionBuilder;

class ConverterTests {

	@Test
	void testNoKeyConverter() {
		String prefix = "beer";
		String idField = "id";
		Function<Map<String, Object>, String> keyMaker = new IdFunctionBuilder().prefix(prefix).build();
		Map<String, Object> map = new HashMap<>();
		String id = "123";
		map.put(idField, id);
		map.put("name", "La fin du monde");
		String key = keyMaker.apply(map);
		Assertions.assertEquals(prefix, key);
	}

	@Test
	void testSingleKeyConverter() {
		String prefix = "beer";
		String idField = "id";
		Function<Map<String, Object>, String> keyMaker = new IdFunctionBuilder().prefix(prefix).fields(idField).build();
		Map<String, Object> map = new HashMap<>();
		String id = "123";
		map.put(idField, id);
		map.put("name", "La fin du monde");
		String key = keyMaker.apply(map);
		Assertions.assertEquals(prefix + IdFunctionBuilder.DEFAULT_SEPARATOR + id, key);
	}

	@Test
	void testMultiKeyConverter() {
		String prefix = "inventory";
		Map<String, Object> map = new HashMap<>();
		String store = "403";
		String sku = "39323";
		map.put("store", store);
		map.put("sku", sku);
		map.put("name", "La fin du monde");
		Assertions.assertEquals(
				prefix + IdFunctionBuilder.DEFAULT_SEPARATOR + store + IdFunctionBuilder.DEFAULT_SEPARATOR + sku,
				new IdFunctionBuilder().prefix(prefix).fields("store", "sku").build().apply(map));
		String separator = "~][]:''~";
		Assertions.assertEquals(prefix + separator + store + separator + sku,
				new IdFunctionBuilder().prefix(prefix).separator(separator).fields("store", "sku").build().apply(map));
	}

	@Test
	void testNullCheck() {
		String prefix = "inventory";
		Map<String, Object> map = new HashMap<>();
		String store = "403";
		map.put("store", store);
		map.put("sku", null);
		map.put("name", "La fin du monde");
		Function<Map<String, Object>, String> converter = new IdFunctionBuilder().prefix(prefix).fields("store", "sku")
				.build();
		Assertions.assertThrows(MissingFieldException.class, () -> converter.apply(map));
	}

	@Test
	void testDurationStyle() {
		Assertions.assertEquals(Duration.ofSeconds(30), DurationStyle.SIMPLE.parse("30s"));
		Assertions.assertEquals(Duration.ofMillis(30), DurationStyle.SIMPLE.parse("30"));
	}

}


================================================
FILE: core/riot-core/src/test/resources/beers1.csv
================================================
,abv,ibu,id,name,style,brewery_id,ounces
0,0.05,,1436,Pub Beer,American Pale Lager,408,12.0
1,0.066,,2265,Devil's Cup,American Pale Ale (APA),177,12.0
2,0.071,,2264,Rise of the Phoenix,American IPA,177,12.0
3,0.09,,2263,Sinister,American Double / Imperial IPA,177,12.0
4,0.075,,2262,Sex and Candy,American IPA,177,12.0
5,0.077,,2261,Black Exodus,Oatmeal Stout,177,12.0
6,0.045,,2260,Lake Street Express,American Pale Ale (APA),177,12.0
7,0.065,,2259,Foreman,American Porter,177,12.0
8,0.055,,2258,Jade,American Pale Ale (APA),177,12.0
9,0.086,,2131,Cone Crusher,American Double / Imperial IPA,177,12.0
10,0.07200000000000001,,2099,Sophomoric Saison,Saison / Farmhouse Ale,177,12.0
11,0.073,,2098,Regional Ring Of Fire,Saison / Farmhouse Ale,177,12.0
12,0.069,,2097,Garce Selé,Saison / Farmhouse Ale,177,12.0
13,0.085,,1980,Troll Destroyer,Belgian IPA,177,12.0
14,0.061,60.0,1979,Bitter Bitch,American Pale Ale (APA),177,12.0
15,0.06,,2318,Ginja Ninja,Cider,154,12.0
16,0.06,,2170,Cherried Away,Cider,154,12.0
17,0.06,,2169,Rhubarbarian,Cider,154,12.0
18,0.06,,1502,BrightCider,Cider,154,12.0
19,0.08199999999999999,,1593,He Said Baltic-Style Porter,Baltic Porter,368,12.0
20,0.08199999999999999,,1592,He Said Belgian-Style Tripel,Tripel,368,12.0
21,0.099,92.0,1036,Lower De Boom,American Barleywine,368,8.4
22,0.079,45.0,1024,Fireside Chat,Winter Warmer,368,12.0
23,0.079,,976,Marooned On Hog Island,American Stout,368,12.0
24,0.044000000000000004,42.0,876,Bitter American,American Pale Ale (APA),368,12.0
25,0.049,17.0,802,Hell or High Watermelon Wheat (2009),Fruit / Vegetable Beer,368,12.0
26,0.049,17.0,801,Hell or High Watermelon Wheat (2009),Fruit / Vegetable Beer,368,12.0
27,0.049,17.0,800,21st Amendment Watermelon Wheat Beer (2006),Fruit / Vegetable Beer,368,12.0
28,0.07,70.0,799,21st Amendment IPA (2006),American IPA,368,12.0
29,0.07,70.0,797,Brew Free! or Die IPA (2008),American IPA,368,12.0
30,0.07,70.0,796,Brew Free! or Die IPA (2009),American IPA,368,12.0
31,0.085,52.0,531,Special Edition: Allies Win The War!,English Strong Ale,368,12.0
32,0.09699999999999999,94.0,432,Hop Crisis,American Double / Imperial IPA,368,12.0
33,0.044000000000000004,42.0,353,Bitter American (2011),American Pale Ale (APA),368,12.0
34,0.079,45.0,321,Fireside Chat (2010),Winter Warmer,368,12.0
35,0.068,65.0,173,Back in Black,American Black Ale,368,12.0
36,0.083,35.0,11,Monk's Blood,Belgian Dark Ale,368,12.0
37,0.07,65.0,10,Brew Free! or Die IPA,American IPA,368,12.0
38,0.049,17.0,9,Hell or High Watermelon Wheat,Fruit / Vegetable Beer,368,12.0
39,0.07,82.0,2519,Bimini Twist,American IPA,67,12.0
40,0.05,,2518,Beach Blonde,American Blonde Ale,67,12.0
41,0.059000000000000004,,2517,Rod Bender Red,American Amber / Red Ale,67,12.0
42,0.035,11.0,2545,Passion Fruit Prussia,Berliner Weissbier,60,12.0
43,0.045,18.0,2544,Send Help,American Blonde Ale,60,12.0
44,0.055,,2324,Cast Iron Oatmeal Brown,American Brown Ale,60,12.0
45,0.06,,2288,Reprise Centennial Red,American Amber / Red Ale,60,12.0
46,0.055,,2287,Alter Ego,American Black Ale,60,12.0
47,0.065,,2286,Divided Sky,American IPA,60,12.0
48,0.065,,2285,Resurrected,American IPA,60,12.0
49,0.05,28.0,1870,Contact High,American Pale Wheat Ale,60,12.0
50,0.065,,2603,Galaxyfest,American IPA,27,16.0
51,0.05,45.0,2602,Citrafest,American IPA,27,16.0
52,0.09,,2220,Barn Yeti,Belgian Strong Dark Ale,27,16.0
53,0.069,65.0,2219,Scarecrow,American IPA,27,16.0
54,0.09,50.0,2218,Ironman,English Strong Ale,27,16.0
55,0.046,15.0,2217,Honey Kolsch,Kölsch,27,16.0
56,0.052000000000000005,18.0,2216,Copperhead Amber,Belgian Dark Ale,27,16.0
57,0.059000000000000004,75.0,972,Rude Parrot IPA,American IPA,481,16.0
58,0.054000000000000006,30.0,866,British Pale Ale (2010),English Pale Ale,481,16.0
59,0.054000000000000006,30.0,48,British Pale Ale,English Pale Ale,481,16.0
60,0.084,82.0,47,Ballz Deep Double IPA,American Double / Imperial IPA,481,16.0
61,0.038,,1583,Wolfman's Berliner,Berliner Weissbier,373,12.0
62,0.055,26.0,1165,Colorado Native,American Amber / Red Lager,462,12.0
63,0.055,26.0,431,Colorado Native (2011),American Amber / Red Lager,462,12.0
64,0.065,52.0,516,Jockamo IPA,American IPA,533,12.0
65,0.042,13.0,515,Purple Haze,Fruit / Vegetable Beer,533,12.0
66,0.045,17.0,514,Abita Amber,American Amber / Red Lager,533,12.0
67,0.08199999999999999,68.0,2540,Citra Ass Down,American IPA,62,16.0
68,0.05,20.0,2539,The Brown Note,American Brown Ale,62,16.0
69,0.08,68.0,2686,Citra Ass Down,American Double / Imperial IPA,1,16.0
70,0.125,80.0,2685,London Balling,English Barleywine,1,16.0
71,0.077,25.0,2684,35 K,Milk / Sweet Stout,1,16.0
72,0.042,42.0,2683,A Beer,American Pale Ale (APA),1,16.0
73,0.05,25.0,2682,Rules are Rules,German Pilsener,1,16.0
74,0.066,21.0,2681,Flesh Gourd'n,Pumpkin Ale,1,16.0
75,0.04,13.0,2680,Sho'nuff,Belgian Pale Ale,1,16.0
76,0.055,17.0,2679,Bloody Show,American Pilsner,1,16.0
77,0.076,68.0,2678,Rico Sauvin,American Double / Imperial IPA,1,16.0
78,0.051,38.0,2677,Coq de la Marche,Saison / Farmhouse Ale,1,16.0
79,0.065,,2676,Kamen Knuddeln,American Wild Ale,1,16.0
80,0.06,65.0,2675,Pile of Face,American IPA,1,16.0
81,0.05,20.0,2674,The Brown Note,English Brown Ale,1,16.0
82,0.053,35.0,1594,Maylani's Coconut Stout,American Stout,367,16.0
83,0.05,35.0,1162,Oatmeal PSA,American Pale Ale (APA),367,16.0
84,0.052000000000000005,33.0,1137,Pre Flight Pilsner,American Pilsner,367,16.0
85,0.04,20.0,2403,P-Town Pilsner,American Pilsner,117,12.0
86,0.053,36.0,2402,Klickitat Pale Ale,American Pale Ale (APA),117,12.0
87,0.08199999999999999,103.0,2401,Yellow Wolf Imperial IPA,American Double / Imperial IPA,117,12.0
88,0.053,40.0,1921,Freeride APA,American Pale Ale (APA),270,12.0
89,0.053,18.0,1920,Alaskan Amber,Altbier,270,12.0
90,0.057,,2501,Hopalicious,American Pale Ale (APA),73,12.0
91,0.043,,1535,Kentucky Kölsch,Kölsch,388,16.0
92,0.065,,1149,Kentucky IPA,American IPA,388,16.0
93,0.054000000000000006,,1474,Dusty Trail Pale Ale,American Pale Ale (APA),401,16.0
94,0.062,,1473,Damnesia,American IPA,401,16.0
95,0.062,43.0,837,Desolation IPA,American IPA,401,16.0
96,0.059000000000000004,,2592,Liberty Ale,American IPA,35,12.0
97,0.065,,2578,IPA,American IPA,35,12.0
98,0.045,,2577,Summer Wheat,American Pale Wheat Ale,35,12.0
99,0.049,,2103,California Lager,American Amber / Red Lager,35,12.0
100,0.055999999999999994,,2102,Brotherhood Steam,California Common / Steam Beer,35,12.0
101,0.042,,2291,Blood Orange Gose,Gose,171,12.0
102,0.042,,1818,Keebarlin' Pale Ale,American Pale Ale (APA),171,12.0
103,0.048,,1738,"the Kimmie, the Yink and the Holy Gose",Gose,171,12.0
104,0.06,,1563,Fall Hornin',Pumpkin Ale,171,12.0
105,0.057,13.0,1520,Barney Flats Oatmeal Stout,Oatmeal Stout,171,12.0
106,0.055999999999999994,4.0,1350,Summer Solstice,Cream Ale,171,12.0
107,0.07,80.0,1327,Hop Ottin' IPA,American IPA,171,12.0
108,0.057999999999999996,15.0,1326,Boont Amber Ale,American Amber / Red Ale,171,12.0
109,0.057,13.0,1221,Barney Flats Oatmeal Stout,Oatmeal Stout,171,12.0
110,0.055,25.0,1217,El Steinber Dark Lager,Vienna Lager,171,16.0
111,0.057999999999999996,15.0,811,Boont Amber Ale (2010),American Amber / Red Ale,171,12.0
112,0.055999999999999994,4.0,753,Summer Solstice Cerveza Crema (2009),Cream Ale,171,12.0
113,0.057,13.0,572,Barney Flats Oatmeal Stout (2012),Oatmeal Stout,171,12.0
114,0.069,6.0,523,Winter Solstice,Winter Warmer,171,12.0
115,0.07,80.0,367,Hop Ottin' IPA (2011),American IPA,171,12.0
116,0.057999999999999996,15.0,78,Boont Amber Ale (2011),American Amber / Red Ale,171,12.0
117,0.055999999999999994,4.0,77,Summer Solstice (2011),Cream Ale,171,12.0
118,0.055,28.0,76,Poleeko Gold Pale Ale (2009),American Pale Ale (APA),171,12.0
119,0.06,,2337,Charlie's Rye IPA,American IPA,146,16.0
120,0.054000000000000006,,410,River Pig Pale Ale,American Pale Ale (APA),542,16.0
121,0.047,,409,Oaky's Oatmeal Stout,Oatmeal Stout,542,16.0
122,0.05,,1294,Angry Orchard Apple Ginger,Cider,434,16.0
123,0.05,,1293,Angry Orchard Crisp Apple,Cider,434,16.0
124,0.05,,1292,Angry Orchard Crisp Apple,Cider,434,12.0
125,0.068,,2207,Golden One,Belgian Pale Ale,193,12.0
126,0.06,,2040,Arjuna,Witbier,193,12.0
127,0.085,,2039,Uroboros,American Stout,193,12.0
128,0.071,75.0,2511,Long Leaf,American IPA,69,16.0
129,0.047,19.0,2510,Honey Badger Blonde,American Blonde Ale,69,16.0
130,0.06,23.0,2509,Porter (a/k/a Black Gold Porter),American Porter,69,16.0
131,0.06,55.0,413,Sky High Rye,American Pale Ale (APA),541,12.0
132,0.062,17.0,390,Whitsun,American Pale Wheat Ale,541,12.0
133,0.052000000000000005,,735,On-On Ale (2008),American Pale Ale (APA),513,12.0
134,0.092,50.0,1333,Quakertown Stout,American Double / Imperial Stout,426,12.0
135,0.051,20.0,1332,Greenbelt Farmhouse Ale,Saison / Farmhouse Ale,426,12.0
136,0.052000000000000005,10.0,1172,Mo's Gose,Gose,461,16.0
137,0.07,45.0,1322,Green Bullet Organic India Pale Ale,American IPA,429,16.0
138,0.032,27.0,550,Rocket Girl,Kölsch,528,12.0
139,0.053,26.0,429,Ninja Porter,American Porter,528,12.0
140,0.06,69.0,428,Shiva IPA,American IPA,528,12.0
141,0.048,,1640,Aslan Kölsch,Kölsch,353,16.0
142,0.077,,1639,Aslan IPA,American IPA,353,16.0
143,0.077,,1638,Aslan Amber,American Amber / Red Ale,353,16.0
144,0.055999999999999994,27.0,597,This Season's Blonde,American Blonde Ale,523,12.0
145,0.07,67.0,596,Independence Pass Ale,American IPA,523,12.0
146,0.057,40.0,1580,Trolley Stop Stout,American Stout,374,12.0
147,0.08199999999999999,138.0,980,Bitter Bitch Imperial IPA,American Double / Imperial IPA,374,12.0
148,0.062,35.0,979,Poop Deck Porter,American Porter,374,12.0
149,0.06,35.0,978,Old Red Beard Amber Ale,American Amber / Red Ale,374,12.0
150,0.075,115.0,2503,Hop A-Peel,American Double / Imperial IPA,72,16.0
151,0.055,12.0,2502,Vanilla Java Porter,American Porter,72,16.0
152,0.052000000000000005,,2495,Michelada,Fruit / Vegetable Beer,72,16.0
153,0.045,8.0,534,Dirty Blonde Ale,American Blonde Ale,72,12.0
154,0.05,62.0,528,Grand Circus IPA,American IPA,72,12.0
155,0.05,12.0,527,Atwater's Lager,Munich Helles Lager,72,12.0
156,0.07,,1409,Heavy Machinery IPA Series #1: Heavy Fist,American Black Ale,413,16.0
157,0.062,,343,Fire Eagle IPA,American IPA,413,12.0
158,0.051,,342,Peacemaker,American Pale Ale (APA),413,12.0
159,0.053,,341,Pearl-Snap,German Pilsener,413,12.0
160,0.052000000000000005,,340,Black Thunder,Schwarzbier,413,12.0
161,0.08,,2589,Raja,American Double / Imperial IPA,37,12.0
162,0.064,,2546,Perzik Saison,Saison / Farmhouse Ale,37,12.0
163,0.047,42.0,146,Avery Joe’s Premium American Pilsner,German Pilsener,37,12.0
164,0.055999999999999994,10.0,108,White Rascal,Witbier,37,12.0
165,0.063,69.0,107,Avery India Pale Ale,American IPA,37,12.0
166,0.055,17.0,106,Ellie’s Brown Ale,American Brown Ale,37,12.0
167,0.062,17.0,1620,Pumpkin Beast,Pumpkin Ale,360,12.0
168,0.07200000000000001,22.0,1579,OktoberBeast,Märzen / Oktoberfest,360,12.0
169,0.048,23.0,1228,Mad Beach,American Pale Wheat Ale,360,12.0
170,0.067,,705,Hog Wild India Pale Ale,American IPA,360,12.0
171,0.092,5.0,704,Devils Tramping Ground Tripel,Tripel,360,12.0
172,0.061,41.0,702,Hot Rod Red,American Amber / Red Ale,360,12.0
173,0.086,,2058,Palate Mallet,American Double / Imperial IPA,235,12.0
174,0.06,,1483,Back East Porter,American Porter,235,12.0
175,0.049,,1426,Back East Golden Ale,American Blonde Ale,235,12.0
176,0.07,,1132,Misty Mountain IPA,American IPA,235,12.0
177,0.05,,1131,Back East Ale,American Amber / Red Ale,235,12.0
178,0.06,,1876,Truck Stop Honey Brown Ale,English Brown Ale,286,12.0
179,0.06,43.0,1875,Naked Pig Pale Ale,American Pale Ale (APA),286,12.0
180,0.068,70.0,966,Topcutter India Pale Ale,American IPA,483,12.0
181,0.044000000000000004,38.0,965,Field 41 Pale Ale,American Pale Ale (APA),483,12.0
182,0.07,,2593,Grapefruit Sculpin,American IPA,34,12.0
183,0.038,40.0,2105,Even Keel,American IPA,34,12.0
184,0.052000000000000005,23.0,1401,Ballast Point Pale Ale,Kölsch,34,12.0
185,0.07,75.0,1400,Big Eye India Pale Ale,American IPA,34,12.0
186,0.046,,1019,Longfin Lager,Munich Helles Lager,34,12.0
187,0.07,70.0,1018,Sculpin IPA,American IPA,34,12.0
188,0.045,,1776,All Nighter Ale,Extra Special / Strong Bitter (ESB),318,12.0
189,0.045,20.0,1644,Banner American Rye,Rye Beer,318,12.0
190,0.035,45.0,1643,Banner American Ale,American Amber / Red Ale,318,12.0
191,0.07,46.0,2618,Thai.p.a,American IPA,20,16.0
192,0.06,60.0,2005,Barrio Blanco,American IPA,251,12.0
193,0.045,,1343,Barrio Tucson Blonde,American Blonde Ale,251,12.0
194,0.049,22.0,2404,Hop in the ‘Pool Helles,American Pilsner,116,12.0
195,0.067,60.0,2323,Ultra Gnar Gnar IPA,American IPA,116,12.0
196,0.068,62.0,2189,In-Tents India Pale Lager,American Pale Lager,116,12.0
197,0.05,20.0,2188,Lost Meridian Wit,Witbier,116,12.0
198,0.051,45.0,2187,Celestial Meridian Cascadian Dark Lager,Euro Dark Lager,116,12.0
199,0.054000000000000006,55.0,1966,Wagon Party,California Common / Steam Beer,258,12.0
200,0.067,70.0,1965,Sky-Five,American IPA,258,12.0
201,0.05,28.0,1964,Stargrazer,Schwarzbier,258,12.0
202,0.054000000000000006,48.0,1963,Wonderstuff,German Pilsener,258,12.0
203,0.053,,1855,Tarnation California-Style Lager,California Common / Steam Beer,292,12.0
204,0.07,42.0,1778,On the Count of 3 (2015),Hefeweizen,292,16.0
205,0.047,,1209,Summer Swelter,American Pale Wheat Ale,292,12.0
206,0.068,,954,Phantom Punch Winter Stout,Foreign / Export Stout,292,12.0
207,0.066,,910,Hayride Autumn Ale,Rye Beer,292,12.0
208,0.047,,707,Celsius Summer Ale (2012),American Pale Wheat Ale,292,12.0
209,0.055,35.0,533,Amber Road,American Amber / Red Ale,292,12.0
210,0.049,28.0,183,Pamola Xtra Pale Ale,American Pale Ale (APA),292,12.0
211,0.069,69.0,182,Stowaway IPA,American IPA,292,12.0
212,0.08800000000000001,108.0,1806,Hoptopus Double IPA,American Double / Imperial IPA,306,16.0
213,0.05,10.0,2435,Watermelon Ale,Fruit / Vegetable Beer,103,12.0
214,0.057999999999999996,45.0,2423,Fenway American Pale Ale,American Pale Ale (APA),103,12.0
215,0.068,85.0,2420,Back Bay IPA,American IPA,103,12.0
216,0.048,16.0,2419,Bunker Hill Blueberry Ale ,Other,103,12.0
217,0.057999999999999996,,2494,Oberon,American Pale Wheat Ale,76,12.0
218,0.06,,2325,Smitten,Rye Beer,76,16.0
219,0.05,,2022,Winter White,Witbier,76,16.0
220,0.057999999999999996,,1989,Oberon,American Pale Wheat Ale,76,16.0
221,0.07,,1988,Two Hearted,American IPA,76,16.0
222,0.057999999999999996,,1955,Best Brown,American Brown Ale,76,16.0
223,0.044000000000000004,44.0,2558,Moar,English India Pale Ale (IPA),53,12.0
224,0.083,,2557,Uber Lupin Schwarz IPA,American Double / Imperial IPA,53,16.0
225,0.057,27.0,2556,Nordic Blonde,American Blonde Ale,53,12.0
226,0.06,,2496,Cold Press,American Black Ale,75,12.0
227,0.07200000000000001,87.0,2410,Harness the Winter,American IPA,75,12.0
228,0.055999999999999994,32.0,1902,14° ESB ,Extra Special / Strong Bitter (ESB),75,12.0
229,0.062,68.0,1901,Bent Hop Golden IPA,American IPA,75,12.0
230,0.06,34.0,1261,Bent Paddle Black Ale,American Black Ale,75,12.0
231,0.05,38.0,1253,Venture Pils,German Pilsener,75,12.0
232,0.055,40.0,1900,Lost Sailor IPA,English India Pale Ale (IPA),278,12.0
233,0.053,20.0,1317,Steel Rail Extra Pale Ale,American Pale Ale (APA),278,12.0
234,0.078,,1158,La Frontera Premium IPA,American IPA,463,12.0
235,0.047,,1157,Tejas Lager,Czech Pilsener,463,12.0
236,0.064,,1156,Number 22 Porter,American Porter,463,12.0
237,0.055999999999999994,,1155,Big Bend Hefeweizen,Hefeweizen,463,12.0
238,0.06,,1154,Terlingua Gold,American Blonde Ale,463,12.0
239,0.081,17.0,2104,Aprè Shred,American Strong Ale,220,16.0
240,0.095,104.0,1762,Hemlock Double IPA,American Double / Imperial IPA,220,12.0
241,0.040999999999999995,,1422,West Portal Colorado Common Summer Ale,California Common / Steam Beer,220,16.0
242,0.067,85.0,1067,Disconnected Red,American Amber / Red Ale,220,16.0
243,0.07,,1003,Big Elm IPA,American IPA,477,12.0
244,0.065,,1002,Gerry Dog Stout,American Stout,477,12.0
245,0.06,,1001,413 Farmhouse Ale,Saison / Farmhouse Ale,477,12.0
246,0.08,54.0,2639,Dark Star,American Stout,8,16.0
247,0.062,,2469,Ryecoe,American IPA,8,16.0
248,0.06,,2586,Blueberry Blonde,Fruit / Vegetable Beer,40,12.0
249,0.075,60.0,2585,Galaxy IPA,American IPA,40,16.0
250,0.05,32.0,643,Big River Pilsner,Czech Pilsener,519,12.0
251,0.06,55.0,632,House Brand IPA,American IPA,519,12.0
252,0.062,65.0,1714,Big Sky IPA,American IPA,336,12.0
253,0.05,40.0,1713,Scape Goat Pale Ale,English Pale Ale,336,12.0
254,0.05,35.0,1712,Montana Trout Slayer Ale,American Pale Wheat Ale,336,12.0
255,0.051,26.0,1711,Moose Drool Brown Ale,American Brown Ale,336,12.0
256,0.07200000000000001,60.0,1456,Powder Hound Winter Ale,English Strong Ale,336,12.0
257,0.051,26.0,767,Moose Drool Brown Ale (2011),American Brown Ale,336,12.0
258,0.05,35.0,766,Montana Trout Slayer Ale (2012),American Pale Wheat Ale,336,12.0
259,0.062,65.0,579,Big Sky IPA (2012),American IPA,336,12.0
260,0.047,,168,Summer Honey,American Blonde Ale,336,12.0
261,0.05,40.0,159,Scape Goat Pale Ale (2010),English Pale Ale,336,12.0
262,0.05,35.0,35,Montana Trout Slayer Ale (2009),American Pale Wheat Ale,336,12.0
263,0.051,26.0,34,Moose Drool Brown Ale (2009),American Brown Ale,336,12.0
264,0.069,81.0,2096,Arcus IPA,American IPA,221,12.0
265,0.057999999999999996,38.0,2095,Wavemaker,American Amber / Red Ale,221,12.0
266,0.053,43.0,1257,Jack Pine Savage,American Pale Ale (APA),444,16.0
267,0.099,85.0,1256,Forest Fire Imperial Smoked Rye,Rye Beer,444,16.0
268,0.098,76.0,1255,Bad Axe Imperial IPA,American Double / Imperial IPA,444,16.0
269,0.055,35.0,986,Morning Wood,Oatmeal Stout,444,16.0
270,0.066,50.0,985,Bark Bite IPA,American IPA,444,16.0
271,0.055,45.0,2508,Jalapeno Pale Ale,American Pale Ale (APA),70,16.0
272,0.052000000000000005,,1441,Blown Out Brown,American Brown Ale,407,12.0
273,0.063,,1413,Single Hop Ale,American Pale Ale (APA),407,12.0
274,0.054000000000000006,,1411,Sawtooth Ale,American Blonde Ale,407,12.0
275,0.07200000000000001,75.0,2620,Saucy Intruder,Rye Beer,18,16.0
276,0.045,16.0,2412,Deception,American Blonde Ale,112,12.0
277,0.075,35.0,1898,Blackmarket Rye IPA,American IPA,112,12.0
278,0.05,8.0,1897,Black Market Hefeweizen,Hefeweizen,112,12.0
279,0.057999999999999996,44.0,1896,Aftermath Pale Ale,American Pale Ale (APA),112,12.0
280,0.071,83.0,1850,American India Red Ale,American Strong Ale,294,12.0
281,0.071,45.0,1849,American Red Porter,American Porter,294,12.0
282,0.078,34.0,1848,American Red Saison,Saison / Farmhouse Ale,294,12.0
283,0.066,44.0,1847,Colorado Red Ale,American Amber / Red Ale,294,12.0
284,0.048,16.0,2485,Saddle Bronc Brown Ale,American Brown Ale,79,12.0
285,0.046,20.0,2484,Bomber Mountain Amber Ale,American Amber / Red Ale,79,12.0
286,0.073,,2449,Flying Sailor,Rye Beer,95,12.0
287,0.048,47.0,2634,Nordskye ,American IPA,12,12.0
288,0.06,30.0,2153,North Third Stout,Foreign / Export Stout,12,12.0
289,0.052000000000000005,,1953,Honey Lav,American Pale Wheat Ale,12,12.0
290,0.068,,1496,Coconut Brown Ale,American Brown Ale,12,12.0
291,0.07,51.0,1481,51K IPA,American IPA,12,12.0
292,0.055,,1480,Grand Rabbits,Cream Ale,12,12.0
293,0.05,,1564,1800 Big Log Wheat (2012),American Pale Wheat Ale,380,12.0
294,,,1541,Double Play Pilsner,American Pilsner,380,12.0
295,0.055,,1321,Brewerhood Brown Ale,American Brown Ale,380,12.0
296,0.08,,1320,Last Call Imperial Amber Ale,American Amber / Red Ale,380,12.0
297,0.096,,1319,Pernicious Double IPA,American Double / Imperial IPA,380,12.0
298,0.052000000000000005,,1303,6-4-3 Double Play Pilsner,German Pilsener,380,12.0
299,,,1025,N Street Drive-In 50th Anniversary IPA,American Double / Imperial IPA,380,12.0
300,0.05,,1012,467 Ethan's Stout,American Stout,380,12.0
301,0.064,,942,1335 Wicked Snout,Saison / Farmhouse Ale,380,12.0
302,0.045,,937,543 Skull Creek Fresh Hopped Pale Ale,American Pale Ale (APA),380,12.0
303,0.055999999999999994,37.0,888,1327 Pod's ESB,Extra Special / Strong Bitter (ESB),380,12.0
304,0.055999999999999994,37.0,886,1327 Pod's ESB,Extra Special / Strong Bitter (ESB),380,12.0
305,0.055999999999999994,37.0,612,1327 Pod's ESB,Extra Special / Strong Bitter (ESB),380,12.0
306,0.046,35.0,611,834 Happy As Ale,American Pale Ale (APA),380,12.0
307,0.059000000000000004,,1372,Yellow Collar,Mead,422,12.0
308,0.059000000000000004,,1371,Green Collar,Mead,422,12.0
309,0.08,80.0,1812,Quarter Mile Double IPA,American Double / Imperial IPA,304,12.0
310,0.059000000000000004,60.0,1547,Full Nelson Pale Ale,American Pale Ale (APA),382,12.0
311,0.065,30.0,1546,Steel Wheels ESB,Extra Special / Strong Bitter (ESB),382,12.0
312,0.053,22.0,1545,Blue Mountain Classic Lager,Euro Pale Lager,382,12.0
313,0.059000000000000004,60.0,119,Full Nelson Pale Ale (2010),American Pale Ale (APA),382,12.0
314,0.049,16.0,1408,Kölsch 151,Kölsch,414,12.0
315,,,2490,Professor Black,American Stout,77,12.0
316,,,2489,Little Boss,American Pale Wheat Ale,77,12.0
317,,,2488,Van Dayum!,American Amber / Red Ale,77,12.0
318,,,2487,Spirit Animal,American Pale Ale (APA),77,12.0
319,0.07,,939,Toxic Sludge,American Black Ale,489,16.0
320,0.06,40.0,692,Blue Point White IPA,American White IPA,489,12.0
321,0.044000000000000004,16.0,667,Blue Point Summer Ale,American Blonde Ale,489,12.0
322,0.055,28.0,665,Toasted Lager,Vienna Lager,489,12.0
323,0.06,,1607,Bohemian Export Lager,Dortmunder / Export Lager,364,12.0
324,0.053,,1597,Altus Bohemes Altbier,Altbier,364,12.0
325,0.04,,344,Cherny Bock,Schwarzbier,364,12.0
326,0.05,,89,Czech Pilsner,Czech Pilsener,364,12.0
327,0.05,,88,Viennese Lager,Vienna Lager,364,12.0
328,0.065,,1569,Mad Manatee IPA,American IPA,378,12.0
329,0.055,,1568,Killer Whale Cream Ale,Cream Ale,378,12.0
330,0.06,,1188,Duke's Cold Nose Brown Ale,American Brown Ale,378,12.0
331,0.042,30.0,1891,Longhop IPA,American IPA,281,16.0
332,0.04,34.0,1890,Lucky Buck,Irish Dry Stout,281,16.0
333,0.051,,577,Bomb Lager (New Recipe),Munich Helles Lager,525,12.0
334,0.045,27.0,513,Bomb Lager (Old Recipe),Munich Helles Lager,525,12.0
335,0.066,72.0,2422,Firestarter India Pale Ale,American IPA,107,12.0
336,0.075,22.0,1727,Kilt Dropper Scotch Ale,Scotch Ale / Wee Heavy,107,16.0
337,0.048,30.0,1614,Wood Splitter Pilsner,Czech Pilsener,107,16.0
338,0.055999999999999994,26.0,1613,Gyptoberfest,Märzen / Oktoberfest,107,12.0
339,0.07,94.0,1549,Farmer Wirtz India Pale Ale,English India Pale Ale (IPA),107,16.0
340,0.047,,1548,Slow & Steady Golden Ale,American Blonde Ale,107,12.0
341,0.068,,1517,Pink-I Raspberry IPA,American IPA,107,16.0
342,0.047,,1500,Moe's Original Bar B Que 'Bama Brew Golden Ale,American Blonde Ale,107,12.0
343,0.047,,1421,Live Local Golden Ale,American Blonde Ale,107,12.0
344,0.048,38.0,1360,Screaming Eagle Special Ale ESB,Extra Special / Strong Bitter (ESB),107,12.0
345,0.049,,1184,Dirtbag Dunkel,Munich Dunkel Lager,107,16.0
346,0.053,45.0,1183,Kindler Pale Ale,American Pale Ale (APA),107,12.0
347,0.064,,1023,Mistress Winter Wheat,Winter Warmer,107,12.0
348,0.061,,998,Tent Pole Vanilla Porter,American Porter,107,16.0
349,0.057999999999999996,,997,Awry Rye Pale Ale,American Pale Ale (APA),107,12.0
350,0.057999999999999996,,996,Demshitz Brown Ale,American Brown Ale,107,12.0
351,0.048,,931,Wood Splitter Pilsner (2012),Czech Pilsener,107,12.0
352,0.048,,798,Brush Creek Blonde,American Blonde Ale,107,16.0
353,0.066,72.0,633,Firestarter India Pale Ale,American IPA,107,16.0
354,0.071,16.0,2062,Noche Dulce,American Porter,231,16.0
355,0.045,8.0,1830,Porch Rocker,Radler,300,12.0
356,0.065,45.0,1629,Rebel IPA,American IPA,300,16.0
357,0.055,,1601,Cold Snap,Witbier,300,12.0
358,0.055999999999999994,,1427,Samuel Adams Winter Lager,Bock,300,12.0
359,0.049,30.0,1349,Boston Lager,Vienna Lager,300,16.0
360,0.049,30.0,1310,Boston Lager,Vienna Lager,300,12.0
361,0.053,15.0,1281,Samuel Adams Octoberfest,Märzen / Oktoberfest,300,12.0
362,0.053,7.0,1144,Samuel Adams Summer Ale,American Pale Wheat Ale,300,12.0
363,0.049,30.0,1143,Boston Lager,Vienna Lager,300,12.0
364,0.049,35.0,1395,Hazed & Infused,American Pale Ale (APA),417,12.0
365,0.057,35.0,808,Hoopla Pale Ale,American Pale Ale (APA),417,12.0
366,0.049,35.0,81,Hazed & Infused (2010),American Pale Ale (APA),417,12.0
367,0.062,80.0,2596,Heavy Lifting,American IPA,31,12.0
368,0.065,,2300,1492,American Pale Ale (APA),167,12.0
369,0.057999999999999996,,2299,Mango Ginger,American IPA,167,12.0
370,0.047,,2298,Passenger,English Dark Mild Ale,167,12.0
371,0.06,52.0,2107,Plum St. Porter,American Porter,219,12.0
372,0.057,52.0,1573,Plum St. Porter,American Porter,219,12.0
373,0.07,80.0,1289,Bozone HopZone IPA,American IPA,219,12.0
374,0.06,25.0,1288,Bozone Hefe Weizen,Hefeweizen,219,12.0
375,0.055,,470,Bozone Select Amber Ale,American Amber / Red Ale,219,12.0
376,0.052000000000000005,40.0,2167,Evil Owl,American Amber / Red Ale,207,12.0
377,0.05,,2204,Post Time Kölsch,Kölsch,195,16.0
378,0.042,9.0,1522,Agave Wheat,American Pale Wheat Ale,391,12.0
379,0.045,15.0,397,SummerBright Ale,American Pale Wheat Ale,391,12.0
380,0.062,68.0,193,Lucky U IPA,American IPA,391,12.0
381,0.054000000000000006,19.0,83,Avalanche Ale,American Amber / Red Ale,391,12.0
382,0.05,,1802,"You're My Boy, Blue",Fruit / Vegetable Beer,308,12.0
383,0.07200000000000001,60.0,1801,Last Stop IPA,American IPA,308,12.0
384,0.05,21.0,1800,Rollin Dirty Red Ale,Irish Red Ale,308,12.0
385,0.055,28.0,1799,Are Wheat There Yet?,American Pale Wheat Ale,308,12.0
386,0.057999999999999996,,2619,Insert Hop Reference,American Pale Ale (APA),19,16.0
387,0.053,,2468,Manitou Amber,American Amber / Red Ale,85,16.0
388,0.067,,2637,Belfort,Saison / Farmhouse Ale,10,16.0
389,0.06,,2636,Star Runner,Belgian Pale Ale,10,16.0
390,0.098,,2598,Tart Side of the Barrel,American Double / Imperial Stout,10,16.0
391,0.06,,2597,Linnaeus Mango IPA,American IPA,10,16.0
392,0.07,,2548,Beasts A'Burnin',Rauchbier,10,16.0
393,0.077,,2542,Verdun,Bière de Garde,10,16.0
394,0.065,,2541,Barrel Aged Triomphe,Belgian IPA,10,16.0
395,0.065,,2504,Cherry Doppelbock,Doppelbock,10,16.0
396,0.065,,2500,Tropical Saison,Saison / Farmhouse Ale,10,16.0
397,0.065,,2499,Beach Patrol,Witbier,10,16.0
398,0.05,,2498,Nuit Serpent,Belgian IPA,10,16.0
399,0.09,,2481,Paris,Saison / Farmhouse Ale,10,16.0
400,0.055,,2476,The Grand Army,Belgian IPA,10,16.0
401,0.059000000000000004,,2467,Acidulated Trip,Saison / Farmhouse Ale,10,16.0
402,0.066,,2466,Root Stock,Rye Beer,10,16.0
403,0.040999999999999995,,2465,Mind Games,Dunkelweizen,10,16.0
404,0.08199999999999999,,2433,Sous Chef,Belgian Strong Pale Ale,10,16.0
405,0.065,,2418,Dubbelicious,Dubbel,10,16.0
406,0.062,,2416,Psychopomp,Belgian Dark Ale,10,16.0
407,,,2382,Fat Paczki,Belgian Dark Ale,10,16.0
408,,,2381,Earth-Like Planets,Belgian Pale Ale,10,16.0
409,0.061,,2290,Ski Patrol,Witbier,10,16.0
410,0.063,,2241,Viking Ice Hole,Oatmeal Stout,10,16.0
411,0.055999999999999994,,2240,Rye Porter,American Porter,10,16.0
412,0.099,,2137,Wizard Burial Ground,Quadrupel (Quad),10,16.0
413,0.051,,2101,Smoky Wheat,Rauchbier,10,16.0
414,0.062,,2092,BRIPA,Belgian IPA,10,16.0
415,0.062,,2091,Mela,Belgian Dark Ale,10,16.0
416,0.053,,2086,W.I.P.A Snappa,Belgian IPA,10,16.0
417,0.063,,2023,Pepper in the Rye,Rye Beer,10,16.0
418,0.064,,2006,Moe Lasses',American Stout,10,16.0
419,0.07,,1997,Pumpkin Tart,Fruit / Vegetable Beer,10,16.0
420,0.067,,1977,Undertaker,Belgian Dark Ale,10,16.0
421,0.067,,1976,Undertaker (2014),Belgian Dark Ale,10,16.0
422,0.05,,1974,Coq D'Or,Belgian Pale Ale,10,16.0
423,0.06,,1973,North French,Bière de Garde,10,16.0
424,0.065,,1959,Agent a Deux,Belgian Dark Ale,10,16.0
425,0.045,,1958,Belgian Wit,Witbier,10,16.0
426,0.063,,1949,Pothole Stout,American Stout,10,16.0
427,0.09300000000000001,,1947,Tree Bucket,Belgian IPA,10,16.0
428,0.073,,1785,Le Flaneur Ale,American Wild Ale,10,16.0
429,0.055999999999999994,,1651,Maize & Blueberry,Fruit / Vegetable Beer,10,16.0
430,0.09300000000000001,,1443,Trebuchet Double IPA,American Double / Imperial IPA,10,16.0
431,0.065,,1352,Contemplation,Bière de Garde,10,16.0
432,0.05,,1267,Black Rabbit,American Black Ale,10,16.0
433,0.09,,1266,Zaison,Saison / Farmhouse Ale,10,16.0
434,0.08199999999999999,,1178,Vivant Tripel,Tripel,10,16.0
435,0.098,,1136,Tart Side of the Moon,Belgian Dark Ale,10,16.0
436,0.06,,1044,Big Red Coq,American Amber / Red Ale,10,16.0
437,0.099,,1033,Hubris Quadrupel Anniversary Ale,Quadrupel (Quad),10,16.0
438,0.095,,1031,Plow Horse Belgian Style Imperial Stout,American Double / Imperial Stout,10,16.0
439,0.092,,909,Escoffier Bretta Ale,American Wild Ale,10,16.0
440,0.065,,873,Contemplation (2012),Bière de Garde,10,16.0
441,0.099,,860,Vivant Belgian Style Imperial Stout (2012),Russian Imperial Stout,10,16.0
442,0.062,,677,Big Red Coq (2012),American Amber / Red Ale,10,16.0
443,0.09,,671,Zaison (2012),Saison / Farmhouse Ale,10,16.0
444,0.092,,670,Vivant Tripel (2012),Tripel,10,16.0
445,0.09699999999999999,,669,Trebuchet Double IPA (2012),Belgian IPA,10,16.0
446,0.085,,627,Kludde,Belgian Strong Dark Ale,10,16.0
447,0.055,,387,Farm Hand,Saison / Farmhouse Ale,10,16.0
448,0.06,,385,Solitude,Belgian Pale Ale,10,16.0
449,0.065,,384,Triomphe,Belgian IPA,10,16.0
450,,,1096,Tampa Pale Ale,American Pale Ale (APA),467,12.0
451,,,1095,Orange Grove Wheat Ale,American Pale Wheat Ale,467,12.0
452,0.061,,2456,Broad Brook Ale,American Amber / Red Ale,89,16.0
453,0.05,15.0,921,Northern Lights Amber Ale,American Amber / Red Ale,493,12.0
454,0.052000000000000005,17.0,920,Polar Pale Ale,American Pale Ale (APA),493,12.0
455,0.048,,919,Chugach Session Ale,Cream Ale,493,12.0
456,0.061,64.0,648,Fairweather IPA,American IPA,493,12.0
457,0.068,47.0,1279,East India Pale Ale,English India Pale Ale (IPA),437,16.0
458,0.045,,756,Brooklyn Summer Ale,English Pale Mild Ale,437,12.0
459,0.068,47.0,566,East India Pale Ale,English India Pale Ale (IPA),437,12.0
460,0.045,,328,Brooklyn Summer Ale (2011),English Pale Mild Ale,437,12.0
461,0.052000000000000005,,66,Brooklyn Lager (16 oz.),American Amber / Red Lager,437,16.0
462,0.052000000000000005,,65,Brooklyn Lager (12 oz.),American Amber / Red Lager,437,12.0
463,0.08,,538,Tour de Nez Belgian IPA (Current),Belgian IPA,530,16.0
464,,,504,Roler Bock (Current),Maibock / Helles Bock,530,16.0
465,0.073,85.0,383,Black Adder IBA (Current),American Black Ale,530,16.0
466,0.099,,29,Very Noddy Lager (Current),Schwarzbier,530,16.0
467,0.062,42.0,28,Tule Duck Red Ale (Current),American Amber / Red Ale,530,16.0
468,0.057999999999999996,35.0,27,Original Orange Blossom Ale (Current),Herbed / Spiced Beer,530,16.0
469,0.052000000000000005,40.0,26,Black Noddy Lager (Current),Schwarzbier,530,16.0
470,0.053,,1627,Cleveland Beer Week 2013,Munich Helles Lager,357,16.0
471,0.045,,2552,Painted Turtle,American Pale Ale (APA),56,12.0
472,0.06,40.0,2125,1836,American Blonde Ale,214,12.0
473,0.06,20.0,2124,Summer's Wit,Witbier,214,12.0
474,0.09,118.0,2123,More Cowbell,American Double / Imperial IPA,214,16.0
475,0.065,,2608,Wrath of Pele,American Brown Ale,24,16.0
476,0.068,,2607,Black Beer'd,American Black Ale,24,16.0
477,0.078,,2606,Mr. Tea,Fruit / Vegetable Beer,24,24.0
478,0.055,40.0,2478,Pale Alement,American Pale Ale (APA),24,12.0
479,0.099,115.0,2471,Hopkick Dropkick,American Double / Imperial IPA,24,12.0
480,0.06,,2470,Kreamed Corn,Cream Ale,24,12.0
481,0.065,,2464,Coconoats,American Pale Wheat Ale,24,16.0
482,0.068,16.0,2160,Joey Wheat,American Pale Wheat Ale,24,16.0
483,0.07200000000000001,86.0,2158,3:33 Black IPA,American IPA,24,16.0
484,0.068,,2072,MCA,American IPA,24,16.0
485,0.055,40.0,2054,Pale Alement,American Pale Ale (APA),24,16.0
486,0.05,14.0,2196,Couch Select Lager,American Pale Lager,197,12.0
487,0.055999999999999994,36.0,668,Mucho Aloha Hawaiian Pale Ale,American Pale Ale (APA),517,12.0
488,0.049,,52,Heinnieweisse Weissebier,Hefeweizen,556,12.0
489,0.068,,51,Snapperhead IPA,American IPA,556,12.0
490,0.049,,50,Moo Thunder Stout,Milk / Sweet Stout,556,12.0
491,0.043,,49,Porkslap Pale Ale,American Pale Ale (APA),556,12.0
492,0.09300000000000001,,2657,Blackbeard,American Double / Imperial Stout,5,12.0
493,0.062,,2656,Rye Knot,American Brown Ale,5,12.0
494,0.06,,2655,Dead Arm,American Pale Ale (APA),5,12.0
495,0.048,,2654,32°/50° Kölsch ,Kölsch,5,16.0
496,0.077,,2653,HopArt,American IPA,5,16.0
497,0.09699999999999999,,2652,Boy King,American Double / Imperial IPA,5,16.0
498,0.052000000000000005,,2252,Gran Sport,American Porter,182,16.0
499,0.053,25.0,2214,Horny Toad Cerveza,American Blonde Ale,182,16.0
500,0.063,35.0,2213,Native Amber,American Amber / Red Ale,182,16.0
501,0.068,100.0,1442,F5 IPA,American IPA,182,16.0
502,0.063,35.0,170,Native Amber (2013),American Amber / Red Ale,182,16.0
503,0.053,25.0,169,Horny Toad Cerveza (2013),American Blonde Ale,182,16.0
504,0.068,100.0,2315,Hopportunity Knocks IPA,American IPA,155,12.0
505,0.06,,1808,Pilot Rock Porter,American Porter,155,12.0
506,0.055999999999999994,55.0,1419,Caldera Pale Ale,American Pale Ale (APA),155,12.0
507,0.039,16.0,878,Lawnmower Lager,American Adjunct Lager,155,12.0
508,0.054000000000000006,24.0,794,Ashland Amber Ale (2009),American Amber / Red Ale,155,12.0
509,0.061,94.0,793,Caldera IPA (2009),American IPA,155,12.0
510,0.061,94.0,792,Caldera IPA (2007),American IPA,155,12.0
511,0.055999999999999994,55.0,791,Caldera Pale Ale (2010),American Pale Ale (APA),155,12.0
512,0.055999999999999994,55.0,790,Caldera Pale Ale (2009),American Pale Ale (APA),155,12.0
513,0.055999999999999994,55.0,789,Caldera Pale Ale (2005),American Pale Ale (APA),155,12.0
514,0.055999999999999994,55.0,788,Caldera Pale Ale (2007),American Pale Ale (APA),155,12.0
515,0.055999999999999994,55.0,38,Caldera Pale Ale (2011),American Pale Ale (APA),155,12.0
516,0.054000000000000006,24.0,37,Ashland Amber Ale,American Amber / Red Ale,155,12.0
517,0.061,94.0,36,Caldera IPA,American IPA,155,12.0
518,0.05,,2257,Remain in Light,American Pilsner,178,12.0
519,0.065,,2256,Flower Child (2014),American IPA,178,12.0
520,,,870,THP White (2006),Witbier,497,12.0
521,,,869,THP Amber (2006),American Amber / Red Ale,497,12.0
522,,,868,THP Light (2006),American Blonde Ale,497,12.0
523,,,867,THP Dark (2006),English Dark Mild Ale,497,12.0
524,0.099,43.0,2068,Imperial Pumpkin Stout,Pumpkin Ale,230,16.0
525,0.09,130.0,2067,Dead-Eye DIPA,American Double / Imperial IPA,230,16.0
526,0.055,64.0,2066,Fisherman's IPA,American IPA,230,12.0
527,0.054000000000000006,35.0,2065,Fisherman's Pils,German Pilsener,230,12.0
528,0.055,30.0,2064,Fisherman's Brew,American Amber / Red Ale,230,12.0
529,0.055,35.0,1928,Cape Cod Red,American Amber / Red Ale,267,16.0
530,0.049,10.0,1927,Beach Blonde,American Blonde Ale,267,16.0
531,0.065,80.0,2227,Dark Voyage Black IPA (2013),American Black Ale,192,12.0
532,0.052000000000000005,28.0,2226,Wisconsin Amber,Vienna Lager,192,12.0
533,0.046,18.0,2225,Lake House,Munich Helles Lager,192,12.0
534,0.055999999999999994,55.0,1954,Ghost Ship White IPA,American IPA,192,12.0
535,0.046,18.0,1910,Lake House,Munich Helles Lager,192,16.0
536,0.062,70.0,1177,Mutiny IPA,American IPA,192,12.0
537,0.052000000000000005,,840,Wisconsin Amber (1998),Vienna Lager,192,12.0
538,0.042,,180,Island Wheat,American Pale Wheat Ale,192,12.0
539,0.052000000000000005,,63,Wisconsin Amber (2013),Vienna Lager,192,12.0
540,0.05,,62,U.S. Pale Ale,American Pale Ale (APA),192,12.0
541,,,61,Supper Club Lager,American Pale Lager,192,12.0
542,0.04,,784,Carolina Lighthouse (2007),American Blonde Ale,504,12.0
543,0.05,,783,Carolina Blonde (2006),American Blonde Ale,504,12.0
544,0.035,,782,Carolina Blonde Light (2005),American Blonde Ale,504,12.0
545,0.059000000000000004,22.0,2255,Santa's Secret,Winter Warmer,179,16.0
546,0.057,,530,Flagship IPA,English India Pale Ale (IPA),179,12.0
547,0.051,,427,Sky Blue Golden Ale,Kölsch,179,12.0
548,0.099,100.0,2094,Epitome,American Black Ale,222,16.0
549,0.039,9.0,1941,Monkey Chased the Weasel,Berliner Weissbier,222,16.0
550,0.078,80.0,1940,077XX,American Double / Imperial IPA,222,16.0
551,0.042,35.0,1439,Boat Beer,American IPA,222,12.0
552,0.069,,1465,Granny Smith Hard Apple Cider,Cider,404,16.0
553,0.069,,1464,Dry Hard Apple Cider,Cider,404,16.0
554,0.055999999999999994,,1744,Farmer Ted's Cream Ale,Cream Ale,331,12.0
555,0.052000000000000005,,1743,Firewater India Pale Ale,American IPA,331,12.0
556,0.047,,1742,White Zombie Ale,Witbier,331,12.0
557,0.07,,1719,King Winterbolt Winter Ale,Winter Warmer,331,12.0
558,0.047,,638,White Zombie Ale,Witbier,331,12.0
559,0.052000000000000005,,507,Firewater India Pale Ale,American IPA,331,12.0
560,0.055999999999999994,,480,Farmer Ted's Farmhouse Cream Ale,Cream Ale,331,12.0
561,0.048,16.0,1882,Whitecap Wit,Witbier,285,16.0
562,0.078,16.0,1881,Seiche Scottish Ale,Scottish Ale,285,16.0
563,0.057999999999999996,,2446,Peanut Butter Jelly Time,American Brown Ale,96,12.0
564,0.054000000000000006,,2106,King Coconut,American Porter,96,12.0
565,0.085,90.0,2600,Gone A-Rye,American Double / Imperial IPA,29,16.0
566,,,2210,Special Release,,29,16.0
567,0.068,70.0,2052,Dankosaurus,American IPA,29,16.0
568,0.051,35.0,1584,Scruffy's Smoked Alt,Smoked Beer,29,16.0
569,0.051,36.0,1182,Elliott's Phoned Home Pale Ale,American Pale Ale (APA),29,16.0
570,0.05,18.0,1050,The Lawn Ranger,Cream Ale,29,16.0
571,0.05,,1219,All American Blonde Ale,American Blonde Ale,452,12.0
572,0.05,,1218,All American Red Ale,American Amber / Red Ale,452,12.0
573,0.05,40.0,2377,Main St. Virginia Ale,Altbier,122,12.0
574,0.045,24.0,1839,Chin Music Amber Lager,American Amber / Red Lager,122,12.0
575,0.05,40.0,1248,Main St. Virginia Ale,Altbier,122,12.0
576,0.052000000000000005,42.0,1247,Ray Ray’s Pale Ale,American Pale Ale (APA),122,12.0
577,0.051,15.0,1649,Chai Ale,Herbed / Spiced Beer,350,16.0
578,0.07200000000000001,85.0,1648,Lucky Day IPA,American IPA,350,16.0
579,0.095,99.0,1647,Terrace Hill Double IPA,American Double / Imperial IPA,350,16.0
580,0.075,77.0,1646,Catch 23,American Black Ale,350,16.0
581,0.07,,2057,Stickin' In My Rye,Rye Beer,236,24.0
582,0.06,45.0,2056,Black Me Stout,American Stout,236,12.0
583,0.05,22.0,2055,Killer Kolsch,Kölsch,236,12.0
584,0.07,65.0,1933,Missile IPA,American IPA,236,12.0
585,0.045,,2019,Enlighten,Kölsch,250,16.0
586,0.065,8.0,2018,Ale Cider,Fruit / Vegetable Beer,250,16.0
587,0.055,30.0,2017,Pail Ale,American Pale Ale (APA),250,16.0
588,0.045,,2016,Englishman,English Brown Ale,250,16.0
589,0.08,69.0,2080,8 Barrel,American Strong Ale,226,16.0
590,0.055,40.0,2079,Oktoberfest,Märzen / Oktoberfest,226,16.0
591,0.057,58.0,2380,IPA #11,American IPA,121,16.0
592,0.057,10.0,2379,Blood Orange Honey,Fruit / Vegetable Beer,121,16.0
593,0.052000000000000005,,2354,Lighthouse Amber,Altbier,121,16.0
594,0.08900000000000001,126.0,2440,Bay of Bengal Double IPA (2014),American Double / Imperial IPA,99,12.0
595,0.049,29.0,567,Churchkey Pilsner Style Beer,American Pilsner,526,12.0
596,0.05,,1342,First Press,Cider,425,12.0
597,0.05,,1341,Magic Apple,Cider,425,12.0
598,0.055,25.0,2349,Cubano Espresso,Bock,141,12.0
599,0.062,65.0,2014,Operation Homefront,American IPA,141,12.0
600,0.08199999999999999,65.0,2013,Wandering Pelican,American Black Ale,141,12.0
601,0.055,,2012,Sugar Plum,American Brown Ale,141,12.0
602,0.055,,2011,Oktoberfest,Märzen / Oktoberfest,141,12.0
603,0.06,,2010,Puppy's Breath Porter,American Porter,141,12.0
604,0.045,,2009,Happening Now,American IPA,141,12.0
605,0.07,60.0,1726,Hopped on the High Seas (Hop #529),American IPA,141,12.0
606,0.07,60.0,1725,Hopped on the High Seas (Calypso),American IPA,141,12.0
607,0.063,,1695,Wiregrass Post-Prohibition Ale,American Pale Ale (APA),141,12.0
608,0.07,60.0,1694,Dry-Hopped On The High Seas Caribbean-Style IPA,American IPA,141,12.0
609,0.07,60.0,1693,Hopped on the High Seas (Citra),American IPA,141,12.0
610,0.07,60.0,1692,Hopped on the High Seas (Ahtanum),American IPA,141,12.0
611,0.055,,1369,Gwar Beer,American Pale Ale (APA),141,12.0
612,0.052000000000000005,,1243,Tropical Heatwave,American Pale Wheat Ale,141,16.0
613,0.075,70.0,1142,Humidor Series India Pale Ale,American IPA,141,12.0
614,0.075,70.0,1141,Jai Alai IPA Aged on White Oak,American IPA,141,12.0
615,0.08,65.0,1140,José Martí American Porter,American Porter,141,12.0
616,0.05,,1139,Invasion Pale Ale,American Pale Ale (APA),141,12.0
617,0.055,25.0,1138,Maduro Brown Ale,English Brown Ale,141,12.0
618,0.055,25.0,571,Maduro Brown Ale,American Brown Ale,141,12.0
619,0.05,,570,Hotter Than Helles Lager,Munich Helles Lager,141,12.0
620,0.07200000000000001,75.0,569,Tocobaga Red Ale,American Amber / Red Ale,141,12.0
621,0.075,70.0,546,Jai Alai IPA,American IPA,141,12.0
622,0.05,18.0,545,Florida Cracker Belgian Wit,Witbier,141,12.0
623,0.048,,2338,Shark Tracker Light lager,Light Lager,145,12.0
624,0.06,,1365,Pumple Drumkin,Pumpkin Ale,145,12.0
625,0.045,,1094,Grey Lady,Witbier,145,12.0
626,0.062,,657,Summer of Lager,Munich Helles Lager,145,12.0
627,0.065,,656,Indie Pale Ale,American IPA,145,12.0
628,0.038,,359,Sankaty Light Lager,Light Lager,145,12.0
629,0.055999999999999994,,56,Whale's Tale Pale Ale,English Pale Ale,145,12.0
630,0.067,60.0,1772,Jacaranada Rye IPA,American IPA,320,16.0
631,0.06,75.0,1393,Cascadian Dark Ale,American Black Ale,418,12.0
632,0.044000000000000004,13.0,893,Wheat the People,American Pale Wheat Ale,418,16.0
633,0.047,17.0,1407,Tybee Island Blonde,American Blonde Ale,415,12.0
634,0.062,55.0,1406,Savannah Brown Ale,American Brown Ale,415,12.0
635,0.046,11.0,2438,Rhode Island Blueberry,Kölsch,101,12.0
636,0.065,75.0,2437,Newport Storm IPA,American IPA,101,12.0
637,0.052000000000000005,24.0,751,Hurricane Amber Ale (2004),American Amber / Red Ale,101,12.0
638,0.052000000000000005,24.0,120,Hurricane Amber Ale,American Amber / Red Ale,101,12.0
639,0.057999999999999996,,2061,Big Blue Van,Fruit / Vegetable Beer,232,16.0
640,0.068,75.0,970,Des Moines IPA,American IPA,482,16.0
641,0.048,22.0,969,Capital Gold Golden Lager,German Pilsener,482,16.0
642,0.055999999999999994,21.0,968,Farmer John's Multi-Grain Ale,American Blonde Ale,482,16.0
643,0.05,,2351,Behemoth,American Pilsner,139,12.0
644,0.052000000000000005,,1650,Arkansas Red,American Amber / Red Ale,139,12.0
645,0.057,,1337,Core Oatmeal Stout,Oatmeal Stout,139,12.0
646,0.061,,1336,Core ESB,Extra Special / Strong Bitter (ESB),139,12.0
647,0.038,,737,Chester's Beer (2005),American Pale Lager,512,12.0
648,0.05,,129,Heiner Brau Kölsch,Kölsch,553,12.0
649,0.048,,716,Trigger Blonde Ale,American Blonde Ale,515,16.0
650,0.075,29.0,659,Crabtree Oatmeal Stout,Oatmeal Stout,515,16.0
651,0.077,71.0,556,Eclipse Black IPA,American Black Ale,515,16.0
652,0.06,46.0,2538,Neomexicanus Native,American Pale Ale (APA),63,12.0
653,0.075,25.0,2355,Old Soul,Belgian Strong Pale Ale,63,12.0
654,0.059000000000000004,,1689,Snowcat Coffee Stout,American Stout,63,12.0
655,,,1163,WinterWonderGrass Festival Ale,American Amber / Red Ale,63,12.0
656,,,940,Boohai Red Ale,American Amber / Red Ale,63,12.0
657,0.052000000000000005,15.0,685,Lava Lake Wit,Witbier,63,12.0
658,0.06,,613,Mountain Livin' Pale Ale,American Pale Ale (APA),63,12.0
659,0.052000000000000005,25.0,356,Crazy Mountain Amber Ale,American Amber / Red Ale,63,12.0
660,0.065,65.0,2029,Tropicalia,American IPA,247,12.0
661,0.045,,2028,Athena,Berliner Weissbier,247,12.0
662,0.049,25.0,2293,Aviator Raspberry Blonde,American Blonde Ale,169,12.0
663,0.055,,1105,3 Picket Porter,American Porter,169,12.0
664,0.055999999999999994,,1104,Rusty Nail Pale Ale,American Pale Ale (APA),169,12.0
665,0.065,,2145,Red Water Irish Style Red,American Amber / Red Ale,212,12.0
666,0.066,,1804,Mjöllnir,Herbed / Spiced Beer,212,12.0
667,0.055,,1602,Bear Butte Nut Brown Ale,American Brown Ale,212,12.0
668,0.045,,1301,Easy Livin' Summer Ale,American Blonde Ale,212,12.0
669,0.055,,542,Canyon Cream Ale,Cream Ale,212,12.0
670,0.069,,272,Pile O'Dirt Porter,American Porter,212,12.0
671,0.06,,271,11th Hour IPA,American IPA,212,12.0
672,0.06,31.0,1057,South Ridge Amber Ale,American Amber / Red Ale,472,16.0
673,0.052000000000000005,23.0,681,Summertime Ale,Kölsch,472,16.0
674,0.049,,1789,Lost River Blonde Ale,American Blonde Ale,315,16.0
675,0.054000000000000006,,1788,Monon Wheat,Witbier,315,16.0
676,0.08,,1787,Floyd's Folly,Scottish Ale,315,16.0
677,0.063,,1786,Half Court IPA,American IPA,315,16.0
678,0.045,,1763,Geary's Pale Ale,English Pale Ale,323,12.0
679,0.06,,1311,Geary's Summer Ale,Kölsch,323,12.0
680,0.08,,2078,Stone of Arbroath,Scotch Ale / Wee Heavy,227,12.0
681,0.05,15.0,1809,The Tradition,American Blonde Ale,227,12.0
682,0.053,11.0,1263,El Hefe Speaks,Hefeweizen,227,12.0
683,0.055,,1092,Penn Quarter Porter,American Porter,227,12.0
684,0.092,115.0,851,On the Wings of Armageddon,American Double / Imperial IPA,227,12.0
685,0.065,80.0,186,The Corruption,American IPA,227,12.0
686,0.07,,185,The Citizen,Belgian Pale Ale,227,12.0
687,0.06,,184,The Public,American Pale Ale (APA),227,12.0
688,0.065,,1224,Dank IPA,American IPA,451,16.0
689,0.065,,964,Dank IPA (2012),American IPA,451,16.0
690,0.07200000000000001,,1623,Lift Off IPA,American IPA,358,16.0
691,0.055,,110,BrewFarm Select Golden Lager,American Pale Lager,554,12.0
692,0.05,,1735,Sprocket Blonde Ale (2006),American Blonde Ale,333,12.0
693,0.05,,1734,Sprocket Pale Ale (2006),American Pale Ale (APA),333,12.0
694,0.063,37.0,1746,Dead Armadillo Amber Ale,American Amber / Red Ale,330,12.0
695,0.06,,2371,Neato Bandito,Euro Pale Lager,127,12.0
696,0.075,33.0,2251,Oak Cliff Coffee Ale,American Brown Ale,127,12.0
697,0.085,100.0,2166,Dream Crusher Double IPA,American Double / Imperial IPA,127,12.0
698,0.06,,1827,Deep Ellum Pale Ale,American Pale Ale (APA),127,12.0
699,0.07,,1203,Double Brown Stout,Baltic Porter,127,12.0
700,0.048,25.0,1202,Farmhouse Wit,Saison / Farmhouse Ale,127,16.0
701,0.046,,1161,Rye Pils Session Lager,German Pilsener,127,12.0
702,0.052000000000000005,23.0,946,Dallas Blonde,American Blonde Ale,127,12.0
703,0.07,70.0,943,Deep Ellum IPA,American IPA,127,12.0
704,0.045,44.0,1886,Thrasher Session India Pale Ale,American IPA,283,12.0
705,0.05,16.0,1885,Gutch English Style Mild Ale,English Pale Mild Ale,283,12.0
706,0.059000000000000004,55.0,1213,Chuli Stout,Irish Dry Stout,453,12.0
707,0.055999999999999994,46.0,1159,Mother Ale,American Blonde Ale,453,12.0
708,0.065,71.0,947,Twister Creek India Pale Ale,American IPA,453,12.0
709,0.057999999999999996,46.0,929,Single Engine Red,Irish Red Ale,453,12.0
710,0.07,,1944,Incredible Pedal IPA,American IPA,263,12.0
711,0.05,,1943,Graham Cracker Porter,American Porter,263,12.0
712,0.05,40.0,1210,Mirror Pond Pale Ale,American Pale Ale (APA),454,12.0
713,0.052000000000000005,16.0,2550,Weissenheimer,Hefeweizen,57,12.0
714,0.049,22.0,2505,Abbey's Single (2015- ),Abbey Single Ale,57,12.0
715,0.063,76.0,2025,Vertex IPA,American IPA,57,12.0
716,0.05,12.0,2021,Here Gose Nothin',Gose,57,12.0
717,0.05,,2015,Strawberry Blonde,Fruit / Vegetable Beer,57,12.0
718,0.096,85.0,1888,Hoperation Overload,American Double / Imperial IPA,57,12.0
719,0.049,22.0,1887,Abbey's Single Ale (Current),Abbey Single Ale,57,12.0
720,0.044000000000000004,45.0,2051,Bravo Four Point,American Pale Ale (APA),237,12.0
721,0.052000000000000005,26.0,1201,Striped Bass Pale Ale,American Pale Ale (APA),237,12.0
722,0.054000000000000006,27.0,924,Deadicated Amber,American Amber / Red Ale,491,16.0
723,,,731,Kaleidoscope Collaboration 2012,American Black Ale,491,16.0
724,0.071,85.0,730,California Sunshine Rye IPA,American IPA,491,16.0
725,0.07400000000000001,12.0,647,Full Boar Scotch Ale,Scotch Ale / Wee Heavy,491,16.0
726,0.045,,1773,12 Man Pale Ale,American Pale Ale (APA),319,12.0
727,0.065,72.0,1795,Filthy Hoppin' IPA,American IPA,311,16.0
728,,,944,Dock Street Amber Beer (1992),American Amber / Red Ale,488,12.0
729,,,524,Dolores River Hefeweizen,Hefeweizen,531,16.0
730,,,450,Dolores River ESB,Extra Special / Strong Bitter (ESB),531,16.0
731,,,449,Snaggletooth Double Pale Ale,American Double / Imperial IPA,531,16.0
732,,,448,Dolores River Pale Ale,American Pale Ale (APA),531,16.0
733,,,447,Dolores River Dry Stout,Irish Dry Stout,531,16.0
734,,,446,Dolores River Mild,English Dark Mild Ale,531,16.0
735,0.049,,1246,Cranberry Blend,Cider,446,12.0
736,0.051,,977,Orignal Blend,Cider,446,12.0
737,0.066,100.0,881,Hop Abomination,American IPA,496,12.0
738,0.051,17.0,880,Apricot Blonde,Fruit / Vegetable Beer,496,12.0
739,0.043,12.0,872,Dry Dock Hefeweizen,Hefeweizen,496,12.0
740,0.057999999999999996,49.0,871,Dry Dock Amber Ale,American Amber / Red Ale,496,12.0
741,0.061,64.0,1685,Category 3 IPA,American IPA,340,12.0
742,0.045,18.0,457,Dundee Summer Wheat Beer,American Pale Wheat Ale,538,12.0
743,0.05,,1590,Pumpkin Patch Ale,Pumpkin Ale,369,16.0
744,0.078,74.0,1382,Crank Yanker IPA,American IPA,369,16.0
745,0.06,,1110,River Runners Pale Ale,American Pale Ale (APA),369,16.0
746,0.05,,1014,Pumpkin Patch Ale (2012),Pumpkin Ale,369,16.0
747,0.055,,911,Mountain Fairy Raspberry Wheat,Fruit / Vegetable Beer,369,16.0
748,0.045,,680,Boater Beer,German Pilsener,369,16.0
749,0.078,74.0,395,Crank Yanker IPA (2011),American IPA,369,16.0
750,0.057,,1642,Bleeding Buckeye Red Ale,Extra Special / Strong Bitter (ESB),352,16.0
751,0.049,25.0,673,Dottie Seattle Lager,American Amber / Red Lager,516,16.0
752,0.07,,1107,Nut Sack Imperial Brown Ale,American Brown Ale,465,12.0
753,0.05,,1039,Underachiever,American Adjunct Lager,473,16.0
754,0.052000000000000005,,2477,Lil' Brainless Raspberries,Fruit / Vegetable Beer,81,12.0
755,0.052000000000000005,,2008,Element 29,American Pale Ale (APA),81,12.0
756,0.05,,2004,Hop Syndrome,American Pale Lager,81,12.0
757,0.062,,2003,Escape to Colorado,American IPA,81,12.0
758,0.043,60.0,2292,Little Sister India Style Session Ale,American IPA,170,12.0
759,0.062,80.0,1504,Country Boy IPA,American IPA,170,12.0
760,0.049,23.0,2604,Blonde Czich,American Blonde Ale,26,16.0
761,0.07,61.0,2432,White Reaper,Belgian IPA,26,16.0
762,0.051,,2431,Bobblehead,American Pale Wheat Ale,26,16.0
763,0.052000000000000005,,2430,Lucky Dog,American Pale Ale (APA),26,16.0
764,0.048,,2429,Voodoo,American Porter,26,16.0
765,0.054000000000000006,48.0,1967,General George Patton Pilsner,Czech Pilsener,26,16.0
766,0.04,,2283,Nomader Weiss,Berliner Weissbier,173,12.0
767,0.085,,2248,Molotov Lite,American Double / Imperial IPA,173,16.0
768,0.055,,1287,Hipster Ale (Two Roads Brewing),American Pale Ale (APA),173,12.0
769,0.027000000000000003,,1286,Bikini Beer,American IPA,173,12.0
770,0.055,,640,Hipster Ale (Westbrook Brewing),American Pale Ale (APA),173,12.0
771,0.05,32.0,1722,Iron Horse Pale Ale,American Pale Ale (APA),335,12.0
772,0.045,19.0,1435,Stone's Throw IPA,Scottish Ale,335,12.0
773,0.067,70.0,1434,Wood Chipper India Pale Ale,American IPA,335,12.0
774,0.063,55.0,2089,Trail Head,American Pale Ale (APA),224,12.0
775,0.07,80.0,2088,Hop Stalker Fresh Hop IPA,American IPA,224,16.0
776,0.07,58.0,1455,Sudice American Stout,American Stout,405,16.0
777,0.05,20.0,1454,Parcae Belgian Style Pale Ale,Belgian Pale Ale,405,16.0
778,0.05,20.0,1453,Norns Roggenbier,Roggenbier,405,16.0
779,0.05,20.0,1452,Laimas Kölsch Style Ale,Kölsch,405,16.0
780,0.07,70.0,1451,Moirai India Pale Ale,American IPA,405,16.0
781,0.075,53.0,2191,Loki Red Ale,American Amber / Red Ale,201,16.0
782,0.046,,1731,Peaches & Cream,Fruit / Vegetable Beer,201,16.0
783,0.051,,1022,Quaff India Style Session Ale,American IPA,201,16.0
784,0.075,53.0,895,Loki Red Ale (2013),American Amber / Red Ale,201,16.0
785,0.069,,682,Mjolnir Imperial IPA,American Double / Imperial IPA,201,16.0
786,0.05,,112,Fearless Scottish Ale,Scottish Ale,201,16.0
787,0.081,,2289,Mastermind,American Double / Imperial IPA,172,12.0
788,0.08199999999999999,,2027,Hyzer Flip,American Double / Imperial IPA,172,16.0
789,0.08199999999999999,80.0,1929,Second Fiddle,American Double / Imperial IPA,172,16.0
790,0.055,30.0,1858,Hodad Porter,American Porter,172,16.0
791,0.045,,2591,Weiss Weiss Baby,Kristalweizen,36,12.0
792,0.055,45.0,2590,Czech Yo Self,Czech Pilsener,36,12.0
793,0.048,20.0,1968,FMB 101,Kölsch,36,12.0
794,0.09,,1981,Hardcore Chimera,American Double / Imperial IPA,256,16.0
795,0.08,80.0,1664,Sobek & Set,American Black Ale,256,16.0
796,0.086,,1663,Nuclear Winter,Belgian Strong Dark Ale,256,16.0
797,0.05,22.0,1662,Wet Hot American Wheat Ale,American Pale Wheat Ale,256,16.0
798,0.053,,941,Secret Stache Stout,American Stout,256,16.0
799,0.08,72.0,935,Fascist Pig Ale,American Amber / Red Ale,256,16.0
800,0.055,,809,Cut Throat Pale Ale,American Pale Ale (APA),256,16.0
801,0.075,,481,Threadless IPA,American IPA,256,16.0
802,0.055,,351,Cut Throat Pale Ale (2011),American Pale Ale (APA),256,16.0
803,0.047,,350,Golden Wing Blonde Ale,American Blonde Ale,256,16.0
804,0.045,47.0,2569,Easy Jack,American IPA,48,12.0
805,0.075,75.0,2463,Union Jack,American IPA,48,12.0
806,0.053,,2462,Pivo Pils,German Pilsener,48,12.0
807,0.047,,1957,805 Blonde Ale,American Blonde Ale,48,12.0
808,0.047,20.0,1733,805,American Blonde Ale,48,12.0
809,0.065,,2624,Deflator,Doppelbock,16,16.0
810,0.05,27.0,2284,Hinchtown Hammer Down,American Blonde Ale,16,16.0
811,0.06,104.0,1610,Half Cycle IPA,American IPA,16,16.0
812,,,520,Inclined Plane Ale,American IPA,532,12.0
813,0.055,,2554,Moped Traveler,American Pale Ale (APA),54,16.0
814,0.071,60.0,608,Snake Dog IPA,American IPA,521,12.0
815,0.047,28.0,607,Underdog Atlantic Lager,American Pale Lager,521,12.0
816,0.04,,2567,Flying Mouse 8,American Porter,50,12.0
817,0.07,70.0,2566,Flying Mouse 4,American IPA,50,12.0
818,0.078,,1899,La Ferme Urbaine Farmhouse Ale,Saison / Farmhouse Ale,279,12.0
819,0.06,,983,Backyahd IPA,American IPA,279,12.0
820,0.065,,982,Raincloud Robust Porter,American Porter,279,12.0
821,0.045,,981,Barstool American Golden Ale,American Blonde Ale,279,12.0
822,0.05,18.0,2111,What the Butler Saw,Witbier,217,12.0
823,0.069,65.0,2110,1916 Shore Shiver,American IPA,217,12.0
824,0.052000000000000005,,2172,Quick WIT,Belgian Pale Ale,206,12.0
825,0.062,,2171,The Optimist,American IPA,206,12.0
826,0.045,,1911,Suicide Squeeze IPA,American IPA,206,16.0
827,0.065,,1803,Java the Hop,American IPA,206,16.0
828,0.062,,1566,Next Adventure Black IPA,American Black Ale,206,16.0
829,0.067,,1515,3-Way IPA (2013),American IPA,206,16.0
830,0.057999999999999996,,1214,Tender Loving Empire NWPA,American Pale Ale (APA),206,16.0
831,0.052000000000000005,,674,Quick Wit Belgianesque Ale,Witbier,206,16.0
832,0.055,,562,Sunrise Oatmeal Pale Ale,American Pale Ale (APA),206,16.0
833,0.08800000000000001,,552,Cavatica Stout,American Double / Imperial Stout,206,16.0
834,0.051,,319,1811 Lager,American Amber / Red Lager,206,16.0
835,0.07400000000000001,97.0,318,Vortex IPA,American IPA,206,16.0
836,,,2322,Fort Pitt Ale,American Amber / Red Ale,151,12.0
837,0.047,19.0,2661,Park,American Pale Wheat Ale,4,12.0
838,0.055999999999999994,16.0,2660,Westfalia,American Amber / Red Ale,4,12.0
839,0.046,17.0,2659,KSA,Kölsch,4,12.0
840,0.063,42.0,2658,Villager,American IPA,4,12.0
841,0.085,50.0,2625,Dirty Bastard,Scotch Ale / Wee Heavy,15,12.0
842,0.07200000000000001,65.0,1565,Centennial IPA,American IPA,15,12.0
843,0.047,42.0,1223,All Day IPA,American IPA,15,12.0
844,0.076,73.0,1874,El Chingon IPA,American IPA,287,12.0
845,0.057,40.0,1873,Block Party Robust Porter,American Porter,287,12.0
846,0.052000000000000005,20.0,1872,Local Buzz,American Blonde Ale,287,12.0
847,0.055,,2613,Feel Like Maplin' Love,Oatmeal Stout,22,16.0
848,0.05,,2612,Father's Beer,Belgian Pale Ale,22,16.0
849,0.06,,2611,The 26th,American IPA,22,16.0
850,0.064,90.0,2610,The Gadget,American IPA,22,16.0
851,0.04,,1657,Leprechaun Lager,American Pale Lager,348,12.0
852,0.052000000000000005,17.0,2309,Sunbru Kölsch,Kölsch,160,12.0
853,0.06,21.0,1635,Kilt Lifter Scottish-Style Ale,,160,12.0
854,0.051,,1616,Pumpkin Porter,American Porter,160,12.0
855,0.042,9.0,1585,Four Peaks Peach Ale,Fruit / Vegetable Beer,160,12.0
856,0.067,47.0,358,Hop Knot IPA,American IPA,160,12.0
857,0.06,21.0,179,Kilt Lifter Scottish-Style Ale (2009),Scottish Ale,160,12.0
858,0.052000000000000005,,178,Sunbru Kölsch,Kölsch,160,12.0
859,0.06,,2428,Four String Vanilla Porter,American Porter,105,12.0
860,0.05,28.0,2427,Suncaster Summer Wheat,American Pale Wheat Ale,105,12.0
861,0.057,36.0,2425,Brass Knuckle Pale Ale,American Pale Ale (APA),105,12.0
862,0.07,70.0,2424,Big Star White IPA,American White IPA,105,12.0
863,0.055999999999999994,,1998,Old Detroit,American Amber / Red Ale,253,12.0
864,0.069,69.0,1556,Batch 69 IPA,American IPA,253,12.0
865,0.055,18.0,1208,Twisted Helles Summer Lager,Munich Helles Lager,253,12.0
866,0.053,27.0,2527,OktoberFiesta,,66,12.0
867,0.065,33.0,2526,Texicali ,American Brown Ale,66,12.0
868,0.06,,2525,Pinata Protest,Witbier,66,12.0
869,0.042,20.0,2524,Bat Outta Helles,Munich Helles Lager,66,12.0
870,0.068,,2523,Original,American Amber / Red Ale,66,12.0
871,0.042,10.0,2522,Rye Wit,Witbier,66,12.0
872,0.059000000000000004,70.0,2521,Soul Doubt,American IPA,66,12.0
873,0.044000000000000004,5.0,2520,Yo Soy Un Berliner,Berliner Weissbier,66,12.0
874,0.04,,1174,77 Fremont Select Spring Session IPA,American IPA,460,12.0
875,0.045,,1116,Fremont Organic Pale Ale,American Pale Ale (APA),460,12.0
876,0.08,,994,Abominable Ale,English Strong Ale,460,12.0
877,0.065,35.0,901,Harvest Ale,Saison / Farmhouse Ale,460,12.0
878,0.065,45.0,875,Fremont Summer Ale,American Pale Ale (APA),460,12.0
879,0.055999999999999994,30.0,858,Universale Pale Ale,American Pale Ale (APA),460,12.0
880,0.065,80.0,857,Interurban IPA,American IPA,460,12.0
881,0.053,32.0,1300,Gateway Kolsch Style Ale,Kölsch,433,12.0
882,0.07,24.0,1260,Wee-Heavy-Er Scotch Ale,Scotch Ale / Wee Heavy,433,12.0
883,0.052000000000000005,42.0,1259,13 Rebels ESB,Extra Special / Strong Bitter (ESB),433,12.0
884,0.07,73.0,2254,Salamander Slam,American IPA,180,16.0
885,0.05,,1658,Cack-A-Lacky,American Pale Ale (APA),347,12.0
886,0.07200000000000001,50.0,2077,No Wake IPA,American IPA,228,12.0
887,0.049,15.0,2076,Boathouse Blonde,American Blonde Ale,228,12.0
888,0.05,26.0,2075,Cedar Point,American Amber / Red Ale,228,12.0
889,0.067,70.0,2426,Clean Shave IPA,American IPA,106,12.0
890,0.07200000000000001,75.0,2045,Might As Well IPL,American Pale Lager,240,16.0
891,0.057999999999999996,35.0,1960,Saison Pamplemousse,Saison / Farmhouse Ale,240,12.0
892,0.07400000000000001,74.0,1777,2020 IPA,American IPA,240,16.0
893,0.08,70.0,1698,Wolf Among Weeds IPA,American IPA,240,16.0
894,0.094,92.0,1641,Better Weather IPA,American IPA,240,16.0
895,0.059000000000000004,60.0,1490,Point the Way IPA,American IPA,240,16.0
896,0.046,15.0,1489,Golden Road Hefeweizen,Hefeweizen,240,16.0
897,0.068,65.0,1399,Heal the Bay IPA,American IPA,240,16.0
898,0.059000000000000004,60.0,1296,Point the Way IPA,American IPA,240,12.0
899,0.05,,1034,Cabrillo Kölsch,Kölsch,240,16.0
900,0.055,20.0,991,Get Up Offa That Brown,American Brown Ale,240,16.0
901,0.08,70.0,750,Burning Bush Smoked IPA,American IPA,240,16.0
902,0.08,70.0,749,Wolf Among Weeds IPA (2012),American IPA,240,16.0
903,0.059000000000000004,60.0,549,Point the Way IPA (2012),American IPA,240,16.0
904,0.046,15.0,548,Golden Road Hefeweizen (2012),Hefeweizen,240,16.0
905,0.07,11.0,2587,Vanilla Porter,American Porter,39,16.0
906,0.07,70.0,1109,Descender IPA,American IPA,464,12.0
907,0.06,18.0,1108,Sweet As Pacific Ale,American Pale Wheat Ale,464,12.0
908,0.055999999999999994,36.0,1000,Good People Pale Ale,American Pale Ale (APA),478,12.0
909,0.09300000000000001,103.0,312,Snake Handler Double IPA,American Double / Imperial IPA,478,12.0
910,0.06,54.0,311,Coffee Oatmeal Stout,Oatmeal Stout,478,12.0
911,0.06,64.0,309,Good People IPA,American IPA,478,12.0
912,0.057999999999999996,36.0,308,Good People American Brown Ale,American Brown Ale,478,12.0
913,0.055,40.0,2205,Mountain Rescue Pale Ale,American Pale Ale (APA),194,12.0
914,0.059000000000000004,55.0,2198,Goose Island India Pale Ale,American IPA,196,12.0
915,0.054000000000000006,30.0,2457,312 Urban Pale Ale,American Pale Ale (APA),88,16.0
916,0.054000000000000006,30.0,2202,312 Urban Pale Ale,American Pale Ale (APA),88,12.0
917,0.042,18.0,2201,312 Urban Wheat Ale,American Pale Wheat Ale,88,16.0
918,0.042,18.0,1829,312 Urban Wheat Ale,American Pale Wheat Ale,88,12.0
919,0.042,20.0,581,312 Urban Wheat Ale (2012),American Pale Wheat Ale,88,12.0
920,0.052000000000000005,19.0,1383,Beaver Logger,American Pale Lager,420,12.0
921,0.05,,477,White Water Wheat,American Pale Wheat Ale,536,12.0
922,0.052000000000000005,,476,Grand Canyon American Pilsner,American Pilsner,536,12.0
923,0.054000000000000006,,143,Grand Canyon Sunset Amber Ale,American Amber / Red Ale,536,12.0
924,,,142,Black Iron India Pale Ale,American IPA,536,12.0
925,0.043,21.0,2129,Monarch Classic American Wheat,American Pale Wheat Ale,213,12.0
926,0.049,21.0,2127,Sir William's English Brown Ale,English Brown Ale,213,12.0
927,0.055,35.0,2126,Lakefire Rye Pale Ale,American Pale Ale (APA),213,12.0
928,0.053,22.0,2303,Beer Agent Re-Ignition,American Blonde Ale,165,16.0
929,0.057,18.0,1990,Cherry Ale,Fruit / Vegetable Beer,165,16.0
930,0.055999999999999994,33.0,1702,Bourbon Barrel Aged Coconut Porter,American Porter,165,16.0
931,0.062,60.0,1701,Great Crescent IPA,American IPA,165,16.0
932,0.057,27.0,1700,Aurora Lager,Dortmunder / Export Lager,165,16.0
933,0.053,22.0,1699,Great Crescent Blonde Ale,American Blonde Ale,165,16.0
934,0.055999999999999994,33.0,1269,Great Crescent Coconut Porter,American Porter,165,16.0
935,0.057,25.0,930,Great Crescent Oktoberfest Lager,Märzen / Oktoberfest,165,16.0
936,0.045,36.0,649,Great Crescent Brown Ale,American Brown Ale,165,16.0
937,0.057,18.0,639,Cherry Ale (1),Fruit / Vegetable Beer,165,16.0
938,0.057,27.0,626,Aurora Lager (2011),Dortmunder / Export Lager,165,16.0
939,0.06,25.0,615,Frosted Fields Winter Wheat,American Dark Wheat Ale,165,16.0
940,0.051,13.0,478,Great Crescent Belgian Style Wit,Witbier,165,16.0
941,0.075,65.0,455,Bourbon's Barrel Stout,American Stout,165,16.0
942,0.08,66.0,442,Great Crescent Stout,English Stout,165,16.0
943,0.055999999999999994,33.0,441,Great Crescent Coconut Porter (2012),American Porter,165,16.0
944,0.057,23.0,440,Great Crescent Dark Lager,Euro Dark Lager,165,16.0
945,0.042,26.0,439,Great Crescent Mild Ale,English Dark Mild Ale,165,16.0
946,0.062,60.0,436,Great Crescent IPA (2011),American IPA,165,16.0
947,0.053,22.0,389,Great Crescent Blonde Ale (2011),American Blonde Ale,165,16.0
948,0.05,,2650,Denver Pale Ale (Artist Series No. 1),American Pale Ale (APA),6,12.0
949,0.087,,2649,Hibernation Ale,Old Ale,6,12.0
950,0.061,,2648,Whitewater,American Pale Wheat Ale,6,12.0
951,0.071,,2647,Rumble,American IPA,6,12.0
952,0.083,,2646,Orabelle,Tripel,6,12.0
953,0.05,,2645,Lasso,American IPA,6,12.0
954,0.095,75.0,2644,Yeti  Imperial Stout,Russian Imperial Stout,6,12.0
955,0.073,,2643,Colette,Saison / Farmhouse Ale,6,12.0
956,0.071,,2642,Titan IPA,American IPA,6,12.0
957,0.045,15.0,404,Black Star Double Hopped Golden Lager (24 oz.),American Pale Lager,543,24.0
958,0.045,15.0,164,Black Star Double Hopped Golden Lager (12 oz.),American Pale Lager,543,12.0
959,0.052000000000000005,49.0,1923,Commotion APA,American Pale Ale (APA),269,12.0
960,0.052000000000000005,,1922,Southern Drawl Pale Lager,American Pale Lager,269,12.0
961,0.05,5.0,1604,Chickawawa Lemonale,Fruit / Vegetable Beer,365,12.0
962,0.07,22.0,1574,Barrel Aged Farmer,American Brown Ale,365,16.0
963,0.048,,1446,Great River Golden Ale,American Blonde Ale,365,12.0
964,0.048,,1275,Dirty Blonde Chocolate Ale,American Blonde Ale,365,12.0
965,0.048,20.0,1244,Dos Pistolas,Vienna Lager,365,12.0
966,0.05,30.0,1064,Owney Irish Style Red Ale,Irish Red Ale,365,16.0
967,0.06,,1028,Aaah Bock Lager,Vienna Lager,365,16.0
968,0.055,10.0,865,Widespread Wit,Witbier,365,16.0
969,0.054000000000000006,30.0,864,Roller Dam Red Ale,Irish Red Ale,365,16.0
970,0.053,48.0,863,483 Pale Ale,American Pale Ale (APA),365,16.0
971,0.09,99.0,672,Hop A Potamus Double Dark Rye Pale Ale,Rye Beer,365,16.0
972,0.07,22.0,655,Farmer Brown Ale,American Brown Ale,365,16.0
973,0.07,70.0,540,Big Cock IPA,American IPA,365,16.0
974,0.059000000000000004,25.0,539,Oktoberfest,Märzen / Oktoberfest,365,16.0
975,0.048,25.0,517,40th Annual Bix Street Fest Copper Ale (Current),American Amber / Red Ale,365,16.0
976,0.06,36.0,371,Redband Stout,American Stout,365,16.0
977,0.053,48.0,190,483 Pale Ale (2010),American Pale Ale (APA),365,16.0
978,0.054000000000000006,30.0,189,Roller Dam Red Ale (2010),Irish Red Ale,365,16.0
979,0.05,30.0,1106,Pablo Beach Pale Ale,American Pale Ale (APA),466,12.0
980,0.057,44.0,2314,Wild Trail Pale Ale,American Pale Ale (APA),156,12.0
981,0.067,71.0,2313,Mothman Black IPA,American Black Ale,156,12.0
982,0.057999999999999996,,2461,Autumn Winds Fest Beer,Märzen / Oktoberfest,86,16.0
983,0.085,69.0,2044,Captain's Daughter,American Double / Imperial IPA,86,12.0
984,0.057999999999999996,,1567,Autumn Winds,Märzen / Oktoberfest,379,16.0
985,0.06,54.0,1505,Flying Jenny Extra Pale Ale,American Pale Ale (APA),379,12.0
986,0.04,20.0,1186,Hazy Day Belgian-Style Wit,Witbier,379,16.0
987,0.055,,1185,Bring Back the Beach Blonde Ale,American Blonde Ale,379,16.0
988,0.06,34.0,984,Leaning Chimney Smoked Porter,American Porter,379,16.0
989,0.06,54.0,693,Flying Jenny Extra Pale Ale (2012),American Pale Ale (APA),379,12.0
990,0.049,22.0,631,Flagship Ale,Cream Ale,379,12.0
991,0.045,6.0,2375,Mr. Blue Sky,American Pale Wheat Ale,124,16.0
992,0.065,,2143,3 Scrooges,Winter Warmer,124,16.0
993,0.05,25.0,2142,Screamin’ Pumpkin,Pumpkin Ale,124,16.0
994,0.05,35.0,2141,Grand Trunk Bohemian Pils,Czech Pilsener,124,16.0
995,0.065,25.0,2140,El Rojo,American Amber / Red Ale,124,16.0
996,0.075,,2139,Norm's Raggedy Ass IPA,American IPA,124,16.0
997,0.05,35.0,2138,Grind Line,American Pale Ale (APA),124,16.0
998,0.04,55.0,2007,Norm's Gateway IPA,American IPA,124,12.0
999,0.09,,1570,Lemon Shandy Tripel,Tripel,124,16.0
1000,0.063,43.0,2339,Little Red Cap,Altbier,144,12.0
1001,0.069,67.0,1857,Supergoose IPA,American IPA,290,12.0
1002,0.047,,1440,Hale's Pale American Ale,American Pale Ale (APA),290,12.0
1003,0.07,,1753,Heyoka IPA,American IPA,327,16.0
1004,0.08,,1448,Guest Lager,American Double / Imperial Pilsner,327,16.0
1005,0.057,,1134,Pony Pilsner,German Pilsener,327,16.0
1006,0.055,,1066,Akari Shogun American Wheat Ale,American Pale Wheat Ale,327,16.0
1007,0.06,,849,Meat Wave,English India Pale Ale (IPA),327,16.0
1008,0.06,,352,Over Ale,American Brown Ale,327,16.0
1009,0.042,,149,Gossamer Golden Ale,American Blonde Ale,327,16.0
1010,0.052000000000000005,,148,Daisy Cutter Pale Ale,American Pale Ale (APA),327,16.0
1011,0.07,40.0,2026,Pursuit,American IPA,248,12.0
1012,0.052000000000000005,18.0,1361,Half Full Bright Ale,American Blonde Ale,248,12.0
1013,0.046,17.0,1016,Orange Wheat,Fruit / Vegetable Beer,476,12.0
1014,0.043,14.0,1015,Hangar 24 Helles Lager,Munich Helles Lager,476,12.0
1015,0.075,70.0,1677,The Great Return,American IPA,343,16.0
1016,0.044000000000000004,18.0,1331,Hardywood Cream Ale,Cream Ale,343,12.0
1017,0.055999999999999994,55.0,1270,Capital Trail Pale Ale,American Pale Ale (APA),343,12.0
1018,0.052000000000000005,15.0,2059,UFO Gingerland,Herbed / Spiced Beer,234,12.0
1019,0.062,45.0,1653,The Long Thaw White IPA,American White IPA,234,12.0
1020,0.048,,1558,Honey Cider,Cider,234,12.0
1021,0.05,28.0,1380,Harpoon Summer Beer,Kölsch,234,12.0
1022,0.059000000000000004,42.0,1379,Harpoon IPA,American IPA,234,12.0
1023,0.059000000000000004,20.0,1340,UFO Pumpkin,Pumpkin Ale,234,12.0
1024,0.055,30.0,1313,Harpoon Octoberfest,Märzen / Oktoberfest,234,12.0
1025,0.059000000000000004,42.0,770,Harpoon IPA (2012),American IPA,234,12.0
1026,0.05,28.0,769,Harpoon Summer Beer (2012),Kölsch,234,12.0
1027,0.048,10.0,610,UFO White,American Pale Wheat Ale,234,12.0
1028,0.05,28.0,192,Harpoon Summer Beer (2010),Kölsch,234,12.0
1029,0.059000000000000004,42.0,126,Harpoon IPA (2010),American IPA,234,12.0
1030,,,506,Great Falls Select Pale Ale,American Blonde Ale,535,12.0
1031,0.048,,181,Beltian White,Witbier,535,12.0
1032,0.049,,2183,Kaua'i Golden Ale,American Blonde Ale,204,12.0
1033,0.054000000000000006,,2182,Sunset Amber,American Pale Ale (APA),204,12.0
1034,0.064,,2181,Hapa Brown Ale,American Brown Ale,204,19.2
1035,0.064,,2180,Hapa Brown Ale,American Brown Ale,204,12.0
1036,0.083,,2179,Southern Cross,Flanders Red Ale,204,19.2
1037,0.076,65.0,1895,Groupe G,Belgian IPA,280,16.0
1038,0.062,40.0,1894,Pt. Bonita Rustic Lager,American Pale Lager,280,16.0
1039,0.08800000000000001,77.0,1893,Hill 88 Double IPA,American Double / Imperial IPA,280,16.0
1040,0.07200000000000001,45.0,990,Loose Cannon,American IPA,479,12.0
1041,0.06,30.0,989,AARGHtoberfest!,Märzen / Oktoberfest,479,12.0
1042,0.06,,988,Davy Jones Lager,Cream Ale,479,12.0
1043,0.063,30.0,1351,Grazias,Cream Ale,423,16.0
1044,0.08,86.0,1346,Habitus IPA,American IPA,423,16.0
1045,0.099,85.0,904,Ex Umbris Rye Imperial Stout,American Double / Imperial Stout,423,16.0
1046,0.063,21.0,2295,The Golden One,American Pilsner,168,12.0
1047,0.07,68.0,2294,The Power of Zeus,American Pale Ale (APA),168,12.0
1048,0.044000000000000004,22.0,824,Tonganoxie Honey Wheat,American Pale Wheat Ale,500,12.0
1049,0.045,,616,Oregon Trail Unfiltered Raspberry Wheat,Fruit / Vegetable Beer,500,12.0
1050,0.055,,96,Annie's Amber Ale,American Amber / Red Ale,500,12.0
1051,0.045,32.0,1615,The 12th Can™,American Pale Ale (APA),362,16.0
1052,0.055,34.0,889,Hilliard's Pils,Czech Pilsener,362,16.0
1053,0.049,20.0,724,Hilliard's Blonde,American Blonde Ale,362,16.0
1054,0.055,60.0,497,Hilliard's Amber Ale,American Amber / Red Ale,362,16.0
1055,0.066,30.0,496,Hilliard's Saison,Saison / Farmhouse Ale,362,16.0
1056,0.042,,1652,White Cap White IPA,American White IPA,349,16.0
1057,0.042,25.0,1835,Provision,Saison / Farmhouse Ale,297,12.0
1058,0.047,28.0,1834,One Nut Brown,American Brown Ale,297,12.0
1059,0.057999999999999996,45.0,1833,Hop Farm IPA,American IPA,297,12.0
1060,0.049,20.0,2195,Double D Blonde,American Blonde Ale,198,12.0
1061,0.078,60.0,1605,Festeroo Winter Ale,American Strong Ale,198,12.0
1062,0.063,70.0,1543,Proxima IPA,American IPA,198,12.0
1063,0.049,20.0,1390,Double D Blonde (2013),American Blonde Ale,198,12.0
1064,0.048,13.0,1354,541 American Lager,American Pale Lager,198,12.0
1065,0.065,90.0,1353,Alphadelic IPA,American IPA,198,12.0
1066,0.065,90.0,499,Alphadelic IPA (2011),American IPA,198,12.0
1067,0.049,20.0,498,Double D Blonde (2011),American Blonde Ale,198,12.0
1068,0.07,,1501,Green House India Pale Ale,American IPA,395,12.0
1069,0.051,,1004,The One They Call Zoe,American Pale Lager,395,12.0
1070,0.051,40.0,502,Alteration,Altbier,395,12.0
1071,0.06,50.0,501,Pale Dog,American Pale Ale (APA),395,12.0
1072,0.065,,2357,Porter Culture,American Porter,136,12.0
1073,0.068,,2483,Hard Cider,Cider,80,16.0
1074,0.027000000000000003,21.0,2482,Totally Radler,Radler,80,16.0
1075,0.039,20.0,2400,Nonstop Hef Hop,American Pale Wheat Ale,80,16.0
1076,0.039,20.0,2399,Nonstop Hef Hop,American Pale Wheat Ale,80,16.0
1077,0.039,20.0,2398,Nonstop Hef Hop,American Pale Wheat Ale,80,16.0
1078,0.039,20.0,2397,Nonstop Hef Hop,American Pale Wheat Ale,80,16.0
1079,0.039,20.0,2396,Nonstop Hef Hop,American Pale Wheat Ale,80,16.0
1080,0.039,20.0,2395,Nonstop Hef Hop,American Pale Wheat Ale,80,16.0
1081,0.039,20.0,2394,Nonstop Hef Hop,American Pale Wheat Ale,80,16.0
1082,0.039,20.0,2393,Nonstop Hef Hop,American Pale Wheat Ale,80,16.0
1083,0.039,20.0,2392,Nonstop Hef Hop,American Pale Wheat Ale,80,16.0
1084,0.039,20.0,2391,Nonstop Hef Hop,American Pale Wheat Ale,80,16.0
1085,0.039,20.0,2390,Nonstop Hef Hop,American Pale Wheat Ale,80,16.0
1086,0.039,20.0,2389,Nonstop Hef Hop,American Pale Wheat Ale,80,16.0
1087,0.057999999999999996,60.0,2388,Rise Up Red,American Amber / Red Ale,80,16.0
1088,0.057999999999999996,35.0,2200,Survival Stout,American Stout,80,16.0
1089,0.066,75.0,2199,Hopworks IPA,American IPA,80,16.0
1090,0.073,70.0,2193,Abominable Winter Ale,American Strong Ale,80,16.0
1091,0.06,60.0,1398,Pigwar White India Pale Ale,American White IPA,80,16.0
1092,0.057999999999999996,60.0,1085,Rise-Up Red (2014),American Amber / Red Ale,80,16.0
1093,0.073,70.0,916,Abominable Winter Ale (2012),American Strong Ale,80,16.0
1094,0.051,32.0,658,HUB Lager,Czech Pilsener,80,16.0
1095,0.066,75.0,653,Hopworks IPA (2012),American IPA,80,16.0
1096,0.055999999999999994,,2385,Watermelon Wheat,American Pale Wheat Ale,120,12.0
1097,0.051,17.0,2384,Laka Laka Pineapple,Hefeweizen,120,12.0
1098,0.06,,2383,Oktoberfest,Märzen / Oktoberfest,120,16.0
1099,0.065,,1251,Trail Maker Pale Ale,American Pale Ale (APA),445,12.0
1100,0.055,,1250,Action Man Lager,Vienna Lager,445,12.0
1101,0.068,90.0,1903,Let It Ride IPA,American IPA,277,12.0
1102,0.065,22.0,1691,Stir Crazy Winter Ale,Winter Warmer,277,12.0
1103,0.05,10.0,1555,Sweet Yamma Jamma Ale,Fruit / Vegetable Beer,277,12.0
1104,0.046,27.0,1115,Shenanigans Summer Ale,American Pale Wheat Ale,277,12.0
1105,0.065,80.0,729,Midnight Ryder,American Black Ale,277,12.0
1106,0.054000000000000006,45.0,728,Day Tripper Pale Ale,American Pale Ale (APA),277,12.0
1107,0.048,32.0,2350,Oklahoma Suks,American Amber / Red Ale,140,12.0
1108,0.055,42.0,2301,Power & Light,American Pale Ale (APA),140,12.0
1109,0.059000000000000004,27.0,1904,White Rabbit ,Witbier,140,12.0
1110,0.057999999999999996,58.0,2609,Tribute,American Pale Ale (APA),23,12.0
1111,0.07,75.0,2038,Infamous IPA,American IPA,242,12.0
1112,0.055,20.0,1774,Hijack,Cream Ale,242,12.0
1113,0.045,20.0,559,Jon Boat Coastal Ale,American Blonde Ale,527,12.0
1114,0.068,55.0,558,I-10 IPA,American IPA,527,12.0
1115,0.053,28.0,553,People's Pale Ale,American Pale Ale (APA),527,12.0
1116,0.049,,2376,Summer Ale,American Blonde Ale,123,12.0
1117,,,1784,Appreciation Ale,American IPA,316,16.0
1118,0.052000000000000005,18.0,2673,House Lager,Keller Bier / Zwickel Bier,2,16.0
1119,0.048,15.0,2672,Leisure Time,American Pale Lager,2,12.0
1120,0.07200000000000001,80.0,2671,Excess IPL,American India Pale Lager,2,16.0
1121,0.067,65.0,2670,Hoponius Union,American India Pale Lager,2,12.0
1122,0.049,45.0,2669,Calyptra,American India Pale Lager,2,12.0
1123,0.05,,1405,Helen's Blend,Cider,416,12.0
1124,0.051,,823,Jack's Hard Cider,Cider,416,12.0
1125,0.055,37.0,1793,Thunder Ann,American Pale Ale (APA),312,12.0
1126,0.055,,2453,Razz Wheat,Fruit / Vegetable Beer,92,12.0
1127,0.065,,2363,Hop Ryot,American IPA,92,12.0
1128,0.07,,689,Mystic Mama IPA,American IPA,92,12.0
1129,0.05,,688,Firefly Amber Ale,American Amber / Red Ale,92,12.0
1130,0.067,,687,Chomolungma Honey Nut Brown Ale,English Brown Ale,92,12.0
1131,0.069,,2408,Welcome to Scoville,American IPA,114,12.0
1132,,,2595,Bastian,American Strong Ale,32,12.0
1133,0.045,,2480,Healani,Hefeweizen,32,12.0
1134,0.055,,1525,Yabba Dhaba Chai Tea Porter,American Porter,32,12.0
1135,0.055,,1524,A Capella Gluten Free Pale Ale,American Pale Ale (APA),32,12.0
1136,0.06,,1523,Casper White Stout,American Blonde Ale,32,12.0
1137,0.06,,1254,JP's Ould Sod Irish Red IPA,American IPA,32,12.0
1138,0.05,15.0,2060,Weize Guy,Hefeweizen,233,12.0
1139,0.05,50.0,469,Fox Tail Gluten Free Ale,American Pale Ale (APA),233,12.0
1140,0.09300000000000001,90.0,468,Hop Box Imperial IPA,American Double / Imperial IPA,233,12.0
1141,0.052000000000000005,15.0,467,Joseph James American Lager,American Adjunct Lager,233,12.0
1142,0.071,,2163,Sucha Much IPA,American IPA,208,12.0
1143,0.075,24.0,2162,Lewbricator Wheat Dopplebock ,Doppelbock,208,12.0
1144,0.052000000000000005,16.0,2374,Weisse Versa (2012),Hefeweizen,125,12.0
1145,0.057999999999999996,25.0,1560,Mother in Lager,Munich Dunkel Lager,125,12.0
1146,0.055,40.0,1557,Weekend Warrior Pale Ale,American Pale Ale (APA),125,12.0
1147,0.055,25.0,1458,Karbachtoberfest,Märzen / Oktoberfest,125,12.0
1148,0.047,20.0,1235,Love Street Summer Seasonal (2014),Kölsch,125,12.0
1149,0.066,20.0,1068,Barn Burner Saison,Saison / Farmhouse Ale,125,12.0
1150,0.095,85.0,666,Rodeo Clown Double IPA,American Double / Imperial IPA,125,12.0
1151,0.049,45.0,465,Sympathy for the Lager,American Amber / Red Lager,125,12.0
1152,0.052000000000000005,15.0,464,Weisse Versa,Hefeweizen,125,12.0
1153,0.066,70.0,463,Hopadillo India Pale Ale,American IPA,125,12.0
1154,0.057,19.0,1678,KelSo Nut Brown Lager,Euro Dark Lager,342,12.0
1155,0.06,64.0,1572,KelSo India Pale Ale,American IPA,342,12.0
1156,0.055,23.0,1348,KelSo Pilsner,Czech Pilsener,342,12.0
1157,0.057999999999999996,,1193,Skilak Scottish Ale,Scottish Ale,458,12.0
1158,0.05,15.0,1187,Peninsula Brewers Reserve (PBR),American Blonde Ale,458,12.0
1159,0.068,,349,Sunken Island IPA,American IPA,458,12.0
1160,0.057999999999999996,,348,Skilak Scottish Ale (2011),Scottish Ale,458,12.0
1161,0.065,11.0,760,Cold Smoke Scotch Ale (2007),Scotch Ale / Wee Heavy,510,16.0
1162,0.065,65.0,759,Double Haul IPA (2009),American IPA,510,16.0
1163,0.065,65.0,758,Double Haul IPA (2006),American IPA,510,16.0
1164,0.055,50.0,87,Eddy Out Pale Ale,American Pale Ale (APA),510,16.0
1165,0.065,65.0,86,Double Haul IPA,American IPA,510,16.0
1166,0.065,11.0,85,Cold Smoke Scotch Ale,Scotch Ale / Wee Heavy,510,16.0
1167,,,2472,U. P. Witbier,Witbier,84,12.0
1168,,,779,November Gale Pale Ale,American Pale Ale (APA),84,12.0
1169,,,364,Olde Ore Dock Scottish Ale,Scottish Ale,84,12.0
1170,,,60,Widow Maker Black Ale,American Brown Ale,84,12.0
1171,,,59,Lift Bridge Brown Ale,American Brown Ale,84,12.0
1172,,,58,Pick Axe Blonde Ale,American Blonde Ale,84,12.0
1173,,,57,Red Jacket Amber Ale,American Amber / Red Ale,84,12.0
1174,0.051,,2436,Amber Ale,American Amber / Red Ale,102,12.0
1175,0.055,,1706,King Street Pilsner,Czech Pilsener,102,12.0
1176,0.06,70.0,1667,King Street IPA,American IPA,102,12.0
1177,0.057,10.0,1666,King Street Hefeweizen,Hefeweizen,102,12.0
1178,0.049,,1665,King Street Blonde Ale,American Blonde Ale,102,12.0
1179,0.063,65.0,2460,India Pale Ale,American IPA,87,16.0
1180,0.048,11.0,2459,Blackberry Wheat,American Pale Wheat Ale,87,16.0
1181,0.046,18.0,1274,Longboard Island Lager,American Amber / Red Lager,439,24.0
1182,0.046,18.0,1220,Longboard Island Lager,American Amber / Red Lager,439,16.0
1183,0.046,18.0,1070,Longboard Island Lager,American Amber / Red Lager,439,12.0
1184,0.046,18.0,590,Longboard Island Lager,American Amber / Red Lager,439,12.0
1185,0.04,9.0,781,Choc Beer (2003),American Dark Wheat Ale,505,12.0
1186,0.08,,1637,Bellingham Beer Week 2013 Collaboration,Belgian Strong Dark Ale,354,16.0
1187,0.054000000000000006,15.0,1741,A Slice of Hefen,Hefeweizen,332,16.0
1188,0.07200000000000001,100.0,664,Elevated IPA,American IPA,332,16.0
1189,0.066,30.0,392,Rumspringa Golden Bock,Maibock / Helles Bock,545,12.0
1190,0.048,28.0,195,Lancaster German Style Kölsch,Kölsch,545,12.0
1191,0.045,,2547,Beach Cruiser,Hefeweizen,59,12.0
1192,0.068,,2493,I.P. Eh!,American IPA,59,12.0
1193,0.05,,2492,Schoolhouse Honey,American Amber / Red Ale,59,12.0
1194,0.055,,2491,10 Degrees of Separation,English Brown Ale,59,12.0
1195,0.05,12.0,2108,Laughing Dog Cream Ale,Cream Ale,218,12.0
1196,0.048,9.0,1397,Two-One Niner,American Pilsner,218,12.0
1197,0.064,66.0,1396,Laughing Dog IPA,American IPA,218,12.0
1198,0.064,95.0,1675,Madra Allta,American IPA,345,12.0
1199,0.055999999999999994,70.0,1249,Duluchan India Pale Ale,American IPA,345,12.0
1200,0.05,,1445,Lazy Monk Bohemian Pilsner,Czech Pilsener,406,16.0
1201,0.051,,475,Yellowstone Golden Ale,Kölsch,537,12.0
1202,0.057,,474,Tumbleweed IPA,American IPA,537,12.0
1203,0.05,,473,Lewis & Clark Amber Ale,American Amber / Red Ale,537,12.0
1204,0.05,,472,Miner's Gold Hefeweizen,Hefeweizen,537,12.0
1205,0.057,,471,Back Country Scottish Ale,Scottish Ale,537,12.0
1206,0.052000000000000005,30.0,2036,Getaway,German Pilsener,244,16.0
1207,0.06,30.0,1168,Farm Girl Saison,Saison / Farmhouse Ale,244,16.0
1208,0.057999999999999996,40.0,1832,Adam's Stout,American Stout,298,12.0
1209,0.057,42.0,1688,American Hero,American Amber / Red Ale,298,12.0
1210,0.052000000000000005,20.0,1687,Schweet Ale,Fruit / Vegetable Beer,298,12.0
1211,0.065,75.0,1686,Irregardless IPA,American IPA,298,12.0
1212,0.057,40.0,2434,Peach Pale Ale,American Pale Ale (APA),104,12.0
1213,0.06,,2332,Deadeye Jack,American Porter,149,12.0
1214,0.075,,2330,Pistols at Dawn,American Stout,149,16.0
1215,0.057,47.0,2329,Peacemaker Pale Ale,American Pale Ale (APA),149,12.0
1216,0.057999999999999996,11.0,2327,Shotgun Betty,Hefeweizen,149,12.0
1217,0.061,30.0,2326,Sweet Josie,American Brown Ale,149,12.0
1218,0.059000000000000004,42.0,1926,Long Trail IPA,English India Pale Ale (IPA),268,12.0
1219,0.046,30.0,1924,Long Trail Ale,American Amber / Red Ale,268,12.0
1220,0.07200000000000001,33.0,1090,Double Bag,Altbier,268,16.0
1221,0.04,8.0,574,Blackbeary Wheat,Fruit / Vegetable Beer,268,12.0
1222,0.046,30.0,573,Long Trail Ale (1),Altbier,268,12.0
1223,0.046,8.0,2584,Gose,Gose,41,16.0
1224,0.048,20.0,2583,Vermont Pilsner,German Pilsener,41,16.0
1225,0.055,,2582,Mosaic Single Hop IPA,American IPA,41,16.0
1226,0.045,,2581,Lost Galaxy,American IPA,41,16.0
1227,0.062,65.0,1309,Face Plant IPA,American IPA,430,12.0
1228,0.055999999999999994,55.0,1308,Rhino Chasers Pilsner,Czech Pilsener,430,12.0
1229,0.052000000000000005,29.0,1571,Slow Hand Stout,American Stout,377,16.0
1230,0.062,,1204,Hips Don't Lie,Hefeweizen,456,16.0
1231,0.052000000000000005,,1122,Ride Again Pale Ale,American Pale Ale (APA),456,16.0
1232,0.048,,700,The Farmer's Daughter,American Blonde Ale,456,16.0
1233,0.038,18.0,2033,Pub Ale,English Dark Mild Ale,245,12.0
1234,0.051,31.0,2032,Ballistic Blonde,Belgian Pale Ale,245,12.0
1235,0.054000000000000006,,2311,Knotty Pine,American Pale Ale (APA),158,12.0
1236,0.053,20.0,1153,Lumberyard Pilsner,American Pilsner,158,12.0
1237,0.061,,355,Lumberyard IPA,American IPA,158,12.0
1238,0.057999999999999996,,125,Lumberyard Red Ale,American Amber / Red Ale,158,12.0
1239,0.05,,962,Mac's Highlander Pale Ale (2000),American Pale Ale (APA),485,12.0
1240,0.051,32.0,961,Mac's Scottish Style Amber Ale (2000),American Amber / Red Ale,485,12.0
1241,0.05,,1475,Macon Progress Ale,American Pale Ale (APA),400,12.0
1242,0.055,,1008,Macon History Ale,American Brown Ale,400,12.0
1243,0.099,,2454,Galaxy High,American Double / Imperial IPA,91,12.0
1244,0.043,18.0,2209,Sol Drifter,American Blonde Ale,91,12.0
1245,0.085,,2133,Thunder Snow,Winter Warmer,91,12.0
1246,0.079,18.0,1994,The Great Pumpcan,Fruit / Vegetable Beer,91,16.0
1247,0.047,11.0,1816,LIFT,Kölsch,91,12.0
1248,0.05,40.0,1815,SPRYE,American Pale Ale (APA),91,12.0
1249,0.069,70.0,1126,Psychopathy,American IPA,91,12.0
1250,0.07,32.0,1125,Gnarly Brown,American Brown Ale,91,12.0
1251,0.06,30.0,1124,Happy Amber,American Amber / Red Ale,91,12.0
1252,0.051,20.0,1813,#9,Fruit / Vegetable Beer,303,16.0
1253,0.055,13.0,1113,Elder Betty,Hefeweizen,303,12.0
1254,0.051,20.0,360,#9,Fruit / Vegetable Beer,303,12.0
1255,0.042,,511,High Country Pilsner (Current),German Pilsener,534,12.0
1256,0.065,,75,Epic IPA,American IPA,534,12.0
1257,0.042,,74,Golden Trout Pilsner,German Pilsener,534,12.0
1258,0.045,,73,Real McCoy Amber Ale (Current),American Amber / Red Ale,534,12.0
1259,0.07200000000000001,,1628,Festivus (1),Winter Warmer,356,12.0
1260,0.067,,1626,Manayunk Oktoberfest,Märzen / Oktoberfest,356,12.0
1261,0.045,21.0,1625,Belgian Style Session Ale,Belgian Pale Ale,356,12.0
1262,0.055,,1624,Manayunk IPA,American IPA,356,12.0
1263,0.055,,1600,Yunkin' Punkin',Pumpkin Ale,356,12.0
1264,0.05,18.0,1484,Summer Paradise,American Pale Wheat Ale,356,12.0
1265,0.09,30.0,1356,Monk from the 'Yunk,Tripel,356,12.0
1266,0.06,14.0,1355,Schuylkill Punch,Fruit / Vegetable Beer,356,12.0
1267,0.085,85.0,1334,Dreamin' Double IPA,American Double / Imperial IPA,356,12.0
1268,0.099,93.0,1674,Chaotic Double IPA,American Double / Imperial IPA,346,12.0
1269,0.08,88.0,1673,Manzanita IPA,American IPA,346,12.0
1270,0.06,25.0,1672,Riverwalk Blonde Ale,American Blonde Ale,346,12.0
1271,0.095,49.0,1671,Gillespie Brown Ale,American Brown Ale,346,12.0
1272,0.066,44.0,1670,Manzanita Pale Ale,American Pale Ale (APA),346,12.0
1273,0.047,,1262,Marble Pilsner,German Pilsener,443,12.0
1274,0.062,,845,Marble India Pale Ale,American IPA,443,12.0
1275,0.07200000000000001,,1783,Toughcats IPA,American IPA,317,16.0
1276,0.05,,1717,Tug Pale Ale,American Pale Ale (APA),317,16.0
1277,0.099,,1716,Sexy Chaos,Russian Imperial Stout,317,16.0
1278,0.063,,1516,Ace Hole American Pale Ale,American Pale Ale (APA),317,16.0
1279,0.09699999999999999,,725,Cant Dog Imperial Pale Ale,American Double / Imperial IPA,317,16.0
1280,0.05,20.0,2308,River House,Saison / Farmhouse Ale,161,16.0
1281,0.065,47.0,2268,Pretzel Stout,American Stout,161,16.0
1282,0.05,35.0,2197,Rubberneck Red,American Amber / Red Ale,161,16.0
1283,0.08,,2120,The Imperial Texan,American Double / Imperial IPA,161,16.0
1284,0.08,,1234,The Imperial Texan,American Double / Imperial IPA,161,12.0
1285,0.05,,1233,Day Break 4-Grain Breakfast Beer,Rye Beer,161,16.0
1286,0.05,,1232,River House Saison,Saison / Farmhouse Ale,161,12.0
1287,0.065,,1231,There Will Be Stout,American Stout,161,12.0
1288,0.065,60.0,1831,Our Legacy IPA,American IPA,299,12.0
1289,0.042,,1359,Saranac Shandy,Shandy,299,12.0
1290,0.065,60.0,1135,Our Legacy IPA,American IPA,299,16.0
1291,0.051,,960,Saranac Golden Pilsener (2003),German Pilsener,299,12.0
1292,0.045,,959,Saranac Adirondack Light (2002),Light Lager,299,12.0
1293,0.045,,958,DAX Light (1998),Light Lager,299,12.0
1294,0.048,,957,Saranac Traditional Lager (2000),American Pale Lager,299,12.0
1295,0.047,,956,Pomegranate Wheat (2008),Fruit / Vegetable Beer,299,12.0
1296,0.05,12.0,773,Blueberry Blonde Ale,American Blonde Ale,299,12.0
1297,0.06,,686,Saranac White IPA,American IPA,299,12.0
1298,0.047,,453,Saranac Summer Ale (2011),American Pale Wheat Ale,299,12.0
1299,0.055,,150,Saranac Pale Ale (12 oz.),English Pale Ale,299,12.0
1300,0.055,,133,Saranac Pale Ale (16 oz.),English Pale Ale,299,16.0
1301,0.051,20.0,1578,Lahaina Town Brown,American Brown Ale,375,12.0
1302,0.055,,1429,Pau Hana Pilsner,Czech Pilsener,375,12.0
1303,0.05,,1271,Lemongrass Saison,Saison / Farmhouse Ale,375,12.0
1304,0.07,,713,Aloha B’ak’tun,Belgian Strong Dark Ale,375,12.0
1305,0.08199999999999999,,712,Liquid Breadfruit,Fruit / Vegetable Beer,375,12.0
1306,0.06,24.0,690,Sobrehumano Palena'ole,American Amber / Red Ale,375,12.0
1307,0.05,12.0,547,La Perouse White,Witbier,375,12.0
1308,0.068,68.0,435,Flyin' HI.P.Hay,American IPA,375,12.0
1309,0.055,15.0,313,Mana Wheat,American Pale Wheat Ale,375,12.0
1310,0.045,18.0,33,Bikini Blonde Lager,Munich Helles Lager,375,12.0
1311,0.057,30.0,32,CoCoNut Porter,American Porter,375,12.0
1312,0.062,65.0,31,Big Swell IPA,American IPA,375,12.0
1313,0.037000000000000005,34.0,1237,Pit Stop Chocolate Porter,American Porter,448,12.0
1314,0.037000000000000005,21.0,1236,Pace Setter Belgian Style Wit,Witbier,448,12.0
1315,0.037000000000000005,53.0,1047,Back in the Saddle Rye Pale Ale,American Pale Ale (APA),448,12.0
1316,0.069,,1986,Bushwhacker Cider,Cider,254,16.0
1317,0.069,,1985,Weim-R-Iner,Cider,254,16.0
1318,0.069,,1984,C
Download .txt
gitextract_hqj_qnqk/

├── .github/
│   └── workflows/
│       ├── build.yml
│       ├── cache.yml
│       ├── early-access.yml
│       ├── publish.yml
│       ├── release.yml
│       ├── step-jlink.yml
│       ├── step-precheck.yml
│       └── trigger-early-access.yml
├── .gitignore
├── LICENSE
├── README.adoc
├── VERSION
├── build.gradle
├── core/
│   ├── riot-core/
│   │   ├── gradle.properties
│   │   ├── riot-core.gradle
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── redis/
│   │       │   │           └── riot/
│   │       │   │               └── core/
│   │       │   │                   ├── AbstractCallableCommand.java
│   │       │   │                   ├── AbstractJobCommand.java
│   │       │   │                   ├── BaseCommand.java
│   │       │   │                   ├── CompositeExecutionStrategy.java
│   │       │   │                   ├── Expression.java
│   │       │   │                   ├── IO.java
│   │       │   │                   ├── LoggingMixin.java
│   │       │   │                   ├── MainCommand.java
│   │       │   │                   ├── NoopItemWriter.java
│   │       │   │                   ├── PrintExceptionMessageHandler.java
│   │       │   │                   ├── ProcessingItemWriter.java
│   │       │   │                   ├── ProgressArgs.java
│   │       │   │                   ├── ProgressStepExecutionListener.java
│   │       │   │                   ├── ProgressStyle.java
│   │       │   │                   ├── QuietMapAccessor.java
│   │       │   │                   ├── RetryPolicy.java
│   │       │   │                   ├── RiotDuration.java
│   │       │   │                   ├── RiotException.java
│   │       │   │                   ├── RiotUtils.java
│   │       │   │                   ├── RiotVersion.java
│   │       │   │                   ├── SkipPolicy.java
│   │       │   │                   ├── Step.java
│   │       │   │                   ├── StepArgs.java
│   │       │   │                   ├── StepConfiguration.java
│   │       │   │                   ├── TemplateExpression.java
│   │       │   │                   ├── ThrottledItemWriter.java
│   │       │   │                   └── processor/
│   │       │   │                       ├── CollectionToMapFunction.java
│   │       │   │                       ├── ConsumerUnaryOperator.java
│   │       │   │                       ├── FieldExtractorFactory.java
│   │       │   │                       ├── FunctionPredicate.java
│   │       │   │                       ├── IdFunctionBuilder.java
│   │       │   │                       ├── MapFilteringFunction.java
│   │       │   │                       ├── MapFlatteningFunction.java
│   │       │   │                       ├── ObjectToDoubleFunction.java
│   │       │   │                       ├── ObjectToLongFunction.java
│   │       │   │                       ├── ObjectToStringFunction.java
│   │       │   │                       ├── PredicateOperator.java
│   │       │   │                       ├── RegexNamedGroupFunction.java
│   │       │   │                       └── StringToMapFunction.java
│   │       │   └── resources/
│   │       │       └── com/
│   │       │           └── redis/
│   │       │               └── riot/
│   │       │                   └── core/
│   │       │                       └── RiotVersion.properties
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── redis/
│   │           │           └── riot/
│   │           │               └── core/
│   │           │                   └── ConverterTests.java
│   │           └── resources/
│   │               ├── beers1.csv
│   │               └── beers2.csv
│   ├── riot-faker/
│   │   ├── gradle.properties
│   │   ├── riot-faker.gradle
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── redis/
│   │       │               └── riot/
│   │       │                   └── faker/
│   │       │                       └── FakerItemReader.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── redis/
│   │                       └── riot/
│   │                           └── faker/
│   │                               └── FakerReaderTests.java
│   ├── riot-file/
│   │   ├── gradle.properties
│   │   ├── riot-file.gradle
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── redis/
│   │       │               └── riot/
│   │       │                   └── file/
│   │       │                       ├── AbstractReaderFactory.java
│   │       │                       ├── AbstractWriterFactory.java
│   │       │                       ├── DelimitedReaderFactory.java
│   │       │                       ├── DelimitedWriterFactory.java
│   │       │                       ├── FileOptions.java
│   │       │                       ├── FileReaderRegistry.java
│   │       │                       ├── FileReaderResult.java
│   │       │                       ├── FileWriterRegistry.java
│   │       │                       ├── FileWriterResult.java
│   │       │                       ├── FixedWidthReaderFactory.java
│   │       │                       ├── FormattedWriterFactory.java
│   │       │                       ├── GoogleStorageOptions.java
│   │       │                       ├── GoogleStorageProtocolResolver.java
│   │       │                       ├── HeaderCallbackHandler.java
│   │       │                       ├── JsonLineAggregator.java
│   │       │                       ├── JsonLinesReaderFactory.java
│   │       │                       ├── JsonLinesWriterFactory.java
│   │       │                       ├── JsonReaderFactory.java
│   │       │                       ├── JsonWriterFactory.java
│   │       │                       ├── MapFieldSetMapper.java
│   │       │                       ├── NamedInputStreamResource.java
│   │       │                       ├── ObjectMapperLineMapper.java
│   │       │                       ├── OutputStreamResource.java
│   │       │                       ├── ReadOptions.java
│   │       │                       ├── ReaderFactory.java
│   │       │                       ├── ResourceFactory.java
│   │       │                       ├── ResourceMap.java
│   │       │                       ├── RiotResourceLoader.java
│   │       │                       ├── RiotResourceMap.java
│   │       │                       ├── RuntimeIOException.java
│   │       │                       ├── S3Options.java
│   │       │                       ├── S3ProtocolResolver.java
│   │       │                       ├── StdInProtocolResolver.java
│   │       │                       ├── StdOutProtocolResolver.java
│   │       │                       ├── SystemInResource.java
│   │       │                       ├── SystemOutResource.java
│   │       │                       ├── UncustomizedUrlResource.java
│   │       │                       ├── WriteOptions.java
│   │       │                       ├── WriterFactory.java
│   │       │                       ├── XmlReaderFactory.java
│   │       │                       ├── XmlWriterFactory.java
│   │       │                       └── xml/
│   │       │                           ├── XmlItemReader.java
│   │       │                           ├── XmlItemReaderBuilder.java
│   │       │                           ├── XmlObjectReader.java
│   │       │                           ├── XmlResourceItemWriter.java
│   │       │                           └── XmlResourceItemWriterBuilder.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── redis/
│   │                       └── riot/
│   │                           └── file/
│   │                               └── ReaderTests.java
│   └── riot-test/
│       ├── gradle.properties
│       ├── riot-test.gradle
│       └── src/
│           └── main/
│               └── java/
│                   └── com/
│                       └── redis/
│                           └── riot/
│                               └── test/
│                                   └── AbstractRiotTestBase.java
├── docs/
│   ├── LICENSE
│   └── guide/
│       ├── gradle.properties
│       ├── guide.gradle
│       └── src/
│           └── docs/
│               ├── asciidoc/
│               │   ├── _links.adoc
│               │   ├── changelog.adoc
│               │   ├── concepts.adoc
│               │   ├── cookbook.adoc
│               │   ├── databases.adoc
│               │   ├── datagen.adoc
│               │   ├── elasticache.adoc
│               │   ├── export.adoc
│               │   ├── faq.adoc
│               │   ├── files.adoc
│               │   ├── import.adoc
│               │   ├── index.adoc
│               │   ├── install.adoc
│               │   ├── introduction.adoc
│               │   ├── ping.adoc
│               │   ├── replication.adoc
│               │   └── usage.adoc
│               └── resources/
│                   ├── images/
│                   │   └── Diagrams.drawio
│                   ├── order.json
│                   └── redis-dump.json
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── jreleaser.yml
├── plugins/
│   ├── LICENSE
│   └── riot/
│       ├── gradle.properties
│       ├── riot.gradle
│       └── src/
│           ├── main/
│           │   ├── java/
│           │   │   └── com/
│           │   │       └── redis/
│           │   │           └── riot/
│           │   │               ├── AbstractCompareCommand.java
│           │   │               ├── AbstractExportCommand.java
│           │   │               ├── AbstractFileExport.java
│           │   │               ├── AbstractFileImport.java
│           │   │               ├── AbstractImportCommand.java
│           │   │               ├── AbstractRedisCommand.java
│           │   │               ├── AbstractRedisExportCommand.java
│           │   │               ├── AbstractRedisImportCommand.java
│           │   │               ├── AbstractRedisTargetExportCommand.java
│           │   │               ├── Compare.java
│           │   │               ├── CompareLoggingWriteListener.java
│           │   │               ├── CompareMode.java
│           │   │               ├── CompareStepListener.java
│           │   │               ├── ContentType.java
│           │   │               ├── DataSourceArgs.java
│           │   │               ├── DatabaseExport.java
│           │   │               ├── DatabaseImport.java
│           │   │               ├── DatabaseReaderArgs.java
│           │   │               ├── EvaluationContextArgs.java
│           │   │               ├── ExportStepHelper.java
│           │   │               ├── ExpressionProcessor.java
│           │   │               ├── FakerImport.java
│           │   │               ├── FileArgs.java
│           │   │               ├── FileExport.java
│           │   │               ├── FileImport.java
│           │   │               ├── FileReaderArgs.java
│           │   │               ├── FileTypeArgs.java
│           │   │               ├── FileWriterArgs.java
│           │   │               ├── Generate.java
│           │   │               ├── GenerateArgs.java
│           │   │               ├── GoogleStorageArgs.java
│           │   │               ├── ImportProcessorArgs.java
│           │   │               ├── JdbcCursorItemReaderFactory.java
│           │   │               ├── KeyFilterArgs.java
│           │   │               ├── KeyValueDeserializer.java
│           │   │               ├── KeyValueFilter.java
│           │   │               ├── KeyValueProcessorArgs.java
│           │   │               ├── MemoryUsageArgs.java
│           │   │               ├── Ping.java
│           │   │               ├── PingExecution.java
│           │   │               ├── PingExecutionItemReader.java
│           │   │               ├── RangeConverter.java
│           │   │               ├── ReadFrom.java
│           │   │               ├── RedisArgs.java
│           │   │               ├── RedisClientArgs.java
│           │   │               ├── RedisContext.java
│           │   │               ├── RedisReaderArgs.java
│           │   │               ├── RedisReaderLiveArgs.java
│           │   │               ├── RedisURIConverter.java
│           │   │               ├── RedisWriterArgs.java
│           │   │               ├── Replicate.java
│           │   │               ├── ReplicateReadLogger.java
│           │   │               ├── ReplicateWriteLogger.java
│           │   │               ├── Riot.java
│           │   │               ├── RiotMainCommand.java
│           │   │               ├── S3Args.java
│           │   │               ├── SourceRedisArgs.java
│           │   │               ├── TargetRedisArgs.java
│           │   │               ├── ToMapFunction.java
│           │   │               ├── Versions.java
│           │   │               ├── function/
│           │   │               │   ├── HashToMapFunction.java
│           │   │               │   ├── KeyValueMap.java
│           │   │               │   ├── MapToFieldFunction.java
│           │   │               │   ├── ObjectMapperFunction.java
│           │   │               │   ├── StreamItemProcessor.java
│           │   │               │   ├── StreamToMapFunction.java
│           │   │               │   ├── StringKeyValue.java
│           │   │               │   ├── TimeSeriesToMapFunction.java
│           │   │               │   ├── ToGeoValue.java
│           │   │               │   ├── ToSample.java
│           │   │               │   ├── ToScoredValue.java
│           │   │               │   ├── ToStringKeyValue.java
│           │   │               │   ├── ToSuggestion.java
│           │   │               │   └── ZsetToMapFunction.java
│           │   │               └── operation/
│           │   │                   ├── AbstractMemberOperationCommand.java
│           │   │                   ├── AbstractOperationCommand.java
│           │   │                   ├── DelCommand.java
│           │   │                   ├── ExpireCommand.java
│           │   │                   ├── ExpireTtlArgs.java
│           │   │                   ├── FieldFilterArgs.java
│           │   │                   ├── GeoaddCommand.java
│           │   │                   ├── HsetCommand.java
│           │   │                   ├── JsonSetCommand.java
│           │   │                   ├── LpushCommand.java
│           │   │                   ├── MemberOperationArgs.java
│           │   │                   ├── OperationCommand.java
│           │   │                   ├── RpushCommand.java
│           │   │                   ├── SaddCommand.java
│           │   │                   ├── ScoreArgs.java
│           │   │                   ├── SetCommand.java
│           │   │                   ├── SugaddCommand.java
│           │   │                   ├── TsAddCommand.java
│           │   │                   ├── XaddCommand.java
│           │   │                   └── ZaddCommand.java
│           │   └── resources/
│           │       └── com/
│           │           └── redis/
│           │               └── riot/
│           │                   └── banner.txt
│           └── test/
│               ├── java/
│               │   └── com/
│               │       └── redis/
│               │           └── riot/
│               │               ├── AbstractRiotApplicationTestBase.java
│               │               ├── DbTests.java
│               │               ├── FileTests.java
│               │               ├── KeyValueSerdeTests.java
│               │               ├── PostgresDeltaTests.java
│               │               ├── PostgresTests.java
│               │               ├── ProcessorTests.java
│               │               ├── REServerStack.java
│               │               ├── REStack.java
│               │               ├── RedisArgsTests.java
│               │               ├── RedisContainerFactory.java
│               │               ├── RiotTests.java
│               │               ├── SqlScriptRunner.java
│               │               ├── StackFileTests.java
│               │               ├── StackREContainer.java
│               │               ├── StackREServer.java
│               │               └── StackRiotTests.java
│               └── resources/
│                   ├── compare-key-processor
│                   ├── db/
│                   │   ├── northwind.sql
│                   │   ├── oracle.sql
│                   │   └── postgres-delta.sql
│                   ├── db-export-postgresql
│                   ├── db-import-postgresql
│                   ├── db-import-postgresql-multithreaded
│                   ├── db-import-postgresql-noop
│                   ├── db-import-postgresql-set
│                   ├── faker-hset
│                   ├── faker-sadd
│                   ├── faker-tsadd
│                   ├── faker-tsadd-options
│                   ├── faker-xadd
│                   ├── faker-zadd
│                   ├── file-export-json
│                   ├── file-export-json-gz
│                   ├── file-export-xml
│                   ├── file-import-bad
│                   ├── file-import-csv
│                   ├── file-import-csv-max
│                   ├── file-import-csv-skiplines
│                   ├── file-import-exclude
│                   ├── file-import-filetype
│                   ├── file-import-filter
│                   ├── file-import-fw
│                   ├── file-import-gcs
│                   ├── file-import-geo-processor
│                   ├── file-import-geoadd
│                   ├── file-import-hset-expire
│                   ├── file-import-hset-expire-abs
│                   ├── file-import-hset-sadd
│                   ├── file-import-include
│                   ├── file-import-json
│                   ├── file-import-json-elastic-hset
│                   ├── file-import-json-elastic-jsonset
│                   ├── file-import-json-gz-hset
│                   ├── file-import-json-hset
│                   ├── file-import-process
│                   ├── file-import-process-elvis
│                   ├── file-import-process-faker
│                   ├── file-import-process-var
│                   ├── file-import-psv
│                   ├── file-import-regex
│                   ├── file-import-s3
│                   ├── file-import-sugadd
│                   ├── file-import-tsv
│                   ├── file-import-xml
│                   ├── files/
│                   │   ├── accounts.fw
│                   │   ├── airports.csv
│                   │   ├── bad.psv
│                   │   ├── beers.csv
│                   │   ├── beers.json
│                   │   ├── beers.jsonl
│                   │   ├── beers1.csv
│                   │   ├── beers2.csv
│                   │   ├── es_test-index.json
│                   │   ├── lacity.csv
│                   │   ├── nobels.json
│                   │   ├── redis-export.json
│                   │   ├── redis.json
│                   │   ├── sample.psv
│                   │   ├── sample.tsv
│                   │   ├── timestamp.json
│                   │   └── trades.xml
│                   ├── generate
│                   ├── generate-hash-index
│                   ├── generate-json-index
│                   ├── replicate
│                   ├── replicate-dry-run
│                   ├── replicate-hll
│                   ├── replicate-key-exclude
│                   ├── replicate-key-processor
│                   ├── replicate-key-processor-compare-none
│                   ├── replicate-live
│                   ├── replicate-live-key-exclude
│                   ├── replicate-live-keyslot
│                   ├── replicate-live-only-struct
│                   ├── replicate-live-read-threads
│                   ├── replicate-live-struct
│                   ├── replicate-live-threads
│                   ├── replicate-no-stream-id
│                   ├── replicate-no-stream-id-prune
│                   └── replicate-struct
├── riot
├── settings.gradle
└── src/
    ├── jreleaser/
    │   └── changelog.tpl
    └── media/
        └── riot.icns
Download .txt
SYMBOL INDEX (1718 symbols across 204 files)

FILE: core/riot-core/src/main/java/com/redis/riot/core/AbstractCallableCommand.java
  class AbstractCallableCommand (line 11) | @Command
    method call (line 19) | @Override
    method initialize (line 30) | protected void initialize() {
    method execute (line 36) | protected abstract void execute();
    method teardown (line 38) | protected void teardown() {
    method getLog (line 42) | public Logger getLog() {
    method setLog (line 46) | public void setLog(Logger log) {

FILE: core/riot-core/src/main/java/com/redis/riot/core/AbstractJobCommand.java
  class AbstractJobCommand (line 61) | @Command
    method initialize (line 83) | @Override
    method jobLauncher (line 116) | private JobLauncher jobLauncher() throws Exception {
    method configureAsyncStreamSupport (line 124) | protected void configureAsyncStreamSupport(AbstractAsyncItemStreamSupp...
    method jobBuilder (line 128) | private JobBuilder jobBuilder() {
    method execute (line 132) | @Override
    method jobName (line 155) | private String jobName() {
    method wrapException (line 162) | private RiotException wrapException(List<Throwable> throwables) {
    method job (line 169) | protected Job job(Step<?, ?>... steps) {
    method job (line 173) | protected Job job(Collection<Step<?, ?>> steps) {
    class RepeatJobExecutionListener (line 190) | private class RepeatJobExecutionListener implements JobExecutionListen...
      method RepeatJobExecutionListener (line 196) | public RepeatJobExecutionListener(SimpleJobBuilder job, Collection<S...
      method afterJob (line 201) | @Override
    method shouldShowProgress (line 234) | protected boolean shouldShowProgress() {
    method job (line 238) | protected abstract Job job();
    method step (line 240) | private <I, O> TaskletStep step(Step<I, O> step) {
    method retryPolicy (line 260) | private org.springframework.retry.RetryPolicy retryPolicy() {
    method skipPolicy (line 271) | private org.springframework.batch.core.step.skip.SkipPolicy skipPolicy...
    method simpleStep (line 282) | @SuppressWarnings("removal")
    method taskExecutor (line 317) | private TaskExecutor taskExecutor() {
    method reader (line 329) | private <I, O> ItemReader<? extends I> reader(Step<I, O> step) {
    method writer (line 342) | private <I, O> ItemWriter<? super O> writer(Step<I, O> step) {
    method getJobName (line 355) | public String getJobName() {
    method setJobName (line 359) | public void setJobName(String name) {
    method getJobArgs (line 363) | public StepArgs getJobArgs() {
    method setJobArgs (line 367) | public void setJobArgs(StepArgs args) {
    method getJobRepositoryName (line 371) | public String getJobRepositoryName() {
    method setJobRepositoryName (line 375) | public void setJobRepositoryName(String jobRepositoryName) {
    method getJobRepository (line 379) | public JobRepository getJobRepository() {
    method setJobRepository (line 383) | public void setJobRepository(JobRepository jobRepository) {
    method getTransactionManager (line 387) | public PlatformTransactionManager getTransactionManager() {
    method setTransactionManager (line 391) | public void setTransactionManager(PlatformTransactionManager transacti...
    method getJobLauncher (line 395) | public JobLauncher getJobLauncher() {
    method setJobLauncher (line 399) | public void setJobLauncher(JobLauncher jobLauncher) {
    method getJobExplorer (line 403) | public JobExplorer getJobExplorer() {
    method setJobExplorer (line 407) | public void setJobExplorer(JobExplorer jobExplorer) {

FILE: core/riot-core/src/main/java/com/redis/riot/core/BaseCommand.java
  class BaseCommand (line 11) | @Command(usageHelpAutoWidth = true, mixinStandardHelpOptions = true, abb...
    method setProperty (line 26) | @Option(names = "-D", paramLabel = "<key=value>", description = "Sets ...

FILE: core/riot-core/src/main/java/com/redis/riot/core/CompositeExecutionStrategy.java
  class CompositeExecutionStrategy (line 8) | public class CompositeExecutionStrategy implements IExecutionStrategy {
    method CompositeExecutionStrategy (line 13) | public CompositeExecutionStrategy(IExecutionStrategy inactive, IExecut...
    method execute (line 18) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/Expression.java
  class Expression (line 9) | public class Expression {
    method Expression (line 15) | public Expression(org.springframework.expression.Expression expression) {
    method toString (line 19) | @Override
    method predicate (line 24) | public <T> Predicate<T> predicate(EvaluationContext context) {
    method getValue (line 28) | public Object getValue(EvaluationContext context) {
    method getValue (line 32) | public Object getValue(EvaluationContext context, Object rootObject) {
    method getLong (line 36) | public Long getLong(EvaluationContext context, Object rootObject) {
    method getString (line 40) | public String getString(EvaluationContext context, Object rootObject) {
    method parse (line 44) | public static Expression parse(String expression) {
    method parseTemplate (line 48) | public static TemplateExpression parseTemplate(String expression) {

FILE: core/riot-core/src/main/java/com/redis/riot/core/IO.java
  type IO (line 5) | public interface IO {
    method getOut (line 7) | PrintWriter getOut();
    method setOut (line 9) | void setOut(PrintWriter out);
    method getErr (line 11) | PrintWriter getErr();
    method setErr (line 13) | void setErr(PrintWriter err);

FILE: core/riot-core/src/main/java/com/redis/riot/core/LoggingMixin.java
  class LoggingMixin (line 16) | public class LoggingMixin {
    method getTopLevelCommandLoggingMixin (line 41) | private static LoggingMixin getTopLevelCommandLoggingMixin(CommandSpec...
    method setFile (line 45) | @Option(names = "--log-file", description = "Log output target. Can be...
    method setShowDateTime (line 50) | @Option(names = "--log-time", description = "Include current date and ...
    method setDateTimeFormat (line 55) | @Option(names = "--log-time-fmt", defaultValue = "yyyy-MM-dd HH:mm:ss....
    method setShowThreadId (line 60) | @Option(names = "--log-thread-id", description = "Include current thre...
    method setShowThreadName (line 65) | @Option(names = "--log-thread", description = "Show current thread nam...
    method setShowLogName (line 70) | @Option(names = "--log-name", description = "Show logger instance name...
    method setShowShortLogName (line 75) | @Option(names = "--log-short", description = "Include last component o...
    method setLevelInBrackets (line 80) | @Option(names = "--log-level-brck", description = "Output log level st...
    method setLevels (line 85) | @Option(arity = "1..*", names = "--log", description = "Custom log lev...
    method setDebug (line 90) | @Option(names = { "-d", "--debug" }, description = "Log in debug mode.")
    method setInfo (line 97) | @Option(names = { "-i", "--info" }, description = "Set log level to in...
    method setError (line 104) | @Option(names = { "-q", "--quiet" }, description = "Log errors only.")
    method setLevel (line 111) | @Option(names = "--log-level", description = "Set log level: ${COMPLET...
    method executionStrategy (line 116) | public static int executionStrategy(ParseResult parseResult) {
    method configureLoggers (line 121) | public void configureLoggers() {
    method setLogLevel (line 143) | private void setLogLevel(String key, Level level) {
    method setBoolean (line 147) | private void setBoolean(String property, boolean value) {
    method isStacktrace (line 151) | public boolean isStacktrace() {

FILE: core/riot-core/src/main/java/com/redis/riot/core/MainCommand.java
  class MainCommand (line 12) | public class MainCommand extends BaseCommand implements Callable<Integer...
    method call (line 17) | @Override
    method commandLine (line 23) | protected CommandLine commandLine() {
    method run (line 27) | public int run(String... args) {
    method executionStrategy (line 40) | protected int executionStrategy(ParseResult parseResult) {
    method registerConverters (line 44) | protected void registerConverters(CommandLine commandLine) {
    method parseDataSize (line 51) | public static DataSize parseDataSize(String string) {
    method getOut (line 55) | @Override
    method setOut (line 60) | @Override
    method getErr (line 65) | @Override
    method setErr (line 70) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/NoopItemWriter.java
  class NoopItemWriter (line 6) | public class NoopItemWriter<T> implements ItemWriter<T> {
    method write (line 8) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/PrintExceptionMessageHandler.java
  class PrintExceptionMessageHandler (line 7) | public class PrintExceptionMessageHandler implements IExecutionException...
    method handleExecutionException (line 9) | public int handleExecutionException(Exception exception, CommandLine c...
    method unwrapException (line 26) | private Throwable unwrapException(Exception exception) {

FILE: core/riot-core/src/main/java/com/redis/riot/core/ProcessingItemWriter.java
  class ProcessingItemWriter (line 13) | public class ProcessingItemWriter<S, T> extends ItemStreamSupport implem...
    method ProcessingItemWriter (line 18) | public ProcessingItemWriter(ItemProcessor<S, T> processor, ItemWriter<...
    method open (line 24) | @Override
    method close (line 35) | @Override
    method update (line 45) | @Override
    method write (line 55) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/ProgressArgs.java
  class ProgressArgs (line 6) | @ToString
    method getStyle (line 18) | public ProgressStyle getStyle() {
    method setStyle (line 22) | public void setStyle(ProgressStyle style) {
    method getUpdateInterval (line 26) | public RiotDuration getUpdateInterval() {
    method setUpdateInterval (line 30) | public void setUpdateInterval(RiotDuration interval) {

FILE: core/riot-core/src/main/java/com/redis/riot/core/ProgressStepExecutionListener.java
  class ProgressStepExecutionListener (line 22) | @SuppressWarnings("rawtypes")
    method ProgressStepExecutionListener (line 31) | public ProgressStepExecutionListener(Step<I, O> step) {
    method beforeStep (line 35) | @Override
    method progressBarStyle (line 51) | private ProgressBarStyle progressBarStyle() {
    method afterWrite (line 62) | @Override
    method afterStep (line 70) | @Override
    method getProgressArgs (line 82) | public ProgressArgs getProgressArgs() {
    method setProgressArgs (line 86) | public void setProgressArgs(ProgressArgs args) {

FILE: core/riot-core/src/main/java/com/redis/riot/core/ProgressStyle.java
  type ProgressStyle (line 3) | public enum ProgressStyle {

FILE: core/riot-core/src/main/java/com/redis/riot/core/QuietMapAccessor.java
  class QuietMapAccessor (line 13) | public class QuietMapAccessor extends MapAccessor {
    method canRead (line 15) | @Override
    method read (line 20) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/RetryPolicy.java
  type RetryPolicy (line 3) | public enum RetryPolicy {

FILE: core/riot-core/src/main/java/com/redis/riot/core/RiotDuration.java
  class RiotDuration (line 12) | public class RiotDuration {
    method RiotDuration (line 17) | public RiotDuration(long value, ChronoUnit unit) {
    method RiotDuration (line 21) | public RiotDuration(Duration duration, ChronoUnit displayUnit) {
    method getValue (line 28) | public Duration getValue() {
    method toString (line 32) | @Override
    method parse (line 37) | public static RiotDuration parse(String string) {
    method of (line 41) | public static RiotDuration of(long value, ChronoUnit unit) {
    method of (line 45) | public static RiotDuration of(Duration duration, ChronoUnit unit) {
    method ofSeconds (line 49) | public static RiotDuration ofSeconds(long seconds) {
    method ofMillis (line 53) | public static RiotDuration ofMillis(long millis) {

FILE: core/riot-core/src/main/java/com/redis/riot/core/RiotException.java
  class RiotException (line 3) | @SuppressWarnings("serial")
    method RiotException (line 6) | public RiotException(String message, Throwable cause) {
    method RiotException (line 10) | public RiotException(String message) {
    method RiotException (line 14) | public RiotException(Throwable cause) {

FILE: core/riot-core/src/main/java/com/redis/riot/core/RiotUtils.java
  class RiotUtils (line 29) | public abstract class RiotUtils {
    method RiotUtils (line 31) | private RiotUtils() {
    method mask (line 34) | public static String mask(char[] password) {
    method mask (line 41) | private static String mask(int length) {
    method mask (line 45) | public static String mask(String password) {
    method processor (line 52) | public static <S, T> ItemProcessor<S, T> processor(Collection<? extend...
    method processor (line 56) | @SuppressWarnings("unchecked")
    method processor (line 62) | public static <S, T> ItemProcessor<S, T> processor(ItemProcessor<?, ?>...
    method processor (line 66) | public static <S, T> ItemProcessor<S, T> processor(Iterable<? extends ...
    method processor (line 70) | @SuppressWarnings("unchecked")
    method isPositive (line 84) | public static boolean isPositive(Duration duration) {
    method newPrintStream (line 88) | public static PrintStream newPrintStream(OutputStream out) {
    method newPrintStream (line 92) | public static PrintStream newPrintStream(OutputStream out, boolean aut...
    method newPrintWriter (line 100) | public static PrintWriter newPrintWriter(OutputStream out) {
    method newPrintWriter (line 104) | public static PrintWriter newPrintWriter(OutputStream out, boolean aut...
    method toString (line 108) | public static String toString(ByteArrayOutputStream out) {
    method registerFunction (line 116) | public static void registerFunction(StandardEvaluationContext context,...

FILE: core/riot-core/src/main/java/com/redis/riot/core/RiotVersion.java
  class RiotVersion (line 7) | public class RiotVersion {
    method RiotVersion (line 14) | private RiotVersion() {
    method getVersion (line 18) | public static String getVersion() {
    method banner (line 22) | public static void banner(PrintStream out) {
    method banner (line 26) | public static void banner(PrintStream out, boolean full) {
    method banner (line 30) | public static void banner(PrintWriter out) {
    method banner (line 34) | public static void banner(PrintWriter out, boolean full) {
    method banner (line 38) | public static void banner(PrintWriter out, boolean full, ResourceBundl...

FILE: core/riot-core/src/main/java/com/redis/riot/core/SkipPolicy.java
  type SkipPolicy (line 3) | public enum SkipPolicy {

FILE: core/riot-core/src/main/java/com/redis/riot/core/Step.java
  class Step (line 22) | @ToString
    method Step (line 47) | public Step(ItemReader<I> reader, ItemWriter<O> writer) {
    method getName (line 52) | public String getName() {
    method name (line 56) | public Step<I, O> name(String name) {
    method getTaskName (line 61) | public String getTaskName() {
    method taskName (line 65) | public Step<I, O> taskName(String name) {
    method getReader (line 70) | public ItemReader<I> getReader() {
    method getProcessor (line 74) | public ItemProcessor<I, O> getProcessor() {
    method getWriter (line 78) | public ItemWriter<O> getWriter() {
    method maxItemCount (line 82) | public long maxItemCount() {
    method statusMessage (line 86) | public String statusMessage() {
    method getStatusMessageSupplier (line 90) | public Supplier<String> getStatusMessageSupplier() {
    method statusMessageSupplier (line 94) | public Step<I, O> statusMessageSupplier(Supplier<String> supplier) {
    method getMaxItemCountSupplier (line 99) | public LongSupplier getMaxItemCountSupplier() {
    method maxItemCountSupplier (line 103) | public Step<I, O> maxItemCountSupplier(LongSupplier supplier) {
    method processor (line 108) | public Step<I, O> processor(ItemProcessor<I, O> processor) {
    method maxItemCount (line 113) | public Step<I, O> maxItemCount(int count) {
    method getReadListeners (line 117) | public Set<ItemReadListener<I>> getReadListeners() {
    method readListener (line 121) | public Step<I, O> readListener(ItemReadListener<I> listener) {
    method getWriteListeners (line 126) | public Set<ItemWriteListener<O>> getWriteListeners() {
    method writeListener (line 130) | public Step<I, O> writeListener(ItemWriteListener<O> listener) {
    method getExecutionListeners (line 135) | public Set<StepExecutionListener> getExecutionListeners() {
    method executionListener (line 139) | public Step<I, O> executionListener(StepExecutionListener listener) {
    method getFlushInterval (line 144) | public Duration getFlushInterval() {
    method flushInterval (line 148) | public Step<I, O> flushInterval(Duration flushInterval) {
    method getIdleTimeout (line 153) | public Duration getIdleTimeout() {
    method idleTimeout (line 157) | public Step<I, O> idleTimeout(Duration idleTimeout) {
    method isLive (line 162) | public boolean isLive() {
    method live (line 166) | public Step<I, O> live(boolean live) {
    method skip (line 171) | public Step<I, O> skip(Class<? extends Throwable> exception) {
    method retry (line 176) | public Step<I, O> retry(Class<? extends Throwable> exception) {
    method noSkip (line 181) | public Step<I, O> noSkip(Class<? extends Throwable> exception) {
    method noRetry (line 186) | public Step<I, O> noRetry(Class<? extends Throwable> exception) {
    method getNoRetry (line 191) | public Collection<Class<? extends Throwable>> getNoRetry() {
    method getNoSkip (line 195) | public Collection<Class<? extends Throwable>> getNoSkip() {
    method getRetry (line 199) | public Collection<Class<? extends Throwable>> getRetry() {
    method getSkip (line 203) | public Collection<Class<? extends Throwable>> getSkip() {

FILE: core/riot-core/src/main/java/com/redis/riot/core/StepArgs.java
  class StepArgs (line 9) | @ToString
    method getSleep (line 45) | public RiotDuration getSleep() {
    method setSleep (line 49) | public void setSleep(RiotDuration sleep) {
    method getThreads (line 53) | public int getThreads() {
    method setThreads (line 57) | public void setThreads(int threads) {
    method getChunkSize (line 61) | public int getChunkSize() {
    method setChunkSize (line 65) | public void setChunkSize(int chunkSize) {
    method isDryRun (line 69) | public boolean isDryRun() {
    method setDryRun (line 73) | public void setDryRun(boolean dryRun) {
    method getProgressArgs (line 77) | public ProgressArgs getProgressArgs() {
    method setProgressArgs (line 81) | public void setProgressArgs(ProgressArgs args) {
    method getSkipLimit (line 85) | public int getSkipLimit() {
    method setSkipLimit (line 89) | public void setSkipLimit(int skipLimit) {
    method getRetryLimit (line 93) | public int getRetryLimit() {
    method setRetryLimit (line 97) | public void setRetryLimit(int retryLimit) {
    method getSkipPolicy (line 101) | public SkipPolicy getSkipPolicy() {
    method setSkipPolicy (line 105) | public void setSkipPolicy(SkipPolicy skipPolicy) {
    method getRetryPolicy (line 109) | public RetryPolicy getRetryPolicy() {
    method setRetryPolicy (line 113) | public void setRetryPolicy(RetryPolicy retryPolicy) {

FILE: core/riot-core/src/main/java/com/redis/riot/core/StepConfiguration.java
  type StepConfiguration (line 7) | public interface StepConfiguration {
    method configure (line 9) | <I, O> void configure(SimpleStepBuilder<I, O> step, String name, ItemR...

FILE: core/riot-core/src/main/java/com/redis/riot/core/TemplateExpression.java
  class TemplateExpression (line 5) | public class TemplateExpression extends Expression {
    method TemplateExpression (line 7) | public TemplateExpression(org.springframework.expression.Expression ex...
    method getValue (line 11) | @Override
    method getValue (line 16) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/ThrottledItemWriter.java
  class ThrottledItemWriter (line 12) | public class ThrottledItemWriter<T> implements ItemStreamWriter<T> {
    method ThrottledItemWriter (line 17) | public ThrottledItemWriter(ItemWriter<T> delegate, Duration sleep) {
    method open (line 25) | @Override
    method update (line 32) | @Override
    method close (line 39) | @Override
    method write (line 46) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/CollectionToMapFunction.java
  class CollectionToMapFunction (line 8) | public class CollectionToMapFunction implements Function<Collection<Stri...
    method setKeyFormat (line 14) | public void setKeyFormat(String keyFormat) {
    method apply (line 18) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/ConsumerUnaryOperator.java
  class ConsumerUnaryOperator (line 6) | public class ConsumerUnaryOperator<T> implements UnaryOperator<T> {
    method ConsumerUnaryOperator (line 10) | public ConsumerUnaryOperator(Consumer<T> consumer) {
    method apply (line 14) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/FieldExtractorFactory.java
  class FieldExtractorFactory (line 8) | public class FieldExtractorFactory {
    method setRemove (line 14) | public void setRemove(boolean remove) {
    method setNullCheck (line 18) | public void setNullCheck(boolean nullCheck) {
    method field (line 22) | public Function<Map<String, Object>, Object> field(String field) {
    method extractor (line 30) | private <T> Function<Map<String, T>, T> extractor(String field) {
    method string (line 37) | public Function<Map<String, Object>, String> string(String field) {
    method field (line 41) | public <T> Function<Map<String, T>, T> field(String field, T defaultVa...
    method longField (line 45) | public ToLongFunction<Map<String, Object>> longField(String field) {
    method doubleField (line 51) | public ToDoubleFunction<Map<String, Object>> doubleField(String field,...
    class MissingFieldException (line 57) | public static class MissingFieldException extends RuntimeException {
      method MissingFieldException (line 61) | public MissingFieldException(String msg) {
    class DefaultValueExtractor (line 67) | private static class DefaultValueExtractor<T> implements Function<Map<...
      method DefaultValueExtractor (line 73) | public DefaultValueExtractor(Function<Map<String, T>, T> extractor, ...
      method apply (line 78) | @Override
    class NullCheckExtractor (line 90) | private static class NullCheckExtractor implements Function<Map<String...
      method NullCheckExtractor (line 96) | public NullCheckExtractor(String field, Function<Map<String, Object>...
      method apply (line 101) | @Override
    method builder (line 112) | public static FieldExtractorFactoryBuilder builder() {
    class FieldExtractorFactoryBuilder (line 116) | public static class FieldExtractorFactoryBuilder {
      method remove (line 122) | public FieldExtractorFactoryBuilder remove(boolean remove) {
      method nullCheck (line 127) | public FieldExtractorFactoryBuilder nullCheck(boolean nullCheck) {
      method build (line 132) | public FieldExtractorFactory build() {

FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/FunctionPredicate.java
  class FunctionPredicate (line 6) | public class FunctionPredicate<S, T> implements Predicate<S> {
    method FunctionPredicate (line 11) | public FunctionPredicate(Function<S, T> function, Predicate<T> predica...
    method test (line 16) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/IdFunctionBuilder.java
  class IdFunctionBuilder (line 11) | public class IdFunctionBuilder {
    method remove (line 23) | public IdFunctionBuilder remove(boolean remove) {
    method fields (line 28) | public IdFunctionBuilder fields(String... fields) {
    method fields (line 32) | public IdFunctionBuilder fields(List<String> fields) {
    method prefix (line 39) | public IdFunctionBuilder prefix(String prefix) {
    method separator (line 44) | public IdFunctionBuilder separator(String separator) {
    method build (line 49) | public Function<Map<String, Object>, String> build() {
    class ConcatenatingFunction (line 73) | public static class ConcatenatingFunction implements Function<Map<Stri...
      method ConcatenatingFunction (line 79) | public ConcatenatingFunction(String separator, List<Function<Map<Str...
      method apply (line 84) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/MapFilteringFunction.java
  class MapFilteringFunction (line 12) | public class MapFilteringFunction implements UnaryOperator<Map<String, S...
    method excludes (line 18) | public MapFilteringFunction excludes(Collection<String> fields) {
    method includes (line 23) | public MapFilteringFunction includes(Collection<String> fields) {
    method apply (line 28) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/MapFlatteningFunction.java
  class MapFlatteningFunction (line 16) | public class MapFlatteningFunction<T> implements Function<Map<String, Ob...
    method MapFlatteningFunction (line 20) | public MapFlatteningFunction(Function<Object, T> elementFunction) {
    method apply (line 24) | @Override
    method flatten (line 31) | private void flatten(String prefix, Iterator<? extends Entry<String, O...
    method flattenElement (line 39) | @SuppressWarnings("unchecked")

FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/ObjectToDoubleFunction.java
  class ObjectToDoubleFunction (line 5) | public class ObjectToDoubleFunction implements ToDoubleFunction<Object> {
    method ObjectToDoubleFunction (line 9) | public ObjectToDoubleFunction(double defaultValue) {
    method applyAsDouble (line 13) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/ObjectToLongFunction.java
  class ObjectToLongFunction (line 7) | public class ObjectToLongFunction implements ToLongFunction<Object> {
    method applyAsLong (line 9) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/ObjectToStringFunction.java
  class ObjectToStringFunction (line 5) | public class ObjectToStringFunction implements Function<Object, String> {
    method apply (line 7) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/PredicateOperator.java
  class PredicateOperator (line 12) | public class PredicateOperator<T> implements UnaryOperator<T> {
    method PredicateOperator (line 16) | public PredicateOperator(Predicate<T> predicate) {
    method apply (line 20) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/RegexNamedGroupFunction.java
  class RegexNamedGroupFunction (line 12) | public class RegexNamedGroupFunction implements Function<String, Map<Str...
    method RegexNamedGroupFunction (line 19) | public RegexNamedGroupFunction(Pattern pattern) {
    method apply (line 28) | @Override

FILE: core/riot-core/src/main/java/com/redis/riot/core/processor/StringToMapFunction.java
  class StringToMapFunction (line 8) | public class StringToMapFunction implements Function<String, Map<String,...
    method setKeyExtractor (line 15) | public void setKeyExtractor(UnaryOperator<String> keyExtractor) {
    method apply (line 19) | @Override

FILE: core/riot-core/src/test/java/com/redis/riot/core/ConverterTests.java
  class ConverterTests (line 15) | class ConverterTests {
    method testNoKeyConverter (line 17) | @Test
    method testSingleKeyConverter (line 30) | @Test
    method testMultiKeyConverter (line 43) | @Test
    method testNullCheck (line 60) | @Test
    method testDurationStyle (line 73) | @Test

FILE: core/riot-faker/src/main/java/com/redis/riot/faker/FakerItemReader.java
  class FakerItemReader (line 23) | public class FakerItemReader extends AbstractItemCountingItemStreamItemR...
    method FakerItemReader (line 33) | public FakerItemReader() {
    method setLocale (line 37) | public void setLocale(Locale locale) {
    method setExpressions (line 41) | public void setExpressions(Map<String, String> fields) {
    method doOpen (line 45) | @Override
    method normalizeField (line 55) | private Entry<String, String> normalizeField(Entry<String, String> fie...
    method doRead (line 62) | @Override
    method doClose (line 75) | @Override

FILE: core/riot-faker/src/test/java/com/redis/riot/faker/FakerReaderTests.java
  class FakerReaderTests (line 13) | class FakerReaderTests {
    method readAll (line 15) | public static <T> List<T> readAll(ItemReader<T> reader) throws Excepti...
    method fakerReader (line 24) | @Test

FILE: core/riot-file/src/main/java/com/redis/riot/file/AbstractReaderFactory.java
  class AbstractReaderFactory (line 18) | public abstract class AbstractReaderFactory implements ReaderFactory {
    method includedFields (line 20) | protected int[] includedFields(ReadOptions options) {
    method flatFileReader (line 24) | protected FlatFileItemReader<Map<String, Object>> flatFileReader(Resou...
    method flatFileReader (line 41) | protected <T> FlatFileItemReaderBuilder<T> flatFileReader(ReadOptions ...
    method recordSeparatorPolicy (line 53) | private RecordSeparatorPolicy recordSeparatorPolicy(ReadOptions option...
    method headerIndex (line 58) | private int headerIndex(ReadOptions options) {
    method linesToSkip (line 65) | private int linesToSkip(ReadOptions options) {
    method objectMapper (line 75) | protected <T extends ObjectMapper> T objectMapper(T objectMapper, Read...

FILE: core/riot-file/src/main/java/com/redis/riot/file/AbstractWriterFactory.java
  class AbstractWriterFactory (line 17) | public abstract class AbstractWriterFactory implements WriterFactory {
    method objectMapper (line 19) | protected <T extends ObjectMapper> T objectMapper(T objectMapper) {
    method flatFileWriter (line 25) | protected <T> FlatFileItemWriterBuilder<T> flatFileWriter(WritableReso...
    method flatFileWriter (line 40) | protected FlatFileItemWriter<Map<String, Object>> flatFileWriter(Write...

FILE: core/riot-file/src/main/java/com/redis/riot/file/DelimitedReaderFactory.java
  class DelimitedReaderFactory (line 8) | public class DelimitedReaderFactory extends AbstractReaderFactory {
    method DelimitedReaderFactory (line 12) | public DelimitedReaderFactory(String delimiter) {
    method create (line 16) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/DelimitedWriterFactory.java
  class DelimitedWriterFactory (line 12) | public class DelimitedWriterFactory extends AbstractWriterFactory {
    method DelimitedWriterFactory (line 16) | public DelimitedWriterFactory(String delimiter) {
    method create (line 20) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/FileOptions.java
  class FileOptions (line 10) | @ToString
    method isGzip (line 28) | public boolean isGzip() {
    method setGzip (line 32) | public void setGzip(boolean gzip) {
    method getGoogleStorageOptions (line 36) | public GoogleStorageOptions getGoogleStorageOptions() {
    method getS3Options (line 40) | public S3Options getS3Options() {
    method setS3Options (line 44) | public void setS3Options(S3Options s3Options) {
    method setGoogleStorageOptions (line 48) | public void setGoogleStorageOptions(GoogleStorageOptions googleStorage...
    method getContentType (line 52) | public MimeType getContentType() {
    method setContentType (line 56) | public void setContentType(MimeType type) {
    method getDelimiter (line 60) | public String getDelimiter() {
    method setDelimiter (line 64) | public void setDelimiter(String delimiter) {
    method getQuoteCharacter (line 68) | public char getQuoteCharacter() {
    method setQuoteCharacter (line 72) | public void setQuoteCharacter(char character) {
    method isHeader (line 76) | public boolean isHeader() {
    method setHeader (line 80) | public void setHeader(boolean header) {
    method getEncoding (line 84) | public String getEncoding() {
    method setEncoding (line 88) | public void setEncoding(String encoding) {

FILE: core/riot-file/src/main/java/com/redis/riot/file/FileReaderRegistry.java
  class FileReaderRegistry (line 8) | public class FileReaderRegistry {
    method register (line 12) | public void register(MimeType type, ReaderFactory factory) {
    method getReaderFactory (line 16) | public ReaderFactory getReaderFactory(MimeType type) {
    method defaultReaderRegistry (line 20) | public static FileReaderRegistry defaultReaderRegistry() {

FILE: core/riot-file/src/main/java/com/redis/riot/file/FileReaderResult.java
  class FileReaderResult (line 7) | public class FileReaderResult {
    method getResource (line 13) | public Resource getResource() {
    method setResource (line 17) | public void setResource(Resource resource) {
    method getType (line 21) | public MimeType getType() {
    method setType (line 25) | public void setType(MimeType mimeType) {
    method getReader (line 29) | public ItemReader<?> getReader() {
    method setReader (line 33) | public void setReader(ItemReader<?> itemReader) {

FILE: core/riot-file/src/main/java/com/redis/riot/file/FileWriterRegistry.java
  class FileWriterRegistry (line 8) | public class FileWriterRegistry {
    method register (line 12) | public void register(MimeType type, WriterFactory factory) {
    method getWriterFactory (line 16) | public WriterFactory getWriterFactory(MimeType type) {
    method defaultWriterRegistry (line 20) | public static FileWriterRegistry defaultWriterRegistry() {

FILE: core/riot-file/src/main/java/com/redis/riot/file/FileWriterResult.java
  class FileWriterResult (line 7) | public class FileWriterResult {
    method getResource (line 13) | public Resource getResource() {
    method setResource (line 17) | public void setResource(Resource resource) {
    method getType (line 21) | public MimeType getType() {
    method setType (line 25) | public void setType(MimeType mimeType) {
    method getWriter (line 29) | public ItemWriter<?> getWriter() {
    method setWriter (line 33) | public void setWriter(ItemWriter<?> writer) {

FILE: core/riot-file/src/main/java/com/redis/riot/file/FixedWidthReaderFactory.java
  class FixedWidthReaderFactory (line 12) | public class FixedWidthReaderFactory extends AbstractReaderFactory {
    method create (line 14) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/FormattedWriterFactory.java
  class FormattedWriterFactory (line 12) | public class FormattedWriterFactory extends AbstractWriterFactory {
    method create (line 14) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/GoogleStorageOptions.java
  class GoogleStorageOptions (line 18) | public class GoogleStorageOptions {
    method storage (line 27) | public Storage storage() {
    method credentials (line 50) | private GoogleCredentials credentials(InputStream inputStream) {
    method getKeyFile (line 61) | public Path getKeyFile() {
    method setKeyFile (line 65) | public void setKeyFile(Path keyFile) {
    method getProjectId (line 69) | public String getProjectId() {
    method setProjectId (line 73) | public void setProjectId(String projectId) {
    method getEncodedKey (line 77) | public String getEncodedKey() {
    method setEncodedKey (line 81) | public void setEncodedKey(String encodedKey) {
    method getScope (line 85) | public GcpScope getScope() {
    method setScope (line 89) | public void setScope(GcpScope scope) {

FILE: core/riot-file/src/main/java/com/redis/riot/file/GoogleStorageProtocolResolver.java
  class GoogleStorageProtocolResolver (line 12) | public class GoogleStorageProtocolResolver implements ProtocolResolver {
    method resolve (line 17) | @Override
    method storage (line 25) | private Storage storage() {
    method setStorage (line 32) | public void setStorage(Storage storage) {
    method setStorageSupplier (line 36) | public void setStorageSupplier(Supplier<Storage> storageSupplier) {

FILE: core/riot-file/src/main/java/com/redis/riot/file/HeaderCallbackHandler.java
  class HeaderCallbackHandler (line 12) | public class HeaderCallbackHandler implements LineCallbackHandler {
    method HeaderCallbackHandler (line 21) | public HeaderCallbackHandler(AbstractLineTokenizer tokenizer, int head...
    method handleLine (line 26) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/JsonLineAggregator.java
  class JsonLineAggregator (line 10) | public class JsonLineAggregator<T> implements LineAggregator<T> {
    method JsonLineAggregator (line 16) | public JsonLineAggregator(ObjectMapper mapper) {
    method aggregate (line 20) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/JsonLinesReaderFactory.java
  class JsonLinesReaderFactory (line 12) | public class JsonLinesReaderFactory extends AbstractReaderFactory {
    method create (line 14) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/JsonLinesWriterFactory.java
  class JsonLinesWriterFactory (line 9) | public class JsonLinesWriterFactory extends AbstractWriterFactory {
    method create (line 11) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/JsonReaderFactory.java
  class JsonReaderFactory (line 10) | public class JsonReaderFactory extends AbstractReaderFactory {
    method create (line 12) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/JsonWriterFactory.java
  class JsonWriterFactory (line 10) | public class JsonWriterFactory extends AbstractWriterFactory {
    method create (line 12) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/MapFieldSetMapper.java
  class MapFieldSetMapper (line 10) | public class MapFieldSetMapper implements FieldSetMapper<Map<String, Obj...
    method mapFieldSet (line 12) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/NamedInputStreamResource.java
  class NamedInputStreamResource (line 7) | public class NamedInputStreamResource extends InputStreamResource {
    method NamedInputStreamResource (line 11) | public NamedInputStreamResource(InputStream inputStream, String filena...
    method getFilename (line 16) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/ObjectMapperLineMapper.java
  class ObjectMapperLineMapper (line 7) | public class ObjectMapperLineMapper<T> implements LineMapper<T> {
    method ObjectMapperLineMapper (line 12) | public ObjectMapperLineMapper(ObjectMapper mapper, Class<? extends T> ...
    method mapLine (line 17) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/OutputStreamResource.java
  class OutputStreamResource (line 11) | public class OutputStreamResource extends AbstractResource implements Wr...
    method OutputStreamResource (line 17) | public OutputStreamResource(OutputStream outStream, String filename, S...
    method getOutputStream (line 23) | @Override
    method getDescription (line 28) | @Override
    method getFilename (line 33) | @Override
    method getInputStream (line 38) | @Override
    method isWritable (line 43) | @Override
    method hashCode (line 48) | @Override
    method equals (line 56) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/ReadOptions.java
  class ReadOptions (line 12) | @ToString
    method addDeserializer (line 28) | public <T> void addDeserializer(Class<T> type, JsonDeserializer<? exte...
    method getDeserializers (line 32) | @SuppressWarnings("rawtypes")
    method getItemType (line 37) | public Class<?> getItemType() {
    method setItemType (line 41) | public void setItemType(Class<?> type) {
    method getMaxItemCount (line 45) | public int getMaxItemCount() {
    method setMaxItemCount (line 49) | public void setMaxItemCount(int count) {
    method getIncludedFields (line 53) | public Set<Integer> getIncludedFields() {
    method setIncludedFields (line 57) | public void setIncludedFields(Set<Integer> fields) {
    method getContinuationString (line 61) | public String getContinuationString() {
    method setContinuationString (line 65) | public void setContinuationString(String string) {
    method getFields (line 69) | public List<String> getFields() {
    method setFields (line 73) | public void setFields(List<String> fields) {
    method getHeaderLine (line 77) | public Integer getHeaderLine() {
    method setHeaderLine (line 81) | public void setHeaderLine(Integer headerLine) {
    method getLinesToSkip (line 85) | public Integer getLinesToSkip() {
    method setLinesToSkip (line 89) | public void setLinesToSkip(Integer linesToSkip) {
    method getColumnRanges (line 93) | public List<String> getColumnRanges() {
    method setColumnRanges (line 97) | public void setColumnRanges(List<String> columnRanges) {

FILE: core/riot-file/src/main/java/com/redis/riot/file/ReaderFactory.java
  type ReaderFactory (line 6) | public interface ReaderFactory {
    method create (line 8) | ItemReader<?> create(Resource resource, ReadOptions options);

FILE: core/riot-file/src/main/java/com/redis/riot/file/ResourceFactory.java
  class ResourceFactory (line 14) | public class ResourceFactory {
    method addProtocolResolver (line 20) | public void addProtocolResolver(ProtocolResolver protocolResolver) {
    method resource (line 24) | public Resource resource(String location, FileOptions options) throws ...
    method isGzip (line 33) | private boolean isGzip(Resource resource, FileOptions options) {
    method writableResource (line 37) | public WritableResource writableResource(String location, FileOptions ...
    method createResource (line 47) | private Resource createResource(String location, FileOptions options) {
    method isGzip (line 56) | public static boolean isGzip(String filename) {
    method stripGzipSuffix (line 60) | public static String stripGzipSuffix(String filename) {

FILE: core/riot-file/src/main/java/com/redis/riot/file/ResourceMap.java
  type ResourceMap (line 7) | public interface ResourceMap {
    method getContentTypeFor (line 17) | MimeType getContentTypeFor(Resource resource);

FILE: core/riot-file/src/main/java/com/redis/riot/file/RiotResourceLoader.java
  class RiotResourceLoader (line 20) | public class RiotResourceLoader implements ResourceLoader {
    method addProtocolResolver (line 36) | public void addProtocolResolver(ProtocolResolver resolver) {
    method getGoogleStorageProtocolResolver (line 41) | public GoogleStorageProtocolResolver getGoogleStorageProtocolResolver() {
    method setGoogleStorageProtocolResolver (line 45) | public void setGoogleStorageProtocolResolver(GoogleStorageProtocolReso...
    method getS3ProtocolResolver (line 49) | public S3ProtocolResolver getS3ProtocolResolver() {
    method setS3ProtocolResolver (line 53) | public void setS3ProtocolResolver(S3ProtocolResolver resolver) {
    method getProtocolResolvers (line 63) | public Collection<ProtocolResolver> getProtocolResolvers() {
    method getClassLoader (line 67) | @Override
    method getResource (line 72) | @Override
    method allProtocolResolvers (line 91) | private Iterable<ProtocolResolver> allProtocolResolvers() {

FILE: core/riot-file/src/main/java/com/redis/riot/file/RiotResourceMap.java
  class RiotResourceMap (line 13) | public class RiotResourceMap implements ResourceMap {
    method addFileNameMap (line 17) | public void addFileNameMap(FileNameMap map) {
    method getContentTypeFor (line 21) | @Override
    method getContentTypeFor (line 37) | public MimeType getContentTypeFor(String filename) {
    method defaultResourceMap (line 52) | public static RiotResourceMap defaultResourceMap() {
    class JsonLinesFileNameMap (line 58) | private static class JsonLinesFileNameMap implements FileNameMap {
      method getContentTypeFor (line 62) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/RuntimeIOException.java
  class RuntimeIOException (line 7) | @SuppressWarnings("serial")
    method RuntimeIOException (line 10) | public RuntimeIOException(String msg) {
    method RuntimeIOException (line 14) | public RuntimeIOException(String msg, IOException cause) {

FILE: core/riot-file/src/main/java/com/redis/riot/file/S3Options.java
  class S3Options (line 13) | public class S3Options {
    method client (line 20) | public S3Client client() {
    method credentialsProvider (line 32) | private AwsCredentialsProvider credentialsProvider() {
    method getAccessKey (line 39) | public String getAccessKey() {
    method setAccessKey (line 43) | public void setAccessKey(String accessKey) {
    method getSecretKey (line 47) | public String getSecretKey() {
    method setSecretKey (line 51) | public void setSecretKey(String secretKey) {
    method getRegion (line 55) | public Region getRegion() {
    method setRegion (line 59) | public void setRegion(Region region) {
    method getEndpoint (line 63) | public URI getEndpoint() {
    method setEndpoint (line 67) | public void setEndpoint(URI endpoint) {

FILE: core/riot-file/src/main/java/com/redis/riot/file/S3ProtocolResolver.java
  class S3ProtocolResolver (line 18) | public class S3ProtocolResolver implements ProtocolResolver, ResourceLoa...
    method resolve (line 24) | @Override
    method isS3 (line 32) | private boolean isS3(String location) {
    method getResource (line 36) | @Override
    method client (line 41) | private S3Client client() {
    method outputStreamProvider (line 48) | public S3OutputStreamProvider outputStreamProvider() {
    method getClassLoader (line 56) | @Override
    method setClient (line 61) | public void setClient(S3Client client) {
    method setClientSupplier (line 65) | public void setClientSupplier(Supplier<S3Client> clientSupplier) {

FILE: core/riot-file/src/main/java/com/redis/riot/file/StdInProtocolResolver.java
  class StdInProtocolResolver (line 7) | public class StdInProtocolResolver implements ProtocolResolver {
    method StdInProtocolResolver (line 13) | public StdInProtocolResolver() {
    method getFilename (line 17) | public String getFilename() {
    method setFilename (line 21) | public void setFilename(String filename) {
    method resolve (line 25) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/StdOutProtocolResolver.java
  class StdOutProtocolResolver (line 7) | public class StdOutProtocolResolver implements ProtocolResolver {
    method setFilename (line 13) | public void setFilename(String filename) {
    method resolve (line 17) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/SystemInResource.java
  class SystemInResource (line 5) | public class SystemInResource extends NamedInputStreamResource {
    method SystemInResource (line 10) | public SystemInResource() {
    method SystemInResource (line 14) | public SystemInResource(InputStream inputStream) {

FILE: core/riot-file/src/main/java/com/redis/riot/file/SystemOutResource.java
  class SystemOutResource (line 5) | public class SystemOutResource extends OutputStreamResource {
    method SystemOutResource (line 10) | public SystemOutResource() {
    method SystemOutResource (line 14) | public SystemOutResource(OutputStream outputStream) {

FILE: core/riot-file/src/main/java/com/redis/riot/file/UncustomizedUrlResource.java
  class UncustomizedUrlResource (line 11) | public class UncustomizedUrlResource extends UrlResource {
    method UncustomizedUrlResource (line 13) | public UncustomizedUrlResource(String path) throws MalformedURLExcepti...
    method UncustomizedUrlResource (line 17) | public UncustomizedUrlResource(URI uri) throws MalformedURLException {
    method UncustomizedUrlResource (line 21) | public UncustomizedUrlResource(URL url) {
    method customizeConnection (line 25) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/WriteOptions.java
  class WriteOptions (line 8) | @ToString
    method getHeaderSupplier (line 28) | public Supplier<Map<String, Object>> getHeaderSupplier() {
    method setHeaderSupplier (line 32) | public void setHeaderSupplier(Supplier<Map<String, Object>> headerSupp...
    method getRootName (line 36) | public String getRootName() {
    method setRootName (line 40) | public void setRootName(String name) {
    method getElementName (line 44) | public String getElementName() {
    method setElementName (line 48) | public void setElementName(String name) {
    method isAppend (line 52) | public boolean isAppend() {
    method setAppend (line 56) | public void setAppend(boolean append) {
    method isForceSync (line 60) | public boolean isForceSync() {
    method setForceSync (line 64) | public void setForceSync(boolean forceSync) {
    method getLineSeparator (line 68) | public String getLineSeparator() {
    method setLineSeparator (line 72) | public void setLineSeparator(String separator) {
    method isShouldDeleteIfEmpty (line 76) | public boolean isShouldDeleteIfEmpty() {
    method setShouldDeleteIfEmpty (line 80) | public void setShouldDeleteIfEmpty(boolean delete) {
    method isShouldDeleteIfExists (line 84) | public boolean isShouldDeleteIfExists() {
    method setShouldDeleteIfExists (line 88) | public void setShouldDeleteIfExists(boolean delete) {
    method getFormatterString (line 92) | public String getFormatterString() {
    method setFormatterString (line 96) | public void setFormatterString(String formatterString) {
    method isTransactional (line 100) | public boolean isTransactional() {
    method setTransactional (line 104) | public void setTransactional(boolean transactional) {

FILE: core/riot-file/src/main/java/com/redis/riot/file/WriterFactory.java
  type WriterFactory (line 6) | public interface WriterFactory {
    method create (line 8) | ItemWriter<?> create(WritableResource resource, WriteOptions options);

FILE: core/riot-file/src/main/java/com/redis/riot/file/XmlReaderFactory.java
  class XmlReaderFactory (line 10) | public class XmlReaderFactory extends AbstractReaderFactory {
    method create (line 12) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/XmlWriterFactory.java
  class XmlWriterFactory (line 10) | public class XmlWriterFactory extends AbstractWriterFactory {
    method create (line 12) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/xml/XmlItemReader.java
  class XmlItemReader (line 31) | public class XmlItemReader<T> extends AbstractItemCountingItemStreamItem...
    method XmlItemReader (line 48) | public XmlItemReader(Resource resource, XmlObjectReader<T> xmlObjectRe...
    method setXmlObjectReader (line 61) | public void setXmlObjectReader(XmlObjectReader<T> xmlObjectReader) {
    method setStrict (line 72) | public void setStrict(boolean strict) {
    method setResource (line 76) | @Override
    method doRead (line 81) | @Nullable
    method doOpen (line 87) | @Override
    method doClose (line 106) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/xml/XmlItemReaderBuilder.java
  class XmlItemReaderBuilder (line 7) | public class XmlItemReaderBuilder<T> {
    method xmlObjectReader (line 31) | public XmlItemReaderBuilder<T> xmlObjectReader(XmlObjectReader<T> xmlO...
    method resource (line 43) | public XmlItemReaderBuilder<T> resource(Resource resource) {
    method name (line 57) | public XmlItemReaderBuilder<T> name(String name) {
    method strict (line 71) | public XmlItemReaderBuilder<T> strict(boolean strict) {
    method saveState (line 86) | public XmlItemReaderBuilder<T> saveState(boolean saveState) {
    method maxItemCount (line 99) | public XmlItemReaderBuilder<T> maxItemCount(int maxItemCount) {
    method currentItemCount (line 112) | public XmlItemReaderBuilder<T> currentItemCount(int currentItemCount) {
    method build (line 123) | public XmlItemReader<T> build() {

FILE: core/riot-file/src/main/java/com/redis/riot/file/xml/XmlObjectReader.java
  class XmlObjectReader (line 21) | public class XmlObjectReader<T> {
    method XmlObjectReader (line 33) | public XmlObjectReader(Class<? extends T> itemType) {
    method setMapper (line 42) | public void setMapper(XmlMapper mapper) {
    method open (line 47) | public void open(Resource resource) throws Exception {
    method read (line 64) | @Nullable
    method close (line 76) | public void close() throws Exception {

FILE: core/riot-file/src/main/java/com/redis/riot/file/xml/XmlResourceItemWriter.java
  class XmlResourceItemWriter (line 50) | public class XmlResourceItemWriter<T> extends AbstractFileItemWriter<T> {
    method XmlResourceItemWriter (line 61) | public XmlResourceItemWriter(WritableResource resource, String rootName,
    method setRootName (line 72) | public void setRootName(String rootName) {
    method afterPropertiesSet (line 82) | @Override
    method setXmlObjectMarshaller (line 94) | public void setXmlObjectMarshaller(JsonObjectMarshaller<T> objectMarsh...
    method doWrite (line 98) | @Override

FILE: core/riot-file/src/main/java/com/redis/riot/file/xml/XmlResourceItemWriterBuilder.java
  class XmlResourceItemWriterBuilder (line 33) | public class XmlResourceItemWriterBuilder<T> {
    method saveState (line 59) | public XmlResourceItemWriterBuilder<T> saveState(boolean saveState) {
    method name (line 74) | public XmlResourceItemWriterBuilder<T> name(String name) {
    method lineSeparator (line 88) | public XmlResourceItemWriterBuilder<T> lineSeparator(String lineSepara...
    method xmlObjectMarshaller (line 101) | public XmlResourceItemWriterBuilder<T> xmlObjectMarshaller(JsonObjectM...
    method resource (line 113) | public XmlResourceItemWriterBuilder<T> resource(WritableResource resou...
    method rootName (line 119) | public XmlResourceItemWriterBuilder<T> rootName(String rootName) {
    method encoding (line 131) | public XmlResourceItemWriterBuilder<T> encoding(String encoding) {
    method shouldDeleteIfEmpty (line 145) | public XmlResourceItemWriterBuilder<T> shouldDeleteIfEmpty(boolean sho...
    method shouldDeleteIfExists (line 159) | public XmlResourceItemWriterBuilder<T> shouldDeleteIfExists(boolean sh...
    method append (line 173) | public XmlResourceItemWriterBuilder<T> append(boolean append) {
    method headerCallback (line 186) | public XmlResourceItemWriterBuilder<T> headerCallback(FlatFileHeaderCa...
    method footerCallback (line 199) | public XmlResourceItemWriterBuilder<T> footerCallback(FlatFileFooterCa...
    method build (line 210) | public XmlResourceItemWriter<T> build() {

FILE: core/riot-file/src/test/java/com/redis/riot/file/ReaderTests.java
  class ReaderTests (line 27) | public class ReaderTests {
    method readJsonUrl (line 45) | @Test
    method readJsonGzUrl (line 50) | @Test
    method readJsonS3Url (line 55) | @Test
    method readJsonGoogleStorageUrl (line 62) | @Test
    method readJsonFile (line 67) | @Test
    method urlInputStream (line 76) | private InputStream urlInputStream(String url) throws MalformedURLExce...
    method readJsonLinesUrl (line 80) | @Test
    method readCsvUrl (line 85) | @Test
    method readStdIn (line 92) | @Test
    method assertRead (line 100) | private void assertRead(String location, Class<?> expectedType, int ex...
    method assertRead (line 104) | private void assertRead(String location, ReadOptions options, Class<?>...
    method readAll (line 114) | private <T> List<T> readAll(ItemReader<T> reader) throws Exception {

FILE: core/riot-test/src/main/java/com/redis/riot/test/AbstractRiotTestBase.java
  class AbstractRiotTestBase (line 19) | public abstract class AbstractRiotTestBase extends AbstractTargetTestBase {
    method assertExecutionSuccessful (line 29) | protected static void assertExecutionSuccessful(int exitCode) {
    method command (line 33) | protected <T> T command(ParseResult parseResult) {
    method execute (line 37) | protected int execute(TestInfo info, String filename) throws Exception {
    method execute (line 41) | protected int execute(TestInfo info, String filename, IExecutionStrate...
    method doExecute (line 45) | private int doExecute(TestInfo info, String filename, IExecutionStrate...
    method mainCommand (line 50) | protected abstract MainCommand mainCommand(TestInfo info, IExecutionSt...
    method getMainCommandPrefix (line 52) | protected abstract String getMainCommandPrefix();
    method args (line 54) | private String[] args(MainCommand mainCommand, String filename) throws...
    method translateCommandline (line 65) | protected String[] translateCommandline(String toProcess) throws Excep...

FILE: plugins/riot/src/main/java/com/redis/riot/AbstractCompareCommand.java
  class AbstractCompareCommand (line 31) | public abstract class AbstractCompareCommand extends AbstractRedisTarget...
    method isStruct (line 51) | protected abstract boolean isStruct();
    method filter (line 53) | protected ItemProcessor<KeyValue<byte[]>, KeyValue<byte[]>> filter() {
    method processingWriter (line 57) | protected ItemWriter<KeyValue<byte[]>> processingWriter(ItemWriter<Key...
    method evaluationContext (line 74) | private StandardEvaluationContext evaluationContext() {
    method compareMessage (line 81) | private String compareMessage(KeyComparisonStats stats) {
    method compareStep (line 88) | protected Step<KeyValue<byte[]>, KeyValue<byte[]>> compareStep() {
    method compareRedisReader (line 105) | private RedisItemReader<byte[], byte[]> compareRedisReader() {
    method isQuickCompare (line 114) | protected abstract boolean isQuickCompare();
    method keyComparator (line 116) | private KeyComparator<byte[]> keyComparator() {
    method isIgnoreStreamMessageId (line 125) | protected boolean isIgnoreStreamMessageId() {
    method compareSourceReader (line 129) | private RedisItemReader<byte[], byte[]> compareSourceReader() {
    method compareTargetReader (line 135) | private RedisItemReader<byte[], byte[]> compareTargetReader() {
    method isShowDiffs (line 141) | public boolean isShowDiffs() {
    method setShowDiffs (line 145) | public void setShowDiffs(boolean showDiffs) {
    method getTtlTolerance (line 149) | public RiotDuration getTtlTolerance() {
    method setTtlTolerance (line 153) | public void setTtlTolerance(RiotDuration tolerance) {
    method getProcessorArgs (line 157) | public KeyValueProcessorArgs getProcessorArgs() {
    method setProcessorArgs (line 161) | public void setProcessorArgs(KeyValueProcessorArgs args) {

FILE: plugins/riot/src/main/java/com/redis/riot/AbstractExportCommand.java
  class AbstractExportCommand (line 17) | public abstract class AbstractExportCommand extends AbstractJobCommand {
    method initialize (line 38) | @Override
    method teardown (line 45) | @Override
    method configure (line 53) | protected void configure(StandardEvaluationContext context) {
    method configureSourceRedisReader (line 57) | protected void configureSourceRedisReader(RedisItemReader<?, ?> reader) {
    method configureSourceRedisWriter (line 74) | protected void configureSourceRedisWriter(RedisItemWriter<?, ?, ?> wri...
    method sourceRedisContext (line 79) | protected abstract RedisContext sourceRedisContext();
    method step (line 81) | protected <O> Step<KeyValue<String>, O> step(ItemWriter<O> writer) {
    method getMode (line 89) | public ReaderMode getMode() {
    method setMode (line 93) | public void setMode(ReaderMode mode) {
    method getReaderArgs (line 97) | public RedisReaderArgs getReaderArgs() {
    method setReaderArgs (line 101) | public void setReaderArgs(RedisReaderArgs args) {
    method getReaderLiveArgs (line 105) | public RedisReaderLiveArgs getReaderLiveArgs() {
    method setReaderLiveArgs (line 109) | public void setReaderLiveArgs(RedisReaderLiveArgs args) {
    method getReaderMemoryUsageArgs (line 113) | public MemoryUsageArgs getReaderMemoryUsageArgs() {
    method setReaderMemoryUsageArgs (line 117) | public void setReaderMemoryUsageArgs(MemoryUsageArgs args) {

FILE: plugins/riot/src/main/java/com/redis/riot/AbstractFileExport.java
  class AbstractFileExport (line 32) | public abstract class AbstractFileExport extends AbstractRedisExportComm...
    method initialize (line 48) | @Override
    method resourceMap (line 57) | protected RiotResourceMap resourceMap() {
    method writerRegistry (line 61) | protected FileWriterRegistry writerRegistry() {
    method resourceFactory (line 65) | protected ResourceFactory resourceFactory() {
    method writeOptions (line 71) | private WriteOptions writeOptions() {
    method job (line 78) | @Override
    method getFileType (line 83) | protected abstract MimeType getFileType();
    method step (line 85) | @SuppressWarnings("unchecked")
    method shouldShowProgress (line 101) | @Override
    method isFlatFile (line 106) | protected boolean isFlatFile(MimeType type) {
    method processor (line 111) | @SuppressWarnings("rawtypes")
    method headerRecord (line 119) | private Map<String, Object> headerRecord() {
    method getFile (line 138) | public String getFile() {
    method setFile (line 142) | public void setFile(String file) {
    method getFileWriterArgs (line 146) | public FileWriterArgs getFileWriterArgs() {
    method setFileWriterArgs (line 150) | public void setFileWriterArgs(FileWriterArgs fileWriterArgs) {
    method getContentType (line 154) | public ContentType getContentType() {
    method setContentType (line 158) | public void setContentType(ContentType contentType) {
    method setWriterRegistry (line 162) | public void setWriterRegistry(FileWriterRegistry registry) {

FILE: plugins/riot/src/main/java/com/redis/riot/AbstractFileImport.java
  class AbstractFileImport (line 44) | public abstract class AbstractFileImport extends AbstractRedisImportComm...
    method initialize (line 64) | @Override
    method resourceMap (line 74) | protected RiotResourceMap resourceMap() {
    method readerRegistry (line 78) | protected FileReaderRegistry readerRegistry() {
    method resourceFactory (line 82) | protected ResourceFactory resourceFactory() {
    method job (line 90) | @Override
    method step (line 95) | private Step<?, ?> step(String location) {
    method readOptions (line 124) | private ReadOptions readOptions() {
    method itemType (line 132) | private Class<?> itemType() {
    method writer (line 139) | private RedisItemWriter<?, ?, ?> writer() {
    method getFileType (line 146) | protected abstract MimeType getFileType();
    method regexProcessor (line 148) | private ItemProcessor<Map<String, Object>, Map<String, Object>> regexP...
    method toFieldFunction (line 158) | @SuppressWarnings({ "unchecked", "rawtypes" })
    method getFiles (line 163) | public List<String> getFiles() {
    method setFiles (line 167) | public void setFiles(String... files) {
    method setFiles (line 171) | public void setFiles(List<String> files) {
    method getFileReaderArgs (line 175) | public FileReaderArgs getFileReaderArgs() {
    method setFileReaderArgs (line 179) | public void setFileReaderArgs(FileReaderArgs args) {
    method getRegexes (line 183) | public Map<String, Pattern> getRegexes() {
    method setRegexes (line 187) | public void setRegexes(Map<String, Pattern> regexes) {
    method getReaderRegistry (line 191) | public FileReaderRegistry getReaderRegistry() {
    method setReaderRegistry (line 195) | public void setReaderRegistry(FileReaderRegistry registry) {

FILE: plugins/riot/src/main/java/com/redis/riot/AbstractImportCommand.java
  class AbstractImportCommand (line 43) | @Command(subcommands = { ExpireCommand.class, DelCommand.class, GeoaddCo...
    method initialize (line 68) | @Override
    method teardown (line 75) | @Override
    method operations (line 83) | protected List<Operation<String, String, Map<String, Object>, Object>>...
    method hasOperations (line 87) | protected boolean hasOperations() {
    method step (line 91) | protected Step<Map<String, Object>, Map<String, Object>> step(ItemRead...
    method processor (line 101) | protected ItemProcessor<Map<String, Object>, Map<String, Object>> proc...
    method targetRedisContext (line 109) | protected abstract RedisContext targetRedisContext();
    method processor (line 111) | public static ItemProcessor<Map<String, Object>, Map<String, Object>> ...
    method operationWriter (line 124) | protected RedisItemWriter<String, String, Map<String, Object>> operati...
    method configureTargetRedisWriter (line 128) | protected void configureTargetRedisWriter(RedisItemWriter<?, ?, ?> wri...
    method getTargetRedisWriterArgs (line 134) | public RedisWriterArgs getTargetRedisWriterArgs() {
    method setTargetRedisWriterArgs (line 138) | public void setTargetRedisWriterArgs(RedisWriterArgs args) {
    method getImportOperationCommands (line 142) | public List<OperationCommand> getImportOperationCommands() {
    method setImportOperationCommands (line 146) | public void setImportOperationCommands(OperationCommand... commands) {
    method setImportOperationCommands (line 150) | public void setImportOperationCommands(List<OperationCommand> commands) {
    method getProcessorArgs (line 154) | public ImportProcessorArgs getProcessorArgs() {
    method setProcessorArgs (line 158) | public void setProcessorArgs(ImportProcessorArgs args) {
    method getEvaluationContextArgs (line 162) | public EvaluationContextArgs getEvaluationContextArgs() {
    method setEvaluationContextArgs (line 166) | public void setEvaluationContextArgs(EvaluationContextArgs evaluationC...

FILE: plugins/riot/src/main/java/com/redis/riot/AbstractRedisCommand.java
  class AbstractRedisCommand (line 10) | public abstract class AbstractRedisCommand extends AbstractJobCommand {
    method initialize (line 17) | @Override
    method teardown (line 24) | @Override
    method commands (line 32) | protected RedisModulesCommands<String, String> commands() {
    method configure (line 36) | protected void configure(RedisItemReader<?, ?> reader) {
    method configure (line 41) | protected void configure(RedisItemWriter<?, ?, ?> writer) {
    method getRedisArgs (line 45) | public RedisArgs getRedisArgs() {
    method setRedisArgs (line 49) | public void setRedisArgs(RedisArgs clientArgs) {

FILE: plugins/riot/src/main/java/com/redis/riot/AbstractRedisExportCommand.java
  class AbstractRedisExportCommand (line 16) | public abstract class AbstractRedisExportCommand extends AbstractExportC...
    method sourceRedisContext (line 24) | @Override
    method mapProcessor (line 29) | protected ItemProcessor<KeyValue<String>, Map<String, Object>> mapProc...
    method getRedisArgs (line 37) | public RedisArgs getRedisArgs() {
    method setRedisArgs (line 41) | public void setRedisArgs(RedisArgs clientArgs) {
    method getKeyRegex (line 45) | public Pattern getKeyRegex() {
    method setKeyRegex (line 49) | public void setKeyRegex(Pattern regex) {

FILE: plugins/riot/src/main/java/com/redis/riot/AbstractRedisImportCommand.java
  class AbstractRedisImportCommand (line 5) | public abstract class AbstractRedisImportCommand extends AbstractImportC...
    method targetRedisContext (line 10) | @Override
    method getRedisArgs (line 15) | public RedisArgs getRedisArgs() {
    method setRedisArgs (line 19) | public void setRedisArgs(RedisArgs clientArgs) {

FILE: plugins/riot/src/main/java/com/redis/riot/AbstractRedisTargetExportCommand.java
  class AbstractRedisTargetExportCommand (line 12) | public abstract class AbstractRedisTargetExportCommand extends AbstractE...
    method initialize (line 31) | @Override
    method teardown (line 38) | @Override
    method sourceRedisContext (line 46) | @Override
    method targetRedisContext (line 52) | protected RedisContext targetRedisContext() {
    method configure (line 57) | @Override
    method configureTargetRedisReader (line 63) | protected void configureTargetRedisReader(RedisItemReader<?, ?> reader) {
    method configureTargetRedisWriter (line 68) | protected void configureTargetRedisWriter(RedisItemWriter<?, ?, ?> wri...
    method getSourceRedisUri (line 72) | public RedisURI getSourceRedisUri() {
    method setSourceRedisUri (line 76) | public void setSourceRedisUri(RedisURI sourceRedisUri) {
    method getSourceRedisArgs (line 80) | public SourceRedisArgs getSourceRedisArgs() {
    method setSourceRedisArgs (line 84) | public void setSourceRedisArgs(SourceRedisArgs sourceRedisArgs) {
    method getTargetRedisUri (line 88) | public RedisURI getTargetRedisUri() {
    method setTargetRedisUri (line 92) | public void setTargetRedisUri(RedisURI targetRedisUri) {
    method getTargetRedisArgs (line 96) | public TargetRedisArgs getTargetRedisArgs() {
    method setTargetRedisArgs (line 100) | public void setTargetRedisArgs(TargetRedisArgs targetRedisArgs) {

FILE: plugins/riot/src/main/java/com/redis/riot/Compare.java
  class Compare (line 8) | @Command(name = "compare", description = "Compare two Redis databases.")
    method isStruct (line 17) | @Override
    method isQuickCompare (line 22) | @Override
    method isIgnoreStreamMessageId (line 27) | @Override
    method job (line 32) | @Override
    method isCompareStreamMessageId (line 37) | public boolean isCompareStreamMessageId() {
    method setCompareStreamMessageId (line 41) | public void setCompareStreamMessageId(boolean streamMessageId) {

FILE: plugins/riot/src/main/java/com/redis/riot/CompareLoggingWriteListener.java
  class CompareLoggingWriteListener (line 14) | public class CompareLoggingWriteListener<K> implements KeyComparisonList...
    method CompareLoggingWriteListener (line 20) | public CompareLoggingWriteListener(RedisCodec<K, ?> codec) {
    method comparison (line 24) | @Override
    method key (line 46) | private String key(KeyComparison<K> comparison) {

FILE: plugins/riot/src/main/java/com/redis/riot/CompareMode.java
  type CompareMode (line 3) | public enum CompareMode {

FILE: plugins/riot/src/main/java/com/redis/riot/CompareStepListener.java
  class CompareStepListener (line 20) | public class CompareStepListener implements StepExecutionListener {
    method CompareStepListener (line 26) | public CompareStepListener(KeyComparisonStats stats) {
    method afterStep (line 30) | @Override
    method verificationFailedExitDescription (line 43) | protected String verificationFailedExitDescription() {
    method statsByStatus (line 54) | public static Set<Entry<Status, List<KeyComparisonStat>>> statsByStatu...
    method compareStatus (line 64) | private static int compareStatus(Status status1, Status status2) {

FILE: plugins/riot/src/main/java/com/redis/riot/ContentType.java
  type ContentType (line 3) | public enum ContentType {

FILE: plugins/riot/src/main/java/com/redis/riot/DataSourceArgs.java
  class DataSourceArgs (line 11) | @ToString
    method dataSource (line 26) | public DataSource dataSource() throws Exception {
    method getDriver (line 37) | public String getDriver() {
    method setDriver (line 41) | public void setDriver(String driver) {
    method getUrl (line 45) | public String getUrl() {
    method setUrl (line 49) | public void setUrl(String url) {
    method getUsername (line 53) | public String getUsername() {
    method setUsername (line 57) | public void setUsername(String username) {
    method getPassword (line 61) | public String getPassword() {
    method setPassword (line 65) | public void setPassword(String password) {

FILE: plugins/riot/src/main/java/com/redis/riot/DatabaseExport.java
  class DatabaseExport (line 21) | @Command(name = "db-export", description = "Export Redis data to a relat...
    method job (line 35) | @Override
    method writer (line 40) | private JdbcBatchItemWriter<Map<String, Object>> writer() {
    class NullableSqlParameterSource (line 60) | private static class NullableSqlParameterSource extends MapSqlParamete...
      method NullableSqlParameterSource (line 62) | public NullableSqlParameterSource(@Nullable Map<String, ?> values) {
      method getValue (line 66) | @Override
    method getSql (line 77) | public String getSql() {
    method setSql (line 81) | public void setSql(String sql) {
    method isAssertUpdates (line 85) | public boolean isAssertUpdates() {
    method setAssertUpdates (line 89) | public void setAssertUpdates(boolean assertUpdates) {
    method getDataSourceArgs (line 93) | public DataSourceArgs getDataSourceArgs() {
    method setDataSourceArgs (line 97) | public void setDataSourceArgs(DataSourceArgs dataSourceArgs) {

FILE: plugins/riot/src/main/java/com/redis/riot/DatabaseImport.java
  class DatabaseImport (line 12) | @Command(name = "db-import", description = "Import from a relational dat...
    method job (line 24) | @Override
    method reader (line 29) | protected JdbcCursorItemReader<Map<String, Object>> reader() {
    method getSql (line 34) | public String getSql() {
    method setSql (line 38) | public void setSql(String sql) {
    method getReaderArgs (line 42) | public DatabaseReaderArgs getReaderArgs() {
    method setReaderArgs (line 46) | public void setReaderArgs(DatabaseReaderArgs args) {
    method getDataSourceArgs (line 50) | public DataSourceArgs getDataSourceArgs() {
    method setDataSourceArgs (line 54) | public void setDataSourceArgs(DataSourceArgs args) {

FILE: plugins/riot/src/main/java/com/redis/riot/DatabaseReaderArgs.java
  class DatabaseReaderArgs (line 10) | @ToString
    method getMaxItemCount (line 36) | public int getMaxItemCount() {
    method setMaxItemCount (line 40) | public void setMaxItemCount(int maxItemCount) {
    method getFetchSize (line 44) | public int getFetchSize() {
    method setFetchSize (line 48) | public void setFetchSize(int fetchSize) {
    method getMaxRows (line 57) | public int getMaxRows() {
    method setMaxRows (line 61) | public void setMaxRows(int maxResultSetRows) {
    method getQueryTimeout (line 65) | public RiotDuration getQueryTimeout() {
    method setQueryTimeout (line 69) | public void setQueryTimeout(RiotDuration queryTimeout) {
    method isUseSharedExtendedConnection (line 73) | public boolean isUseSharedExtendedConnection() {
    method setUseSharedExtendedConnection (line 77) | public void setUseSharedExtendedConnection(boolean useSharedExtendedCo...
    method isVerifyCursorPosition (line 81) | public boolean isVerifyCursorPosition() {
    method setVerifyCursorPosition (line 85) | public void setVerifyCursorPosition(boolean verifyCursorPosition) {

FILE: plugins/riot/src/main/java/com/redis/riot/EvaluationContextArgs.java
  class EvaluationContextArgs (line 19) | @ToString
    method evaluationContext (line 39) | public StandardEvaluationContext evaluationContext() {
    method getDateFormat (line 54) | public String getDateFormat() {
    method setDateFormat (line 58) | public void setDateFormat(String format) {
    method getVarExpressions (line 62) | public Map<String, Expression> getVarExpressions() {
    method setVarExpressions (line 66) | public void setVarExpressions(Map<String, Expression> expressions) {
    method getVars (line 70) | public Map<String, Object> getVars() {
    method setVars (line 74) | public void setVars(Map<String, Object> variables) {
    method getNumberFormat (line 78) | public String getNumberFormat() {
    method setNumberFormat (line 82) | public void setNumberFormat(String numberFormat) {

FILE: plugins/riot/src/main/java/com/redis/riot/ExportStepHelper.java
  class ExportStepHelper (line 21) | public class ExportStepHelper {
    method ExportStepHelper (line 28) | public ExportStepHelper(Logger log) {
    method step (line 32) | public <K, V, T, O> Step<KeyValue<K>, O> step(RedisItemReader<K, V> re...
    method checkNotifyConfig (line 48) | public static void checkNotifyConfig(AbstractRedisClient client, Logge...
    method characterSet (line 66) | private static Set<Character> characterSet(String string) {

FILE: plugins/riot/src/main/java/com/redis/riot/ExpressionProcessor.java
  class ExpressionProcessor (line 10) | public class ExpressionProcessor implements ItemProcessor<Map<String, Ob...
    method ExpressionProcessor (line 15) | public ExpressionProcessor(EvaluationContext context, Map<String, Expr...
    method process (line 20) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/FakerImport.java
  class FakerImport (line 15) | @Command(name = "faker", description = "Import Faker data.")
    method job (line 33) | @Override
    method reader (line 38) | private FakerItemReader reader() {
    method getSearchIndex (line 46) | public String getSearchIndex() {
    method setSearchIndex (line 50) | public void setSearchIndex(String index) {
    method getLocale (line 54) | public Locale getLocale() {
    method setLocale (line 58) | public void setLocale(Locale locale) {
    method getFields (line 62) | public Map<String, String> getFields() {
    method setFields (line 66) | public void setFields(Map<String, String> fields) {
    method getCount (line 70) | public int getCount() {
    method setCount (line 74) | public void setCount(int count) {

FILE: plugins/riot/src/main/java/com/redis/riot/FileArgs.java
  class FileArgs (line 9) | @ToString
    method getS3Args (line 30) | public S3Args getS3Args() {
    method setS3Args (line 34) | public void setS3Args(S3Args args) {
    method getGoogleStorageArgs (line 38) | public GoogleStorageArgs getGoogleStorageArgs() {
    method setGoogleStorageArgs (line 42) | public void setGoogleStorageArgs(GoogleStorageArgs gcpArgs) {
    method isGzipped (line 46) | public boolean isGzipped() {
    method setGzipped (line 50) | public void setGzipped(boolean gzipped) {
    method getEncoding (line 54) | public String getEncoding() {
    method setEncoding (line 58) | public void setEncoding(String encoding) {
    method getQuoteCharacter (line 62) | public char getQuoteCharacter() {
    method setQuoteCharacter (line 66) | public void setQuoteCharacter(char character) {
    method getDelimiter (line 70) | public String getDelimiter() {
    method setDelimiter (line 74) | public void setDelimiter(String delimiter) {
    method apply (line 78) | public void apply(FileOptions options) {

FILE: plugins/riot/src/main/java/com/redis/riot/FileExport.java
  class FileExport (line 8) | @Command(name = "file-export", description = "Export Redis data to files.")
    method getFileType (line 14) | @Override
    method getFileTypeArgs (line 19) | public FileTypeArgs getFileTypeArgs() {
    method setFileTypeArgs (line 23) | public void setFileTypeArgs(FileTypeArgs fileTypeArgs) {

FILE: plugins/riot/src/main/java/com/redis/riot/FileImport.java
  class FileImport (line 8) | @Command(name = "file-import", description = "Import data from files.")
    method getFileType (line 14) | @Override
    method getFileTypeArgs (line 19) | public FileTypeArgs getFileTypeArgs() {
    method setFileTypeArgs (line 23) | public void setFileTypeArgs(FileTypeArgs fileTypeArgs) {

FILE: plugins/riot/src/main/java/com/redis/riot/FileReaderArgs.java
  class FileReaderArgs (line 11) | @ToString
    method readOptions (line 38) | public ReadOptions readOptions() {
    method isHeader (line 52) | public boolean isHeader() {
    method setHeader (line 56) | public void setHeader(boolean header) {
    method getColumnRanges (line 60) | public List<String> getColumnRanges() {
    method setColumnRanges (line 64) | public void setColumnRanges(List<String> columnRanges) {
    method getContinuationString (line 68) | public String getContinuationString() {
    method setContinuationString (line 72) | public void setContinuationString(String continuationString) {
    method getFields (line 76) | public List<String> getFields() {
    method setFields (line 80) | public void setFields(List<String> fields) {
    method getHeaderLine (line 84) | public Integer getHeaderLine() {
    method setHeaderLine (line 88) | public void setHeaderLine(Integer headerLine) {
    method getIncludedFields (line 92) | public Set<Integer> getIncludedFields() {
    method setIncludedFields (line 96) | public void setIncludedFields(Set<Integer> fields) {
    method getLinesToSkip (line 100) | public Integer getLinesToSkip() {
    method setLinesToSkip (line 104) | public void setLinesToSkip(Integer linesToSkip) {
    method getMaxItemCount (line 108) | public int getMaxItemCount() {
    method setMaxItemCount (line 112) | public void setMaxItemCount(int maxItemCount) {

FILE: plugins/riot/src/main/java/com/redis/riot/FileTypeArgs.java
  class FileTypeArgs (line 14) | public class FileTypeArgs {
    method getType (line 20) | public MimeType getType() {
    method setType (line 24) | public void setType(MimeType type) {
    method typeMap (line 30) | public static Map<String, MimeType> typeMap() {
    class FileTypeConverter (line 42) | static class FileTypeConverter implements ITypeConverter<MimeType> {
      method convert (line 44) | @Override
    class FileTypeCandidates (line 50) | @SuppressWarnings("serial")
      method FileTypeCandidates (line 53) | FileTypeCandidates() {

FILE: plugins/riot/src/main/java/com/redis/riot/FileWriterArgs.java
  class FileWriterArgs (line 9) | @ToString
    method fileWriterOptions (line 44) | public WriteOptions fileWriterOptions() {
    method isHeader (line 61) | public boolean isHeader() {
    method setHeader (line 65) | public void setHeader(boolean header) {
    method getRootName (line 69) | public String getRootName() {
    method setRootName (line 73) | public void setRootName(String name) {
    method getElementName (line 77) | public String getElementName() {
    method setElementName (line 81) | public void setElementName(String name) {
    method isAppend (line 85) | public boolean isAppend() {
    method setAppend (line 89) | public void setAppend(boolean append) {
    method isForceSync (line 93) | public boolean isForceSync() {
    method setForceSync (line 97) | public void setForceSync(boolean forceSync) {
    method getLineSeparator (line 101) | public String getLineSeparator() {
    method setLineSeparator (line 105) | public void setLineSeparator(String separator) {
    method isShouldDeleteIfEmpty (line 109) | public boolean isShouldDeleteIfEmpty() {
    method setShouldDeleteIfEmpty (line 113) | public void setShouldDeleteIfEmpty(boolean delete) {
    method isShouldDeleteIfExists (line 117) | public boolean isShouldDeleteIfExists() {
    method setShouldDeleteIfExists (line 121) | public void setShouldDeleteIfExists(boolean delete) {
    method getFormatterString (line 125) | public String getFormatterString() {
    method setFormatterString (line 129) | public void setFormatterString(String formatterString) {
    method isTransactional (line 133) | public boolean isTransactional() {
    method setTransactional (line 137) | public void setTransactional(boolean transactional) {

FILE: plugins/riot/src/main/java/com/redis/riot/Generate.java
  class Generate (line 20) | @Command(name = "gen", aliases = "generate", description = "Generate Red...
    method job (line 31) | @Override
    method writer (line 42) | private RedisItemWriter<String, String, KeyValue<String>> writer() {
    method indexCreateOptions (line 50) | private CreateOptions<String, String> indexCreateOptions() {
    method indexOn (line 57) | private CreateOptions.DataType indexOn() {
    method isJson (line 64) | private boolean isJson() {
    method indexFields (line 68) | @SuppressWarnings("unchecked")
    method indexField (line 78) | private Field<String> indexField(int index) {
    method indexFieldCount (line 86) | private int indexFieldCount() {
    method reader (line 93) | private GeneratorItemReader reader() {
    method getRedisWriterArgs (line 100) | public RedisWriterArgs getRedisWriterArgs() {
    method setRedisWriterArgs (line 104) | public void setRedisWriterArgs(RedisWriterArgs args) {
    method getGenerateArgs (line 108) | public GenerateArgs getGenerateArgs() {
    method setGenerateArgs (line 112) | public void setGenerateArgs(GenerateArgs args) {

FILE: plugins/riot/src/main/java/com/redis/riot/GenerateArgs.java
  class GenerateArgs (line 19) | @ToString
    method zsetOptions (line 96) | private ZsetOptions zsetOptions() {
    method timeseriesOptions (line 104) | private TimeSeriesOptions timeseriesOptions() {
    method stringOptions (line 113) | private StringOptions stringOptions() {
    method streamOptions (line 119) | private StreamOptions streamOptions() {
    method setOptions (line 126) | private CollectionOptions setOptions() {
    method listOptions (line 130) | private CollectionOptions listOptions() {
    method collectionOptions (line 134) | private CollectionOptions collectionOptions(Range memberCount, Range m...
    method jsonOptions (line 141) | private MapOptions jsonOptions() {
    method hashOptions (line 145) | private MapOptions hashOptions() {
    method mapOptions (line 149) | private MapOptions mapOptions(Range fieldCount, Range fieldLength) {
    method configure (line 156) | public void configure(GeneratorItemReader reader) {
    method getCount (line 172) | public int getCount() {
    method setCount (line 176) | public void setCount(int count) {
    method getKeyspace (line 180) | public String getKeyspace() {
    method setKeyspace (line 184) | public void setKeyspace(String keyspace) {
    method getKeyRange (line 188) | public Range getKeyRange() {
    method setKeyRange (line 192) | public void setKeyRange(Range keyRange) {
    method getTypes (line 196) | public List<ItemType> getTypes() {
    method setTypes (line 200) | public void setTypes(List<ItemType> types) {
    method getExpiration (line 204) | public Range getExpiration() {
    method setExpiration (line 208) | public void setExpiration(Range expiration) {
    method getHashFieldCount (line 212) | public Range getHashFieldCount() {
    method setHashFieldCount (line 216) | public void setHashFieldCount(Range hashFieldCount) {
    method getHashFieldLength (line 220) | public Range getHashFieldLength() {
    method setHashFieldLength (line 224) | public void setHashFieldLength(Range hashFieldLength) {
    method getJsonFieldCount (line 228) | public Range getJsonFieldCount() {
    method setJsonFieldCount (line 232) | public void setJsonFieldCount(Range jsonFieldCount) {
    method getJsonFieldLength (line 236) | public Range getJsonFieldLength() {
    method setJsonFieldLength (line 240) | public void setJsonFieldLength(Range jsonFieldLength) {
    method getListMemberCount (line 244) | public Range getListMemberCount() {
    method setListMemberCount (line 248) | public void setListMemberCount(Range listMemberCount) {
    method getListMemberRange (line 252) | public Range getListMemberRange() {
    method setListMemberRange (line 256) | public void setListMemberRange(Range listMemberRange) {
    method getSetMemberCount (line 260) | public Range getSetMemberCount() {
    method setSetMemberCount (line 264) | public void setSetMemberCount(Range setMemberCount) {
    method getSetMemberLength (line 268) | public Range getSetMemberLength() {
    method setSetMemberLength (line 272) | public void setSetMemberLength(Range setMemberLength) {
    method getStreamMessageCount (line 276) | public Range getStreamMessageCount() {
    method setStreamMessageCount (line 280) | public void setStreamMessageCount(Range streamMessageCount) {
    method getStreamFieldCount (line 284) | public Range getStreamFieldCount() {
    method setStreamFieldCount (line 288) | public void setStreamFieldCount(Range streamFieldCount) {
    method getStreamFieldLength (line 292) | public Range getStreamFieldLength() {
    method setStreamFieldLength (line 296) | public void setStreamFieldLength(Range streamFieldLength) {
    method getStringLength (line 300) | public Range getStringLength() {
    method setStringLength (line 304) | public void setStringLength(Range stringLength) {
    method getTimeseriesSampleCount (line 308) | public Range getTimeseriesSampleCount() {
    method setTimeseriesSampleCount (line 312) | public void setTimeseriesSampleCount(Range timeseriesSampleCount) {
    method getTimeseriesStartTime (line 316) | public Instant getTimeseriesStartTime() {
    method setTimeseriesStartTime (line 320) | public void setTimeseriesStartTime(Instant timeseriesStartTime) {
    method getZsetMemberCount (line 324) | public Range getZsetMemberCount() {
    method setZsetMemberCount (line 328) | public void setZsetMemberCount(Range zsetMemberCount) {
    method getZsetMemberLength (line 332) | public Range getZsetMemberLength() {
    method setZsetMemberLength (line 336) | public void setZsetMemberLength(Range zsetMemberLength) {
    method getZsetScore (line 340) | public Range getZsetScore() {
    method setZsetScore (line 344) | public void setZsetScore(Range zsetScore) {
    method getIndex (line 348) | public String getIndex() {
    method setIndex (line 352) | public void setIndex(String index) {
    method getKeySepataror (line 356) | public String getKeySepataror() {
    method setKeySepataror (line 360) | public void setKeySepataror(String keySepataror) {

FILE: plugins/riot/src/main/java/com/redis/riot/GoogleStorageArgs.java
  class GoogleStorageArgs (line 10) | @ToString
    method getKeyFile (line 22) | public Path getKeyFile() {
    method setKeyFile (line 26) | public void setKeyFile(Path file) {
    method getProjectId (line 30) | public String getProjectId() {
    method setProjectId (line 34) | public void setProjectId(String id) {
    method getEncodedKey (line 38) | public String getEncodedKey() {
    method setEncodedKey (line 42) | public void setEncodedKey(String key) {
    method googleStorageOptions (line 46) | public GoogleStorageOptions googleStorageOptions() {

FILE: plugins/riot/src/main/java/com/redis/riot/ImportProcessorArgs.java
  class ImportProcessorArgs (line 10) | @ToString
    method getExpressions (line 19) | public Map<String, Expression> getExpressions() {
    method setExpressions (line 23) | public void setExpressions(Map<String, Expression> expressions) {
    method getFilter (line 27) | public Expression getFilter() {
    method setFilter (line 31) | public void setFilter(Expression filter) {

FILE: plugins/riot/src/main/java/com/redis/riot/JdbcCursorItemReaderFactory.java
  class JdbcCursorItemReaderFactory (line 13) | public class JdbcCursorItemReaderFactory {
    method create (line 15) | public static JdbcCursorItemReaderBuilder<Map<String, Object>> create(...

FILE: plugins/riot/src/main/java/com/redis/riot/KeyFilterArgs.java
  class KeyFilterArgs (line 19) | @ToString
    method predicate (line 31) | public <K> Optional<Predicate<K>> predicate(RedisCodec<K, ?> codec) {
    method globPredicate (line 43) | private <K> Optional<Predicate<K>> globPredicate(RedisCodec<K, ?> code...
    method encodePredicate (line 49) | private <K> Predicate<K> encodePredicate(Predicate<String> predicate, ...
    method globPredicate (line 53) | private Optional<Predicate<String>> globPredicate() {
    method globPredicate (line 65) | private Optional<Predicate<String>> globPredicate(List<String> pattern...
    method slotsPredicate (line 72) | private <K> Optional<Predicate<K>> slotsPredicate(RedisCodec<K, ?> cod...
    method between (line 79) | public static IntPredicate between(int start, int end) {
    method slot (line 83) | private <K> int slot(RedisCodec<K, ?> codec, K key) {
    method slotRangePredicate (line 87) | public <K> Predicate<K> slotRangePredicate(RedisCodec<K, ?> codec, Ran...
    method getIncludes (line 92) | public List<String> getIncludes() {
    method setIncludes (line 96) | public void setIncludes(List<String> includes) {
    method getExcludes (line 100) | public List<String> getExcludes() {
    method setExcludes (line 104) | public void setExcludes(List<String> excludes) {
    method getSlots (line 108) | public List<Range> getSlots() {
    method setSlots (line 112) | public void setSlots(List<Range> slots) {

FILE: plugins/riot/src/main/java/com/redis/riot/KeyValueDeserializer.java
  class KeyValueDeserializer (line 24) | @SuppressWarnings("rawtypes")
    method KeyValueDeserializer (line 40) | public KeyValueDeserializer() {
    method KeyValueDeserializer (line 44) | public KeyValueDeserializer(Class<KeyValue<String>> t) {
    method deserialize (line 48) | @Override
    method value (line 75) | private Object value(String type, JsonNode node, DeserializationContex...
    method samples (line 100) | private Collection<Sample> samples(ArrayNode node) {
    method sample (line 111) | private Sample sample(JsonNode node) {
    method scoredValues (line 119) | private Set<ScoredValue<String>> scoredValues(ArrayNode node) {
    method scoredValue (line 130) | private ScoredValue<String> scoredValue(JsonNode scoredValueNode) {
    method streamMessages (line 138) | private Collection<StreamMessage<String, String>> streamMessages(Array...
    method streamMessage (line 150) | @SuppressWarnings("unchecked")

FILE: plugins/riot/src/main/java/com/redis/riot/KeyValueFilter.java
  class KeyValueFilter (line 15) | public class KeyValueFilter<K, T extends KeyValue<K>> implements ItemPro...
    method KeyValueFilter (line 21) | public KeyValueFilter(RedisCodec<K, ?> codec) {
    method process (line 25) | @Override
    method string (line 37) | private String string(K key) {

FILE: plugins/riot/src/main/java/com/redis/riot/KeyValueProcessorArgs.java
  class KeyValueProcessorArgs (line 21) | @ToString
    method processor (line 42) | public ItemProcessor<KeyValue<String>, KeyValue<String>> processor(Eva...
    method processor (line 65) | private <T> ItemProcessor<T, T> processor(Consumer<T> consumer) {
    method getKeyExpression (line 69) | public TemplateExpression getKeyExpression() {
    method setKeyExpression (line 73) | public void setKeyExpression(TemplateExpression expression) {
    method getTypeExpression (line 77) | public Expression getTypeExpression() {
    method setTypeExpression (line 81) | public void setTypeExpression(Expression expression) {
    method getTtlExpression (line 85) | public Expression getTtlExpression() {
    method setTtlExpression (line 89) | public void setTtlExpression(Expression expression) {
    method isNoTtl (line 93) | public boolean isNoTtl() {
    method setNoTtl (line 97) | public void setNoTtl(boolean noTtl) {
    method isNoStreamIds (line 101) | public boolean isNoStreamIds() {
    method setNoStreamIds (line 105) | public void setNoStreamIds(boolean noStreamIds) {
    method isPrune (line 109) | public boolean isPrune() {
    method setPrune (line 113) | public void setPrune(boolean prune) {

FILE: plugins/riot/src/main/java/com/redis/riot/MemoryUsageArgs.java
  class MemoryUsageArgs (line 10) | public class MemoryUsageArgs {
    method getLimit (line 20) | public DataSize getLimit() {
    method setLimit (line 24) | public void setLimit(DataSize limit) {
    method getSamples (line 28) | public int getSamples() {
    method setSamples (line 32) | public void setSamples(int samples) {
    method configure (line 36) | public void configure(RedisItemReader<?, ?> reader) {

FILE: plugins/riot/src/main/java/com/redis/riot/Ping.java
  class Ping (line 27) | @Command(name = "ping", description = "Test connectivity to a Redis serv...
    method job (line 49) | @Override
    method defaultPercentiles (line 60) | public static Set<Double> defaultPercentiles() {
    class PingLatencyItemWriter (line 64) | class PingLatencyItemWriter implements ItemWriter<PingExecution> {
      method write (line 66) | @Override
      method commandLatency (line 79) | private CommandLatency commandLatency(LatencyStats stats) {
      method time (line 86) | private long time(long value) {
    method getCount (line 92) | public int getCount() {
    method setCount (line 96) | public void setCount(int count) {
    method getTimeUnit (line 100) | public TimeUnit getTimeUnit() {
    method setTimeUnit (line 104) | public void setTimeUnit(TimeUnit timeUnit) {
    method getPercentiles (line 108) | public Set<Double> getPercentiles() {
    method setPercentiles (line 112) | public void setPercentiles(Set<Double> percentiles) {

FILE: plugins/riot/src/main/java/com/redis/riot/PingExecution.java
  class PingExecution (line 5) | public class PingExecution {
    method reply (line 13) | public PingExecution reply(String reply) {
    method isSuccess (line 19) | public boolean isSuccess() {
    method getReply (line 23) | public String getReply() {
    method getDuration (line 27) | public Duration getDuration() {
    method time (line 31) | private static long time() {

FILE: plugins/riot/src/main/java/com/redis/riot/PingExecutionItemReader.java
  class PingExecutionItemReader (line 8) | public class PingExecutionItemReader extends AbstractItemCountingItemStr...
    method PingExecutionItemReader (line 12) | public PingExecutionItemReader(RedisCommands<String, String> redisComm...
    method doOpen (line 17) | @Override
    method doClose (line 22) | @Override
    method doRead (line 27) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/RangeConverter.java
  class RangeConverter (line 9) | public class RangeConverter implements ITypeConverter<Range> {
    method convert (line 13) | @Override
    method max (line 25) | private static int max(String value) {

FILE: plugins/riot/src/main/java/com/redis/riot/ReadFrom.java
  type ReadFrom (line 3) | public enum ReadFrom {
    method ReadFrom (line 15) | private ReadFrom(io.lettuce.core.ReadFrom readFrom) {
    method getReadFrom (line 19) | public io.lettuce.core.ReadFrom getReadFrom() {

FILE: plugins/riot/src/main/java/com/redis/riot/RedisArgs.java
  class RedisArgs (line 12) | @ToString
    method getKeystore (line 88) | @Override
    method setKeystore (line 93) | public void setKeystore(File keystore) {
    method getKeystorePassword (line 97) | @Override
    method setKeystorePassword (line 102) | public void setKeystorePassword(char[] keystorePassword) {
    method getTruststore (line 106) | @Override
    method setTruststore (line 111) | public void setTruststore(File truststore) {
    method getTruststorePassword (line 115) | @Override
    method setTruststorePassword (line 120) | public void setTruststorePassword(char[] truststorePassword) {
    method getKeyCert (line 124) | @Override
    method setKeyCert (line 129) | public void setKeyCert(File keyCert) {
    method getKey (line 133) | @Override
    method setKey (line 138) | public void setKey(File key) {
    method getKeyPassword (line 142) | @Override
    method setKeyPassword (line 147) | public void setKeyPassword(char[] keyPassword) {
    method getTrustedCerts (line 151) | @Override
    method setTrustedCerts (line 156) | public void setTrustedCerts(File trustedCerts) {
    method isCluster (line 160) | @Override
    method setCluster (line 165) | public void setCluster(boolean cluster) {
    method getProtocolVersion (line 169) | @Override
    method setProtocolVersion (line 174) | public void setProtocolVersion(ProtocolVersion version) {
    method getUri (line 178) | public RedisURI getUri() {
    method setUri (line 182) | public void setUri(RedisURI uri) {
    method getHost (line 186) | @Override
    method setHost (line 191) | public void setHost(String host) {
    method getPort (line 195) | @Override
    method setPort (line 200) | public void setPort(int port) {
    method getSocket (line 204) | @Override
    method setSocket (line 209) | public void setSocket(String socket) {
    method getUsername (line 213) | @Override
    method setUsername (line 218) | public void setUsername(String username) {
    method getPassword (line 222) | @Override
    method setPassword (line 227) | public void setPassword(char[] password) {
    method getTimeout (line 231) | @Override
    method setTimeout (line 236) | public void setTimeout(RiotDuration timeout) {
    method getDatabase (line 240) | @Override
    method setDatabase (line 245) | public void setDatabase(int database) {
    method isTls (line 249) | @Override
    method setTls (line 254) | public void setTls(boolean tls) {
    method isInsecure (line 258) | @Override
    method setInsecure (line 263) | public void setInsecure(boolean insecure) {
    method getClientName (line 267) | @Override
    method setClientName (line 272) | public void setClientName(String clientName) {
    method getPoolSize (line 276) | @Override
    method setPoolSize (line 281) | public void setPoolSize(int poolSize) {
    method getReadFrom (line 285) | @Override
    method setReadFrom (line 290) | public void setReadFrom(ReadFrom readFrom) {

FILE: plugins/riot/src/main/java/com/redis/riot/RedisClientArgs.java
  type RedisClientArgs (line 11) | public interface RedisClientArgs {
    method getHost (line 21) | default String getHost() {
    method getPort (line 25) | default int getPort() {
    method getSocket (line 29) | default String getSocket() {
    method getUsername (line 33) | default String getUsername() {
    method getPassword (line 37) | default char[] getPassword() {
    method getTimeout (line 41) | default RiotDuration getTimeout() {
    method getDatabase (line 45) | default int getDatabase() {
    method isTls (line 49) | default boolean isTls() {
    method isInsecure (line 53) | default boolean isInsecure() {
    method getClientName (line 57) | default String getClientName() {
    method isCluster (line 61) | default boolean isCluster() {
    method getProtocolVersion (line 65) | default ProtocolVersion getProtocolVersion() {
    method getPoolSize (line 69) | default int getPoolSize() {
    method getReadFrom (line 73) | default ReadFrom getReadFrom() {
    method getKeystore (line 77) | default File getKeystore() {
    method getKeystorePassword (line 81) | default char[] getKeystorePassword() {
    method getTruststore (line 85) | default File getTruststore() {
    method getTruststorePassword (line 89) | default char[] getTruststorePassword() {
    method getKeyCert (line 93) | default File getKeyCert() {
    method getKey (line 97) | default File getKey() {
    method getKeyPassword (line 101) | default char[] getKeyPassword() {
    method getTrustedCerts (line 105) | default File getTrustedCerts() {

FILE: plugins/riot/src/main/java/com/redis/riot/RedisContext.java
  class RedisContext (line 24) | @ToString
    method afterPropertiesSet (line 38) | @Override
    method clientOptions (line 49) | private ClientOptions clientOptions() {
    method configure (line 56) | public void configure(RedisItemReader<?, ?> reader) {
    method configure (line 63) | public void configure(RedisItemWriter<?, ?, ?> writer) {
    method close (line 68) | @Override
    method uriBuilder (line 79) | private static RedisURIBuilder uriBuilder(RedisClientArgs args) {
    method of (line 96) | public static RedisContext of(RedisURI uri, RedisClientArgs args) {
    method of (line 107) | public static RedisContext of(RedisArgs args) {
    method sslOptions (line 111) | private static SslOptions sslOptions(RedisClientArgs args) {
    method getClient (line 128) | public AbstractRedisClient getClient() {
    method getConnection (line 132) | public StatefulRedisModulesConnection<String, String> getConnection() {
    method getUri (line 136) | public RedisURI getUri() {
    method uri (line 140) | public RedisContext uri(RedisURI uri) {
    method isCluster (line 145) | public boolean isCluster() {
    method cluster (line 149) | public RedisContext cluster(boolean cluster) {
    method getProtocolVersion (line 154) | public ProtocolVersion getProtocolVersion() {
    method protocolVersion (line 158) | public RedisContext protocolVersion(ProtocolVersion protocolVersion) {
    method getSslOptions (line 163) | public SslOptions getSslOptions() {
    method sslOptions (line 167) | public RedisContext sslOptions(SslOptions sslOptions) {
    method getPoolSize (line 172) | public int getPoolSize() {
    method poolSize (line 176) | public RedisContext poolSize(int size) {
    method getReadFrom (line 181) | public ReadFrom getReadFrom() {
    method readFrom (line 185) | public RedisContext readFrom(ReadFrom readFrom) {
    method getClientResources (line 190) | public ClientResources getClientResources() {
    method clientResources (line 194) | public RedisContext clientResources(ClientResources clientResources) {

FILE: plugins/riot/src/main/java/com/redis/riot/RedisReaderArgs.java
  class RedisReaderArgs (line 21) | @ToString
    method configure (line 61) | public <K> void configure(RedisItemReader<K, ?> reader) {
    method keyProcessor (line 74) | private <K> ItemProcessor<KeyEvent<K>, KeyEvent<K>> keyProcessor(Redis...
    method getKeyPattern (line 79) | public String getKeyPattern() {
    method setKeyPattern (line 83) | public void setKeyPattern(String scanMatch) {
    method getScanCount (line 87) | public long getScanCount() {
    method setScanCount (line 91) | public void setScanCount(long scanCount) {
    method getKeyType (line 95) | public String getKeyType() {
    method setKeyType (line 99) | public void setKeyType(String scanType) {
    method getQueueCapacity (line 103) | public int getQueueCapacity() {
    method setQueueCapacity (line 107) | public void setQueueCapacity(int queueCapacity) {
    method getThreads (line 111) | public int getThreads() {
    method setThreads (line 115) | public void setThreads(int threads) {
    method getChunkSize (line 119) | public int getChunkSize() {
    method setChunkSize (line 123) | public void setChunkSize(int chunkSize) {
    method getRetryLimit (line 127) | public int getRetryLimit() {
    method setRetryLimit (line 131) | public void setRetryLimit(int retryLimit) {
    method getSkipLimit (line 135) | public int getSkipLimit() {
    method setSkipLimit (line 139) | public void setSkipLimit(int skipLimit) {
    method getPollTimeout (line 143) | public RiotDuration getPollTimeout() {
    method setPollTimeout (line 147) | public void setPollTimeout(RiotDuration pollTimeout) {
    method getKeyFilterArgs (line 151) | public KeyFilterArgs getKeyFilterArgs() {
    method setKeyFilterArgs (line 155) | public void setKeyFilterArgs(KeyFilterArgs keyFilterArgs) {

FILE: plugins/riot/src/main/java/com/redis/riot/RedisReaderLiveArgs.java
  class RedisReaderLiveArgs (line 10) | public class RedisReaderLiveArgs {
    method configure (line 25) | public <K> void configure(RedisItemReader<K, ?> reader) {
    method getFlushInterval (line 33) | public RiotDuration getFlushInterval() {
    method setFlushInterval (line 37) | public void setFlushInterval(RiotDuration interval) {
    method getIdleTimeout (line 41) | public RiotDuration getIdleTimeout() {
    method setIdleTimeout (line 45) | public void setIdleTimeout(RiotDuration idleTimeout) {
    method getEventQueueCapacity (line 49) | public int getEventQueueCapacity() {
    method setEventQueueCapacity (line 53) | public void setEventQueueCapacity(int capacity) {

FILE: plugins/riot/src/main/java/com/redis/riot/RedisURIConverter.java
  class RedisURIConverter (line 6) | public class RedisURIConverter implements ITypeConverter<RedisURI> {
    method convert (line 8) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/RedisWriterArgs.java
  class RedisWriterArgs (line 13) | @ToString
    method configure (line 32) | public <K, V, T> void configure(RedisItemWriter<K, V, T> writer) {
    method isMultiExec (line 41) | public boolean isMultiExec() {
    method setMultiExec (line 45) | public void setMultiExec(boolean multiExec) {
    method getWaitReplicas (line 49) | public int getWaitReplicas() {
    method setWaitReplicas (line 53) | public void setWaitReplicas(int waitReplicas) {
    method getWaitTimeout (line 57) | public RiotDuration getWaitTimeout() {
    method setWaitTimeout (line 61) | public void setWaitTimeout(RiotDuration waitTimeout) {
    method isMerge (line 65) | public boolean isMerge() {
    method setMerge (line 69) | public void setMerge(boolean merge) {

FILE: plugins/riot/src/main/java/com/redis/riot/Replicate.java
  class Replicate (line 19) | @Command(name = "replicate", aliases = "sync", description = "Replicate ...
    type Type (line 22) | public enum Type {
    method setStruct (line 46) | @Option(names = "--struct", description = "Enable data structure-speci...
    method isQuickCompare (line 51) | @Override
    method job (line 56) | @Override
    method configureTargetRedisWriter (line 67) | @Override
    method replicateStep (line 74) | protected Step<KeyValue<byte[]>, KeyValue<byte[]>> replicateStep() {
    method replicateWriter (line 90) | protected ItemWriter<KeyValue<byte[]>> replicateWriter() {
    method shouldCompare (line 96) | private boolean shouldCompare() {
    method reader (line 100) | @SuppressWarnings({ "unchecked", "rawtypes" })
    method writer (line 110) | @SuppressWarnings({ "unchecked", "rawtypes" })
    method isStruct (line 120) | @Override
    method taskName (line 125) | private String taskName(RedisItemReader<?, ?> reader) {
    method getTargetRedisWriterArgs (line 136) | public RedisWriterArgs getTargetRedisWriterArgs() {
    method setTargetRedisWriterArgs (line 140) | public void setTargetRedisWriterArgs(RedisWriterArgs redisWriterArgs) {
    method getType (line 144) | public Type getType() {
    method setType (line 148) | public void setType(Type type) {
    method isLogKeys (line 152) | public boolean isLogKeys() {
    method setLogKeys (line 156) | public void setLogKeys(boolean enable) {
    method getCompareMode (line 160) | public CompareMode getCompareMode() {
    method setCompareMode (line 164) | public void setCompareMode(CompareMode compareMode) {

FILE: plugins/riot/src/main/java/com/redis/riot/ReplicateReadLogger.java
  class ReplicateReadLogger (line 15) | public class ReplicateReadLogger<K> implements ItemReadListener<KeyEvent...
    method ReplicateReadLogger (line 20) | public ReplicateReadLogger(Logger logger, RedisCodec<K, ?> codec) {
    method log (line 25) | private void log(String format, KeyEvent<K> keyEvent) {
    method string (line 29) | protected String string(KeyEvent<K> key) {
    method log (line 33) | private void log(String format, Iterable<? extends KeyEvent<K>> keys) {
    method afterRead (line 39) | @Override
    method beforeWrite (line 46) | @Override
    method afterWrite (line 51) | @Override
    method onWriteError (line 56) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/ReplicateWriteLogger.java
  class ReplicateWriteLogger (line 14) | public class ReplicateWriteLogger<K> implements ItemWriteListener<KeyVal...
    method ReplicateWriteLogger (line 19) | public ReplicateWriteLogger(Logger logger, RedisCodec<K, ?> codec) {
    method log (line 24) | protected void log(String message, Chunk<? extends KeyValue<K>> items) {
    method string (line 32) | protected String string(KeyValue<K> item) {
    method beforeWrite (line 36) | @Override
    method afterWrite (line 41) | @Override
    method onWriteError (line 46) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/Riot.java
  class Riot (line 6) | @Command(name = "riot", versionProvider = Versions.class, subcommands = ...
    method main (line 12) | public static void main(String[] args) {

FILE: plugins/riot/src/main/java/com/redis/riot/RiotMainCommand.java
  class RiotMainCommand (line 14) | public class RiotMainCommand extends MainCommand {
    method executionStrategy (line 16) | @Override
    method registerConverters (line 35) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/S3Args.java
  class S3Args (line 11) | @ToString
    method getRegion (line 26) | public Region getRegion() {
    method setRegion (line 30) | public void setRegion(Region region) {
    method getEndpoint (line 34) | public URI getEndpoint() {
    method setEndpoint (line 38) | public void setEndpoint(URI endpoint) {
    method getAccessKey (line 42) | public String getAccessKey() {
    method setAccessKey (line 46) | public void setAccessKey(String accessKey) {
    method getSecretKey (line 50) | public String getSecretKey() {
    method setSecretKey (line 54) | public void setSecretKey(String secretKey) {
    method s3Options (line 58) | public S3Options s3Options() {

FILE: plugins/riot/src/main/java/com/redis/riot/SourceRedisArgs.java
  class SourceRedisArgs (line 11) | @ToString
    method getUsername (line 68) | @Override
    method setUsername (line 73) | public void setUsername(String username) {
    method getPassword (line 77) | @Override
    method setPassword (line 82) | public void setPassword(char[] password) {
    method isInsecure (line 86) | @Override
    method setInsecure (line 91) | public void setInsecure(boolean insecure) {
    method isCluster (line 95) | @Override
    method setCluster (line 100) | public void setCluster(boolean cluster) {
    method getProtocolVersion (line 104) | @Override
    method setProtocolVersion (line 109) | public void setProtocolVersion(ProtocolVersion protocolVersion) {
    method getPoolSize (line 113) | @Override
    method setPoolSize (line 118) | public void setPoolSize(int poolSize) {
    method getTimeout (line 122) | @Override
    method setTimeout (line 127) | public void setTimeout(RiotDuration timeout) {
    method isTls (line 131) | @Override
    method setTls (line 136) | public void setTls(boolean tls) {
    method getClientName (line 140) | @Override
    method setClientName (line 145) | public void setClientName(String clientName) {
    method getReadFrom (line 149) | @Override
    method setReadFrom (line 154) | public void setReadFrom(ReadFrom readFrom) {
    method getKeystore (line 158) | @Override
    method setKeystore (line 163) | public void setKeystore(File keystore) {
    method getKeystorePassword (line 167) | @Override
    method setKeystorePassword (line 172) | public void setKeystorePassword(char[] keystorePassword) {
    method getTruststore (line 176) | @Override
    method setTruststore (line 181) | public void setTruststore(File truststore) {
    method getTruststorePassword (line 185) | @Override
    method setTruststorePassword (line 190) | public void setTruststorePassword(char[] truststorePassword) {
    method getKeyCert (line 194) | @Override
    method setKeyCert (line 199) | public void setKeyCert(File keyCert) {
    method getKey (line 203) | @Override
    method setKey (line 208) | public void setKey(File key) {
    method getKeyPassword (line 212) | @Override
    method setKeyPassword (line 217) | public void setKeyPassword(char[] keyPassword) {
    method getTrustedCerts (line 221) | @Override
    method setTrustedCerts (line 226) | public void setTrustedCerts(File trustedCerts) {

FILE: plugins/riot/src/main/java/com/redis/riot/TargetRedisArgs.java
  class TargetRedisArgs (line 11) | @ToString
    method getUsername (line 68) | @Override
    method setUsername (line 73) | public void setUsername(String username) {
    method getPassword (line 77) | @Override
    method setPassword (line 82) | public void setPassword(char[] password) {
    method isInsecure (line 86) | @Override
    method setInsecure (line 91) | public void setInsecure(boolean insecure) {
    method getTimeout (line 95) | @Override
    method setTimeout (line 100) | public void setTimeout(RiotDuration timeout) {
    method isTls (line 104) | @Override
    method setTls (line 109) | public void setTls(boolean tls) {
    method getClientName (line 113) | @Override
    method setClientName (line 118) | public void setClientName(String clientName) {
    method isCluster (line 122) | @Override
    method setCluster (line 127) | public void setCluster(boolean cluster) {
    method getProtocolVersion (line 131) | @Override
    method setProtocolVersion (line 136) | public void setProtocolVersion(ProtocolVersion protocolVersion) {
    method getPoolSize (line 140) | @Override
    method setPoolSize (line 145) | public void setPoolSize(int poolSize) {
    method getReadFrom (line 149) | @Override
    method setReadFrom (line 154) | public void setReadFrom(ReadFrom readFrom) {
    method getKeystore (line 158) | @Override
    method setKeystore (line 163) | public void setKeystore(File keystore) {
    method getKeystorePassword (line 167) | @Override
    method setKeystorePassword (line 172) | public void setKeystorePassword(char[] keystorePassword) {
    method getTruststore (line 176) | @Override
    method setTruststore (line 181) | public void setTruststore(File truststore) {
    method getTruststorePassword (line 185) | @Override
    method setTruststorePassword (line 190) | public void setTruststorePassword(char[] truststorePassword) {
    method getKeyCert (line 194) | @Override
    method setKeyCert (line 199) | public void setKeyCert(File keyCert) {
    method getKey (line 203) | @Override
    method setKey (line 208) | public void setKey(File key) {
    method getKeyPassword (line 212) | @Override
    method setKeyPassword (line 217) | public void setKeyPassword(char[] keyPassword) {
    method getTrustedCerts (line 221) | @Override
    method setTrustedCerts (line 226) | public void setTrustedCerts(File trustedCerts) {

FILE: plugins/riot/src/main/java/com/redis/riot/ToMapFunction.java
  class ToMapFunction (line 12) | public class ToMapFunction<T, K, V> implements Function<T, Map<K, V>> {
    method ToMapFunction (line 16) | @SuppressWarnings("unchecked")
    method ToMapFunction (line 22) | public ToMapFunction(List<? extends Function<T, Map<K, V>>> functions) {
    method apply (line 27) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/Versions.java
  class Versions (line 10) | public class Versions implements IVersionProvider {
    method getVersion (line 12) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/function/HashToMapFunction.java
  class HashToMapFunction (line 10) | public class HashToMapFunction implements Function<Map<String, String>, ...
    method apply (line 12) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/function/KeyValueMap.java
  class KeyValueMap (line 18) | public class KeyValueMap implements Function<KeyValue<String>, Map<Strin...
    method apply (line 31) | @Override
    method value (line 40) | @SuppressWarnings("unchecked")
    method setKey (line 70) | public void setKey(Function<String, Map<String, String>> key) {
    method setHash (line 74) | public void setHash(Function<Map<String, String>, Map<String, String>>...
    method setStream (line 78) | public void setStream(Function<Collection<StreamMessage<String, String...
    method setList (line 82) | public void setList(Function<Collection<String>, Map<String, String>> ...
    method setSet (line 86) | public void setSet(Function<Collection<String>, Map<String, String>> f...
    method setZset (line 90) | public void setZset(Function<Set<ScoredValue<String>>, Map<String, Str...
    method setString (line 94) | public void setString(Function<String, Map<String, String>> function) {
    method setDefaultFunction (line 98) | public void setDefaultFunction(Function<Object, Map<String, String>> f...
    method setJson (line 102) | public void setJson(Function<String, Map<String, String>> function) {
    method setTimeseries (line 106) | public void setTimeseries(Function<Collection<Sample>, Map<String, Str...

FILE: plugins/riot/src/main/java/com/redis/riot/function/MapToFieldFunction.java
  class MapToFieldFunction (line 6) | public class MapToFieldFunction implements Function<Map<String, Object>,...
    method MapToFieldFunction (line 12) | public MapToFieldFunction(String key) {
    method setDefaultValue (line 16) | public void setDefaultValue(Object defaultValue) {
    method apply (line 20) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/function/ObjectMapperFunction.java
  class ObjectMapperFunction (line 11) | public class ObjectMapperFunction<T> implements Function<T, String> {
    method ObjectMapperFunction (line 15) | public ObjectMapperFunction(ObjectWriter writer) {
    method apply (line 19) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/function/StreamItemProcessor.java
  class StreamItemProcessor (line 13) | public class StreamItemProcessor implements ItemProcessor<KeyValue<Strin...
    method process (line 18) | @SuppressWarnings("unchecked")
    method message (line 36) | @SuppressWarnings({ "rawtypes", "unchecked" })
    method isDropMessageIds (line 41) | public boolean isDropMessageIds() {
    method setDropMessageIds (line 45) | public void setDropMessageIds(boolean dropMessageIds) {
    method isPrune (line 49) | public boolean isPrune() {
    method setPrune (line 53) | public void setPrune(boolean prune) {

FILE: plugins/riot/src/main/java/com/redis/riot/function/StreamToMapFunction.java
  class StreamToMapFunction (line 10) | public class StreamToMapFunction implements Function<Collection<StreamMe...
    method setKeyFormat (line 18) | public void setKeyFormat(String keyFormat) {
    method apply (line 22) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/function/StringKeyValue.java
  class StringKeyValue (line 10) | public class StringKeyValue<K> implements Function<KeyValue<String>, Key...
    method StringKeyValue (line 14) | public StringKeyValue(RedisCodec<K, ?> codec) {
    method apply (line 18) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/function/TimeSeriesToMapFunction.java
  class TimeSeriesToMapFunction (line 10) | public class TimeSeriesToMapFunction implements Function<Collection<Samp...
    method apply (line 12) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/function/ToGeoValue.java
  class ToGeoValue (line 8) | public class ToGeoValue<V, T> implements Function<T, GeoValue<V>> {
    method ToGeoValue (line 14) | public ToGeoValue(Function<T, V> member, ToDoubleFunction<T> longitude...
    method apply (line 20) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/function/ToSample.java
  class ToSample (line 9) | public class ToSample<T> implements Function<T, Sample> {
    method ToSample (line 15) | public ToSample(ToLongFunction<T> timestamp, ToDoubleFunction<T> value) {
    method apply (line 20) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/function/ToScoredValue.java
  class ToScoredValue (line 8) | public class ToScoredValue<V, T> implements Function<T, ScoredValue<V>> {
    method ToScoredValue (line 14) | public ToScoredValue(Function<T, V> member, ToDoubleFunction<T> score) {
    method apply (line 19) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/function/ToStringKeyValue.java
  class ToStringKeyValue (line 10) | public class ToStringKeyValue<K> implements Function<KeyValue<K>, KeyVal...
    method ToStringKeyValue (line 14) | public ToStringKeyValue(RedisCodec<K, ?> codec) {
    method apply (line 18) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/function/ToSuggestion.java
  class ToSuggestion (line 8) | public class ToSuggestion<V, T> implements Function<T, Suggestion<V>> {
    method ToSuggestion (line 16) | public ToSuggestion(Function<T, V> string, ToDoubleFunction<T> score, ...
    method apply (line 22) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/function/ZsetToMapFunction.java
  class ZsetToMapFunction (line 10) | public class ZsetToMapFunction implements Function<Set<ScoredValue<Strin...
    method setScoreKeyFormat (line 20) | public void setScoreKeyFormat(String scoreKeyFormat) {
    method setValueKeyFormat (line 24) | public void setValueKeyFormat(String valueKeyFormat) {
    method setScoreFormat (line 28) | public void setScoreFormat(String scoreFormat) {
    method apply (line 32) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/operation/AbstractMemberOperationCommand.java
  class AbstractMemberOperationCommand (line 8) | abstract class AbstractMemberOperationCommand extends AbstractOperationC...
    method memberFunction (line 13) | protected Function<Map<String, Object>, String> memberFunction() {

FILE: plugins/riot/src/main/java/com/redis/riot/operation/AbstractOperationCommand.java
  class AbstractOperationCommand (line 17) | @Command
    method getKeyspace (line 37) | public String getKeyspace() {
    method setKeyspace (line 41) | public void setKeyspace(String keyspace) {
    method getKeyFields (line 45) | public List<String> getKeyFields() {
    method setKeyFields (line 49) | public void setKeyFields(String... keys) {
    method setKeyFields (line 53) | public void setKeyFields(List<String> keyFields) {
    method getKeySeparator (line 57) | public String getKeySeparator() {
    method setKeySeparator (line 61) | public void setKeySeparator(String keySeparator) {
    method isRemoveFields (line 65) | public boolean isRemoveFields() {
    method setRemoveFields (line 69) | public void setRemoveFields(boolean removeFields) {
    method isIgnoreMissingFields (line 73) | public boolean isIgnoreMissingFields() {
    method setIgnoreMissingFields (line 77) | public void setIgnoreMissingFields(boolean ignoreMissingFields) {
    method toString (line 81) | protected Function<Map<String, Object>, String> toString(String field) {
    method fieldExtractorFactory (line 88) | protected FieldExtractorFactory fieldExtractorFactory() {
    method idFunction (line 92) | protected Function<Map<String, Object>, String> idFunction(String pref...
    method keyFunction (line 97) | protected Function<Map<String, Object>, String> keyFunction() {
    method score (line 101) | protected ToDoubleFunction<Map<String, Object>> score(ScoreArgs args) {
    method toDouble (line 105) | protected ToDoubleFunction<Map<String, Object>> toDouble(String field,...
    method toLong (line 112) | protected ToLongFunction<Map<String, Object>> toLong(String field) {

FILE: plugins/riot/src/main/java/com/redis/riot/operation/DelCommand.java
  class DelCommand (line 9) | @Command(name = "del", description = "Delete keys")
    method operation (line 12) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/operation/ExpireCommand.java
  class ExpireCommand (line 14) | @Command(name = "expire", description = "Set timeouts on keys")
    method operation (line 25) | @Override
    method fieldTtl (line 45) | private ToLongFunction<Map<String, Object>> fieldTtl() {
    method getTtlArgs (line 49) | public ExpireTtlArgs getTtlArgs() {
    method setTtlArgs (line 53) | public void setTtlArgs(ExpireTtlArgs expireArgs) {
    method isAbsolute (line 57) | public boolean isAbsolute() {
    method setAbsolute (line 61) | public void setAbsolute(boolean absolute) {

FILE: plugins/riot/src/main/java/com/redis/riot/operation/ExpireTtlArgs.java
  class ExpireTtlArgs (line 6) | @ToString
    method getTtlField (line 15) | public String getTtlField() {
    method setTtlField (line 19) | public void setTtlField(String ttlField) {
    method getTtlValue (line 23) | public long getTtlValue() {
    method setTtlValue (line 27) | public void setTtlValue(long ttlValue) {

FILE: plugins/riot/src/main/java/com/redis/riot/operation/FieldFilterArgs.java
  class FieldFilterArgs (line 16) | @ToString
    method mapFunction (line 25) | public Function<Map<String, Object>, Map<String, String>> mapFunction() {
    method getExcludeFields (line 41) | public List<String> getExcludeFields() {
    method setExcludeFields (line 45) | public void setExcludeFields(List<String> excludes) {
    method getIncludeFields (line 49) | public List<String> getIncludeFields() {
    method setIncludeFields (line 53) | public void setIncludeFields(List<String> includes) {

FILE: plugins/riot/src/main/java/com/redis/riot/operation/GeoaddCommand.java
  class GeoaddCommand (line 12) | @Command(name = "geoadd", description = "Add members to a geo set")
    method getLongitude (line 21) | public String getLongitude() {
    method setLongitude (line 25) | public void setLongitude(String field) {
    method getLatitude (line 29) | public String getLatitude() {
    method setLatitude (line 33) | public void setLatitude(String field) {
    method operation (line 37) | @Override
    method geoValueFunction (line 42) | private ToGeoValue<String, Map<String, Object>> geoValueFunction() {

FILE: plugins/riot/src/main/java/com/redis/riot/operation/HsetCommand.java
  class HsetCommand (line 10) | @Command(name = "hset", description = "Set hashes from input")
    method operation (line 16) | @Override
    method getFieldFilterArgs (line 21) | public FieldFilterArgs getFieldFilterArgs() {
    method setFieldFilterArgs (line 25) | public void setFieldFilterArgs(FieldFilterArgs filteringArgs) {

FILE: plugins/riot/src/main/java/com/redis/riot/operation/JsonSetCommand.java
  class JsonSetCommand (line 17) | @Command(name = "json.set", description = "Add JSON documents to RedisJS...
    method operation (line 25) | @Override
    method jsonPath (line 34) | private JsonPath jsonPath(String path) {
    method jsonValue (line 41) | private String jsonValue(Map<String, Object> map) {

FILE: plugins/riot/src/main/java/com/redis/riot/operation/LpushCommand.java
  class LpushCommand (line 10) | @Command(name = "lpush", description = "Insert values at the head of a l...
    method operation (line 13) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/operation/MemberOperationArgs.java
  class MemberOperationArgs (line 8) | @ToString
    method getMemberSpace (line 17) | public String getMemberSpace() {
    method setMemberSpace (line 21) | public void setMemberSpace(String space) {
    method getMemberFields (line 25) | public List<String> getMemberFields() {
    method setMemberFields (line 29) | public void setMemberFields(List<String> fields) {

FILE: plugins/riot/src/main/java/com/redis/riot/operation/OperationCommand.java
  type OperationCommand (line 7) | public interface OperationCommand {
    method operation (line 9) | Operation<String, String, Map<String, Object>, Object> operation();

FILE: plugins/riot/src/main/java/com/redis/riot/operation/RpushCommand.java
  class RpushCommand (line 10) | @Command(name = "rpush", description = "Insert values at the tail of a l...
    method operation (line 13) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/operation/SaddCommand.java
  class SaddCommand (line 10) | @Command(name = "sadd", description = "Add members to a set")
    method operation (line 13) | @Override

FILE: plugins/riot/src/main/java/com/redis/riot/operation/ScoreArgs.java
  class ScoreArgs (line 6) | @ToString
    method getField (line 17) | public String getField() {
    method setField (line 21) | public void setField(String field) {
    method getDefaultValue (line 25) | public double getDefaultValue() {
    method setDefaultValue (line 29) | public void setDefaultValue(double defaultValue) {

FILE: plugins/riot/src/main/java/com/redis/riot/operation/SetCommand.java
  class SetCommand (line 18) | @Command(name = "set", description = "Set strings from input")
    type StringFormat (line 21) | public enum StringFormat {
    method operation (line 36) | @Override
    method value (line 41) | private Function<Map<String, Object>, String> value() {

FILE: plugins/riot/src/main/java/com/redis/riot/operation/SugaddCommand.java
  class SugaddCommand (line 14) | @Command(name = "ft.sugadd", description = "Add suggestion strings to a ...
    method operation (line 29) | @Override
    method suggestion (line 36) | private Function<Map<String, Object>, Suggestion<String>> suggestion() {
    method getStringField (line 40) | public String getStringField() {
    method setStringField (line 44) | public void setStringField(String string) {
    method getPayloadField (line 48) | public String getPayloadField() {
    method setPayloadField (line 52) | public void setPayloadField(String payload) {
    method isIncrement (line 56) | public boolean isIncrement() {
    method setIncrement (line 60) | public void setIncrement(boolean increment) {
    method getScoreArgs (line 64) | public ScoreArgs getScoreArgs() {
    method setScoreArgs (line 68) | public void setScoreArgs(ScoreArgs scoreArgs) {

FILE: plugins/riot/src/main/java/com/redis/riot/operation/TsAddCommand.java
  class TsAddCommand (line 27) | @Command(name = "ts.add", description = "Add samples to RedisTimeSeries")
    method operation (line 44) | @Override
    method addOptions (line 51) | @SuppressWarnings("unchecked")
    method valueFunction (line 66) | private Function<Map<String, Object>, Collection<Sample>> valueFunctio...
    method getTimestampField (line 72) | public String getTimestampField() {
    method setTimestampField (line 76) | public void setTimestampField(String timestampField) {
    method getValueField (line 80) | public String getValueField() {
    method setValueField (line 84) | public void setValueField(String valueField) {
    method getDuplicatePolicy (line 88) | public DuplicatePolicy getDuplicatePolicy() {
    method setDuplicatePolicy (line 92) | public void setDuplicatePolicy(DuplicatePolicy duplicatePolicy) {
    method getLabels (line 96) | public Map<String, String> getLabels() {
    method setLabels (line 100) | public void setLabels(Map<String, String> labels) {

FILE: plugins/riot/src/main/java/com/redis/riot/operation/XaddCommand.java
  class XaddCommand (line 16) | @Command(name = "xadd", description = "Append entries to a stream")
    method xAddArgs (line 28) | private XAddArgs xAddArgs() {
    method operation (line 37) | @Override
    method messageFunction (line 44) | private Function<Map<String, Object>, Collection<StreamMessage<String,...
    method getFieldFilterArgs (line 50) | public FieldFilterArgs getFieldFilterArgs() {
    method setFieldFilterArgs (line 54) | public void setFieldFilterArgs(FieldFilterArgs args) {
    method getMaxlen (line 58) | public long getMaxlen() {
    method setMaxlen (line 62) | public void setMaxlen(long maxlen) {
    method isApproximateTrimming (line 66) | public boolean isApproximateTrimming() {
    method setApproximateTrimming (line 70) | public void setApproximateTrimming(boolean approximateTrimming) {

FILE: plugins/riot/src/main/java/com/redis/riot/operation/ZaddCommand.java
  class ZaddCommand (line 12) | @Command(name = "zadd", description = "Add members with scores to a sort...
    method operation (line 18) | @Override
    method scoredValueFunction (line 23) | private ToScoredValue<String, Map<String, Object>> scoredValueFunction...
    method getScoreArgs (line 27) | public ScoreArgs getScoreArgs() {
    method setScoreArgs (line 31) | public void setScoreArgs(ScoreArgs scoreArgs) {

FILE: plugins/riot/src/test/java/com/redis/riot/AbstractRiotApplicationTestBase.java
  class AbstractRiotApplicationTestBase (line 18) | abstract class AbstractRiotApplicationTestBase extends AbstractRiotTestB...
    method getMainCommandPrefix (line 26) | @Override
    method mainCommand (line 31) | @Override
    class TestRiot (line 36) | private class TestRiot extends Riot {
      method TestRiot (line 41) | public TestRiot(TestInfo info, IExecutionStrategy... configs) {
      method executionStrategy (line 46) | @Override
      method configure (line 88) | private void configure(RedisArgs redisArgs) {

FILE: plugins/riot/src/test/java/com/redis/riot/DbTests.java
  class DbTests (line 24) | abstract class DbTests extends AbstractRiotApplicationTestBase {
    method getJdbcDatabaseContainer (line 32) | protected abstract JdbcDatabaseContainer<?> getJdbcDatabaseContainer();
    method setupContainers (line 34) | @BeforeAll
    method teardownContainers (line 46) | @AfterAll
    method getRedisServer (line 54) | @Override
    method getTargetRedisServer (line 59) | @Override
    method executeScript (line 64) | protected void executeScript(String file) throws IOException, SQLExcep...
    method executeDatabaseImport (line 75) | protected int executeDatabaseImport(ParseResult parseResult) {
    method executeDatabaseExport (line 81) | protected int executeDatabaseExport(ParseResult parseResult, TestInfo ...
    method configureDatabase (line 88) | private void configureDatabase(DataSourceArgs args) {

FILE: plugins/riot/src/test/java/com/redis/riot/FileTests.java
  class FileTests (line 29) | abstract class FileTests extends AbstractTargetTestBase {
    method setupFiles (line 40) | @BeforeAll
    method tempFile (line 45) | protected Path tempFile(String filename) throws IOException {
    method fileImportJSON (line 53) | @Test
    method fileApiImportCSV (line 77) | @Test
    method configure (line 98) | private void configure(TestInfo info, AbstractRedisImportCommand calla...
    method configure (line 103) | private void configure(TestInfo info, AbstractRedisExportCommand calla...
    method configureJobCommand (line 108) | private void configureJobCommand(TestInfo info, AbstractJobCommand cal...
    method configure (line 113) | private void configure(RedisArgs redisArgs) {
    method fileApiFileExpansion (line 118) | @Test
    method fileImportCSVMultiThreaded (line 142) | @Test
    method fileImportJSONL (line 164) | @Test
    method fileExportImportJson (line 186) | @Test
    method fileExportImportJsonl (line 191) | @Test
    method fileExportImportXml (line 197) | void fileExportImportXml(TestInfo info) throws Exception {
    method fileExportImport (line 201) | private void fileExportImport(TestInfo info, String filename) throws E...
    method fileImportRedisJson (line 222) | @Test

FILE: plugins/riot/src/test/java/com/redis/riot/KeyValueSerdeTests.java
  class KeyValueSerdeTests (line 39) | @TestInstance(Lifecycle.PER_CLASS)
    method setup (line 46) | @BeforeAll
    method deserialize (line 54) | @SuppressWarnings("unchecked")
    method serialize (line 61) | @Test
    method serde (line 82) | @SuppressWarnings("unchecked")
    method assertEquals (line 97) | private <K, T> void assertEquals(KeyValue<K> source, KeyValue<K> targe...
    method test (line 105) | @Test

FILE: plugins/riot/src/test/java/com/redis/riot/PostgresDeltaTests.java
  class PostgresDeltaTests (line 16) | @EnabledOnOs(value = OS.LINUX)
    method getJdbcDatabaseContainer (line 23) | @Override
    method setupPostgres (line 28) | @BeforeAll
    method importDelta (line 33) | @Test

FILE: plugins/riot/src/test/java/com/redis/riot/PostgresTests.java
  class PostgresTests (line 28) | @EnabledOnOs(value = OS.LINUX)
    method getJdbcDatabaseContainer (line 35) | @Override
    method setupPostgres (line 40) | @BeforeAll
    method clearTables (line 45) | @BeforeEach
    method export (line 52) | @Test
    method nullValueExport (line 77) | @Test
    method hashImport (line 105) | @Test
    method multiThreadedImport (line 119) | @Test
    method setImport (line 134) | @Test

FILE: plugins/riot/src/test/java/com/redis/riot/ProcessorTests.java
  class ProcessorTests (line 23) | class ProcessorTests {
    method keyFilter (line 25) | private Predicate<String> keyFilter(KeyFilterArgs args) {
    method keyFilter (line 29) | @Test
    method slotExact (line 39) | @Test
    method slotRange (line 48) | @Test
    method slotRangeList (line 60) | private List<Range> slotRangeList(int start, int end) {
    method kitchenSink (line 64) | @Test
    method keyValueToMap (line 76) | @Test

FILE: plugins/riot/src/test/java/com/redis/riot/REServerStack.java
  class REServerStack (line 8) | @EnabledIfEnvironmentVariable(named = RedisEnterpriseServer.ENV_HOST, ma...
    method getRedisServer (line 14) | @Override
    method getTargetRedisServer (line 19) | @Override

FILE: plugins/riot/src/test/java/com/redis/riot/REStack.java
  class REStack (line 9) | @EnabledOnOs(OS.LINUX)
    method getRedisServer (line 15) | @Override
    method getTargetRedisServer (line 20) | @Override

FILE: plugins/riot/src/test/java/com/redis/riot/RedisArgsTests.java
  class RedisArgsTests (line 9) | class RedisArgsTests {
    method redisArgsURI (line 11) | @Test
    method parseRedisURI (line 23) | @Test
    method parseRange (line 32) | @Test

FILE: plugins/riot/src/test/java/com/redis/riot/RedisContainerFactory.java
  type RedisContainerFactory (line 9) | public interface RedisContainerFactory {
    method stack (line 14) | static RedisStackContainer stack() {
    method enterprise (line 18) | @SuppressWarnings("resource")
    method enterpriseServer (line 25) | static RedisEnterpriseServer enterpriseServer() {

FILE: plugins/riot/src/test/java/com/redis/riot/RiotTests.java
  class RiotTests (line 27) | abstract class RiotTests extends AbstractRiotApplicationTestBase {
    method setDefaults (line 33) | @BeforeAll
    method runLiveReplication (line 38) | protected void runLiveReplication(TestInfo info, String filename) thro...
    method name (line 49) | protected static String name(Map<String, String> beer) {
    method style (line 53) | protected static String style(Map<String, String> beer) {
    method abv (line 57) | protected static double abv(Map<String, String> beer) {
    method execute (line 61) | protected void execute(Replicate replicate, TestInfo info) throws Exce...
    method replicateBinaryStruct (line 74) | @Test
    method replicateBinaryKeyValueScan (line 92) | @Test
    method replicateBinaryKeyLive (line 107) | @Test
    method filterKeySlot (line 124) | @Test
    method between (line 136) | private Predicate<Integer> between(int start, int end) {

FILE: plugins/riot/src/test/java/com/redis/riot/SqlScriptRunner.java
  class SqlScriptRunner (line 17) | public class SqlScriptRunner {
    method SqlScriptRunner (line 30) | public SqlScriptRunner(Connection connection) {
    method setStopOnError (line 34) | public void setStopOnError(boolean stopOnError) {
    method setAutoCommit (line 38) | public void setAutoCommit(boolean autoCommit) {
    method setDelimiter (line 42) | public void setDelimiter(String delimiter) {
    method setFullLineDelimiter (line 46) | public void setFullLineDelimiter(boolean fullLineDelimiter) {
    method runScript (line 55) | public void runScript(Reader reader) throws IOException, SQLException {
    method runScript (line 76) | @SuppressWarnings("unused")

FILE: plugins/riot/src/test/java/com/redis/riot/StackFileTests.java
  class StackFileTests (line 6) | class StackFileTests extends FileTests {
    method getRedisServer (line 12) | @Override
    method getTargetRedisServer (line 17) | @Override

FILE: plugins/riot/src/test/java/com/redis/riot/StackREContainer.java
  class StackREContainer (line 9) | @EnabledOnOs(OS.LINUX)
    method getRedisServer (line 15) | @Override
    method getTargetRedisServer (line 20) | @Override

FILE: plugins/riot/src/test/java/com/redis/riot/StackREServer.java
  class StackREServer (line 8) | @EnabledIfEnvironmentVariable(named = RedisEnterpriseServer.ENV_HOST, ma...
    method getRedisServer (line 14) | @Override
    method getTargetRedisServer (line 19) | @Override

FILE: plugins/riot/src/test/java/com/redis/riot/StackRiotTests.java
  class StackRiotTests (line 65) | class StackRiotTests extends RiotTests {
    method setupFiles (line 75) | @BeforeAll
    method tempFile (line 80) | protected Path tempFile(String filename) throws IOException {
    method getRedisServer (line 88) | @Override
    method getTargetRedisServer (line 93) | @Override
    method name (line 98) | protected static String name(Map<String, String> beer) {
    method style (line 102) | protected static String style(Map<String, String> beer) {
    method abv (line 106) | protected static double abv(Map<String, String> beer) {
    method testImport (line 110) | protected void testImport(TestInfo info, String filename, String patte...
    method fileImportJsonDump (line 115) | @SuppressWarnings("rawtypes")
    method fileExportJSON (line 124) | @SuppressWarnings("rawtypes")
    method exportToJsonFile (line 131) | @SuppressWarnings("rawtypes")
    method executeFileDumpImport (line 147) | private int executeFileDumpImport(ParseResult parseResult) {
    method executeFileDumpExport (line 153) | private int executeFileDumpExport(ParseResult parseResult, TestInfo in...
    method replace (line 160) | private String replace(String file) {
    method fileExportJSONGz (line 164) | @SuppressWarnings("rawtypes")
    method fileExportXml (line 183) | @SuppressWarnings({ "rawtypes", "unchecked" })
    method fileImportFW (line 216) | @Test
    method fileImportCSV (line 227) | @Test
    method fileImportCSVSkipLines (line 232) | @Test
    method fileImportCSVMax (line 237) | @Test
    method fileImportPSV (line 242) | @Test
    method fileImportTSV (line 247) | @Test
    method fileImportType (line 252) | @Test
    method fileImportExclude (line 257) | @Test
    method fileImportInclude (line 268) | @Test
    method fileImportFilter (line 278) | @Test
    method fileImportRegex (line 283) | @Test
    method fileImportGeoadd (line 291) | @Test
    method fileImportGeoProcessor (line 300) | @Test
    method fileImportProcess (line 307) | @Test
    method fileImportProcessFaker (line 315) | @Test
    method fileImportProcessVar (line 322) | @Test
    method fileImportProcessElvis (line 330) | @Test
    method fileImportHsetSadd (line 337) | @Test
    method fileImportHsetExpire (line 351) | @Test
    method fileImportHsetExpireField (line 364) | @Test
    method fileImportBad (line 377) | @Test
    method fileImportGCS (line 382) | @Test
    method fileImportS3 (line 389) | @Test
    method fileImportJSONElastic (line 396) | @Test
    method fileImportJSON (line 406) | @Test
    method fileImportXML (line 413) | @Test
    method fileImportJSONGzip (line 420) | @Test
    method fileImportSugadd (line 425) | @Test
    method fileImportElasticJSON (line 434) | @Test
    method fakerImportHset (line 444) | @Test
    method fakerImportSadd (line 453) | @Test
    method fakerImportZadd (line 463) | @Test
    method fakerImportXadd (line 474) | @Test
    method fakerImportTsAddWithOptions (line 481) | @Test
    method generateTypes (line 489) | @Test
    method generateJsonIndex (line 496) | @Test
    method generateHashIndex (line 510) | @Test
    method replicateKeyExclude (line 524) | @Test
    method replicateLiveKeyExclude (line 539) | @Test
    method replicateLiveOnlyStruct (line 556) | @Test
    method replication (line 569) | @Test
    method replicate (line 580) | @Test
    method replicateNoStreamId (line 589) | @Test
    method replicateNoStreamIdPrune (line 603) | @Test
    method replicateDryRun (line 623) | @Test
    method replicateHyperloglog (line 632) | @Test
    method replicateKeyProcessor (line 641) | @Test
    method replicateLiveStruct (line 653) | @Test
    method replicateLiveThreads (line 658) | @Test
    method replicateLive (line 663) | @Test
    method replicateLiveReadThreads (line 668) | @Test
    method replicateLiveKeySlot (line 673) | @Test
    method replicateStruct (line 689) | @Test
    method compareKeyProcessor (line 698) | @Test
    method keyProcessor (line 710) | @Test
    method keyProcessorWithDate (line 722) | @Test
    method testMapProcessor (line 734) | @Test
    method processor (line 747) | @Test
    method evaluationContext (line 768) | private EvaluationContext evaluationContext() {
    method processorFilter (line 774) | @Test

FILE: plugins/riot/src/test/resources/db/northwind.sql
  type categories (line 20) | CREATE TABLE categories (
  type customer_customer_demo (line 32) | CREATE TABLE customer_customer_demo (
  type customer_demographics (line 42) | CREATE TABLE customer_demographics (
  type customers (line 52) | CREATE TABLE customers (
  type employees (line 71) | CREATE TABLE employees (
  type employee_territories (line 97) | CREATE TABLE employee_territories (
  type order_details (line 109) | CREATE TABLE order_details (
  type orders (line 122) | CREATE TABLE orders (
  type products (line 144) | CREATE TABLE products (
  type region (line 162) | CREATE TABLE region (
  type shippers (line 172) | CREATE TABLE shippers (
  type suppliers (line 184) | CREATE TABLE suppliers (
  type territories (line 204) | CREATE TABLE territories (
  type us_states (line 215) | CREATE TABLE us_states (

FILE: plugins/riot/src/test/resources/db/oracle.sql
  type regions (line 1) | CREATE TABLE regions (
  type countries (line 6) | CREATE TABLE countries (
  type locations (line 13) | CREATE TABLE locations (
  type jobs (line 23) | CREATE TABLE jobs (
  type departments (line 30) | CREATE TABLE departments (
  type employees (line 37) | CREATE TABLE employees (
  type dependents (line 53) | CREATE TABLE dependents (

FILE: plugins/riot/src/test/resources/db/postgres-delta.sql
  type orders (line 3) | CREATE TABLE orders (
Condensed preview — 346 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,681K chars).
[
  {
    "path": ".github/workflows/build.yml",
    "chars": 397,
    "preview": "name: Build\n\non:\n  pull_request:\n\npermissions:\n  contents: read\n\njobs:\n  build:\n    name: Build\n    runs-on: ubuntu-late"
  },
  {
    "path": ".github/workflows/cache.yml",
    "chars": 225,
    "preview": "name: Clear cache\n\non:\n  schedule:\n    - cron: '0 3 * * *'\n  workflow_dispatch:\n\njobs:\n  clear:\n    name: Delete all cac"
  },
  {
    "path": ".github/workflows/early-access.yml",
    "chars": 2411,
    "preview": "name: EarlyAccess\n\non:\n  push:\n    branches: [ main ]\n\npermissions:\n  actions: write\n  id-token: write\n  contents: write"
  },
  {
    "path": ".github/workflows/publish.yml",
    "chars": 1234,
    "preview": "name: Publish\n\non:\n  workflow_dispatch:\n    inputs:\n      version:\n        description: 'Release version'\n        requir"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 3967,
    "preview": "name: Release\n\non:\n  workflow_dispatch:\n    inputs:\n      version:\n        description: 'Release version'\n        requir"
  },
  {
    "path": ".github/workflows/step-jlink.yml",
    "chars": 2697,
    "preview": "name: X-Jlink\n\non:\n  workflow_call:\n    inputs:\n      project-version:\n        required: true\n        type: string\n     "
  },
  {
    "path": ".github/workflows/step-precheck.yml",
    "chars": 778,
    "preview": "name: X-Precheck\n\non:\n  workflow_call:\n    outputs:\n      version:\n        description: version\n        value: ${{ jobs."
  },
  {
    "path": ".github/workflows/trigger-early-access.yml",
    "chars": 988,
    "preview": "name: Trigger Early Access\n\non:\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\njobs:\n  earlyaccess:\n    name: Trig"
  },
  {
    "path": ".gitignore",
    "chars": 92,
    "preview": "/out/\nbuild\n.gradle\n/.idea\nbin\n.project\n.classpath\n.settings\n.DS_Store\nhs_err_pid*.log\n*.bkp"
  },
  {
    "path": "LICENSE",
    "chars": 10174,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "README.adoc",
    "chars": 2182,
    "preview": ":linkattrs:\n:project-owner:   redis\n:project-name:    riot\n:project-group:   com.redis\n:project-version: 4.3.0\n:project-"
  },
  {
    "path": "VERSION",
    "chars": 6,
    "preview": "4.3.0\n"
  },
  {
    "path": "build.gradle",
    "chars": 4701,
    "preview": "/*\n * SPDX-License-Identifier: Apache-2.0\n *\n * Copyright 2020-2023 The RIOT authors.\n *\n * Licensed under the Apache Li"
  },
  {
    "path": "core/riot-core/gradle.properties",
    "chars": 707,
    "preview": "#\n# SPDX-License-Identifier: Apache-2.0\n#\n# Copyright 2022-2023 The RIOT authors.\n#\n# Licensed under the Apache License,"
  },
  {
    "path": "core/riot-core/riot-core.gradle",
    "chars": 2084,
    "preview": "/*\n * SPDX-License-Identifier: Apache-2.0\n *\n * Copyright 2020-2023 The RIOT authors.\n *\n * Licensed under the Apache Li"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/AbstractCallableCommand.java",
    "chars": 892,
    "preview": "package com.redis.riot.core;\n\nimport java.util.concurrent.Callable;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFac"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/AbstractJobCommand.java",
    "chars": 14154,
    "preview": "package com.redis.riot.core;\n\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Iterator;\nimport ja"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/BaseCommand.java",
    "chars": 784,
    "preview": "package com.redis.riot.core;\n\nimport java.util.Map;\n\nimport picocli.CommandLine.Command;\nimport picocli.CommandLine.Mixi"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/CompositeExecutionStrategy.java",
    "chars": 702,
    "preview": "package com.redis.riot.core;\n\nimport picocli.CommandLine.ExecutionException;\nimport picocli.CommandLine.IExecutionStrate"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/Expression.java",
    "chars": 1601,
    "preview": "package com.redis.riot.core;\n\nimport java.util.function.Predicate;\n\nimport org.springframework.expression.EvaluationCont"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/IO.java",
    "chars": 196,
    "preview": "package com.redis.riot.core;\n\nimport java.io.PrintWriter;\n\npublic interface IO {\n\n\tPrintWriter getOut();\n\n\tvoid setOut(P"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/LoggingMixin.java",
    "chars": 6488,
    "preview": "package com.redis.riot.core;\n\nimport static picocli.CommandLine.Spec.Target.MIXEE;\n\nimport java.util.LinkedHashMap;\nimpo"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/MainCommand.java",
    "chars": 1973,
    "preview": "package com.redis.riot.core;\n\nimport java.io.PrintWriter;\nimport java.util.concurrent.Callable;\n\nimport org.springframew"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/NoopItemWriter.java",
    "chars": 265,
    "preview": "package com.redis.riot.core;\n\nimport org.springframework.batch.item.Chunk;\nimport org.springframework.batch.item.ItemWri"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/PrintExceptionMessageHandler.java",
    "chars": 1169,
    "preview": "package com.redis.riot.core;\n\nimport picocli.CommandLine;\nimport picocli.CommandLine.IExecutionExceptionHandler;\nimport "
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/ProcessingItemWriter.java",
    "chars": 1981,
    "preview": "package com.redis.riot.core;\n\nimport org.springframework.batch.item.Chunk;\nimport org.springframework.batch.item.Executi"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/ProgressArgs.java",
    "chars": 981,
    "preview": "package com.redis.riot.core;\n\nimport lombok.ToString;\nimport picocli.CommandLine.Option;\n\n@ToString\npublic class Progres"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/ProgressStepExecutionListener.java",
    "chars": 2617,
    "preview": "package com.redis.riot.core;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.batch."
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/ProgressStyle.java",
    "chars": 91,
    "preview": "package com.redis.riot.core;\n\npublic enum ProgressStyle {\n\n\tBLOCK, BAR, ASCII, LOG, NONE\n\n}"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/QuietMapAccessor.java",
    "chars": 842,
    "preview": "package com.redis.riot.core;\n\nimport org.springframework.context.expression.MapAccessor;\nimport org.springframework.expr"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/RetryPolicy.java",
    "chars": 82,
    "preview": "package com.redis.riot.core;\n\npublic enum RetryPolicy {\n\n\tALWAYS, NEVER, LIMIT\n\n}\n"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/RiotDuration.java",
    "chars": 1432,
    "preview": "package com.redis.riot.core;\n\nimport java.time.Duration;\nimport java.time.temporal.ChronoUnit;\n\nimport org.springframewo"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/RiotException.java",
    "chars": 324,
    "preview": "package com.redis.riot.core;\n\n@SuppressWarnings(\"serial\")\npublic class RiotException extends RuntimeException {\n\n\tpublic"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/RiotUtils.java",
    "chars": 4082,
    "preview": "package com.redis.riot.core;\n\nimport static java.nio.charset.StandardCharsets.UTF_8;\n\nimport java.io.BufferedWriter;\nimp"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/RiotVersion.java",
    "chars": 1594,
    "preview": "package com.redis.riot.core;\n\nimport java.io.PrintStream;\nimport java.io.PrintWriter;\nimport java.util.ResourceBundle;\n\n"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/SkipPolicy.java",
    "chars": 81,
    "preview": "package com.redis.riot.core;\n\npublic enum SkipPolicy {\n\n\tALWAYS, NEVER, LIMIT\n\n}\n"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/Step.java",
    "chars": 5066,
    "preview": "package com.redis.riot.core;\n\nimport java.time.Duration;\nimport java.util.Collection;\nimport java.util.HashSet;\nimport j"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/StepArgs.java",
    "chars": 3297,
    "preview": "package com.redis.riot.core;\n\nimport org.springframework.retry.policy.MaxAttemptsRetryPolicy;\n\nimport lombok.ToString;\ni"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/StepConfiguration.java",
    "chars": 353,
    "preview": "package com.redis.riot.core;\n\nimport org.springframework.batch.core.step.builder.SimpleStepBuilder;\nimport org.springfra"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/TemplateExpression.java",
    "chars": 533,
    "preview": "package com.redis.riot.core;\n\nimport org.springframework.expression.EvaluationContext;\n\npublic class TemplateExpression "
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/ThrottledItemWriter.java",
    "chars": 1382,
    "preview": "package com.redis.riot.core;\n\nimport java.time.Duration;\n\nimport org.springframework.batch.item.Chunk;\nimport org.spring"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/processor/CollectionToMapFunction.java",
    "chars": 709,
    "preview": "package com.redis.riot.core.processor;\n\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.Map;\nimp"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/processor/ConsumerUnaryOperator.java",
    "chars": 385,
    "preview": "package com.redis.riot.core.processor;\n\nimport java.util.function.Consumer;\nimport java.util.function.UnaryOperator;\n\npu"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/processor/FieldExtractorFactory.java",
    "chars": 3610,
    "preview": "package com.redis.riot.core.processor;\n\nimport java.util.Map;\nimport java.util.function.Function;\nimport java.util.funct"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/processor/FunctionPredicate.java",
    "chars": 486,
    "preview": "package com.redis.riot.core.processor;\n\nimport java.util.function.Function;\nimport java.util.function.Predicate;\n\npublic"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/processor/IdFunctionBuilder.java",
    "chars": 3173,
    "preview": "package com.redis.riot.core.processor;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimpo"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/processor/MapFilteringFunction.java",
    "chars": 1191,
    "preview": "package com.redis.riot.core.processor;\n\nimport java.util.Collection;\nimport java.util.HashSet;\nimport java.util.LinkedHa"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/processor/MapFlatteningFunction.java",
    "chars": 2001,
    "preview": "package com.redis.riot.core.processor;\n\nimport java.util.Iterator;\nimport java.util.LinkedHashMap;\nimport java.util.Map;"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/processor/ObjectToDoubleFunction.java",
    "chars": 776,
    "preview": "package com.redis.riot.core.processor;\n\nimport java.util.function.ToDoubleFunction;\n\npublic class ObjectToDoubleFunction"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/processor/ObjectToLongFunction.java",
    "chars": 540,
    "preview": "package com.redis.riot.core.processor;\n\nimport java.util.function.ToLongFunction;\n\nimport org.springframework.util.Strin"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/processor/ObjectToStringFunction.java",
    "chars": 279,
    "preview": "package com.redis.riot.core.processor;\n\nimport java.util.function.Function;\n\npublic class ObjectToStringFunction impleme"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/processor/PredicateOperator.java",
    "chars": 594,
    "preview": "package com.redis.riot.core.processor;\n\nimport java.util.function.Predicate;\nimport java.util.function.UnaryOperator;\n\n/"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/processor/RegexNamedGroupFunction.java",
    "chars": 1082,
    "preview": "package com.redis.riot.core.processor;\n\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nim"
  },
  {
    "path": "core/riot-core/src/main/java/com/redis/riot/core/processor/StringToMapFunction.java",
    "chars": 733,
    "preview": "package com.redis.riot.core.processor;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.function.Functi"
  },
  {
    "path": "core/riot-core/src/main/resources/com/redis/riot/core/RiotVersion.properties",
    "chars": 111,
    "preview": "riot_version=${riot_version}\nbuild_date=${build_date}\nbuild_time=${build_time}\nbuild_revision=${build_revision}"
  },
  {
    "path": "core/riot-core/src/test/java/com/redis/riot/core/ConverterTests.java",
    "chars": 2619,
    "preview": "package com.redis.riot.core;\n\nimport java.time.Duration;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.uti"
  },
  {
    "path": "core/riot-core/src/test/resources/beers1.csv",
    "chars": 131899,
    "preview": ",abv,ibu,id,name,style,brewery_id,ounces\n0,0.05,,1436,Pub Beer,American Pale Lager,408,12.0\n1,0.066,,2265,Devil's Cup,Am"
  },
  {
    "path": "core/riot-core/src/test/resources/beers2.csv",
    "chars": 27521,
    "preview": ",abv,ibu,id,name,style,brewery_id,ounces\n2000,0.047,9.0,2122,Point Special (2013),American Adjunct Lager,131,12.0\n2001,0"
  },
  {
    "path": "core/riot-faker/gradle.properties",
    "chars": 709,
    "preview": "#\n# SPDX-License-Identifier: Apache-2.0\n#\n# Copyright 2022-2023 The RIOT authors.\n#\n# Licensed under the Apache License,"
  },
  {
    "path": "core/riot-faker/riot-faker.gradle",
    "chars": 818,
    "preview": "/*\n * SPDX-License-Identifier: Apache-2.0\n *\n * Copyright 2020-2023 The RIOT authors.\n *\n * Licensed under the Apache Li"
  },
  {
    "path": "core/riot-faker/src/main/java/com/redis/riot/faker/FakerItemReader.java",
    "chars": 2103,
    "preview": "package com.redis.riot.faker;\n\nimport java.util.AbstractMap;\nimport java.util.HashMap;\nimport java.util.LinkedHashMap;\ni"
  },
  {
    "path": "core/riot-faker/src/test/java/com/redis/riot/faker/FakerReaderTests.java",
    "chars": 1178,
    "preview": "package com.redis.riot.faker;\n\nimport java.util.ArrayList;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport"
  },
  {
    "path": "core/riot-file/gradle.properties",
    "chars": 707,
    "preview": "#\n# SPDX-License-Identifier: Apache-2.0\n#\n# Copyright 2022-2023 The RIOT authors.\n#\n# Licensed under the Apache License,"
  },
  {
    "path": "core/riot-file/riot-file.gradle",
    "chars": 1182,
    "preview": "/*\n * SPDX-License-Identifier: Apache-2.0\n *\n * Copyright 2020-2023 The RIOT authors.\n *\n * Licensed under the Apache Li"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/AbstractReaderFactory.java",
    "chars": 3111,
    "preview": "package com.redis.riot.file;\n\nimport java.util.Map;\n\nimport org.springframework.batch.item.file.FlatFileItemReader;\nimpo"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/AbstractWriterFactory.java",
    "chars": 2205,
    "preview": "package com.redis.riot.file;\n\nimport java.util.ArrayList;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport "
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/DelimitedReaderFactory.java",
    "chars": 921,
    "preview": "package com.redis.riot.file;\n\nimport org.springframework.batch.item.ItemReader;\nimport org.springframework.batch.item.fi"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/DelimitedWriterFactory.java",
    "chars": 1161,
    "preview": "package com.redis.riot.file;\n\nimport java.util.Map;\n\nimport org.springframework.batch.item.ItemWriter;\nimport org.spring"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/FileOptions.java",
    "chars": 2103,
    "preview": "package com.redis.riot.file;\n\nimport java.nio.charset.StandardCharsets;\n\nimport org.springframework.batch.item.file.tran"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/FileReaderRegistry.java",
    "chars": 1143,
    "preview": "package com.redis.riot.file;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.springframework.util.MimeType;"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/FileReaderResult.java",
    "chars": 679,
    "preview": "package com.redis.riot.file;\n\nimport org.springframework.batch.item.ItemReader;\nimport org.springframework.core.io.Resou"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/FileWriterRegistry.java",
    "chars": 1142,
    "preview": "package com.redis.riot.file;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.springframework.util.MimeType;"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/FileWriterResult.java",
    "chars": 670,
    "preview": "package com.redis.riot.file;\n\nimport org.springframework.batch.item.ItemWriter;\nimport org.springframework.core.io.Resou"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/FixedWidthReaderFactory.java",
    "chars": 1072,
    "preview": "package com.redis.riot.file;\n\nimport java.util.List;\n\nimport org.springframework.batch.item.ItemReader;\nimport org.sprin"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/FormattedWriterFactory.java",
    "chars": 920,
    "preview": "package com.redis.riot.file;\n\nimport java.util.Map;\n\nimport org.springframework.batch.item.ItemWriter;\nimport org.spring"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/GoogleStorageOptions.java",
    "chars": 2450,
    "preview": "package com.redis.riot.file;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\nimport java.io.InputStrea"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/GoogleStorageProtocolResolver.java",
    "chars": 1046,
    "preview": "package com.redis.riot.file;\n\nimport java.util.function.Supplier;\n\nimport org.springframework.core.io.ProtocolResolver;\n"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/HeaderCallbackHandler.java",
    "chars": 1209,
    "preview": "package com.redis.riot.file;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.apache.commons.logging.Log;"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/JsonLineAggregator.java",
    "chars": 742,
    "preview": "package com.redis.riot.file;\n\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimpor"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/JsonLinesReaderFactory.java",
    "chars": 1087,
    "preview": "package com.redis.riot.file;\n\nimport java.util.Map;\n\nimport org.springframework.batch.item.ItemReader;\nimport org.spring"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/JsonLinesWriterFactory.java",
    "chars": 593,
    "preview": "package com.redis.riot.file;\n\nimport org.springframework.batch.item.ItemWriter;\nimport org.springframework.core.io.Writa"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/JsonReaderFactory.java",
    "chars": 1001,
    "preview": "package com.redis.riot.file;\n\nimport org.springframework.batch.item.ItemReader;\nimport org.springframework.batch.item.js"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/JsonWriterFactory.java",
    "chars": 1153,
    "preview": "package com.redis.riot.file;\n\nimport org.springframework.batch.item.ItemWriter;\nimport org.springframework.batch.item.js"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/MapFieldSetMapper.java",
    "chars": 705,
    "preview": "package com.redis.riot.file;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.springframework.batch.item.fil"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/NamedInputStreamResource.java",
    "chars": 449,
    "preview": "package com.redis.riot.file;\n\nimport java.io.InputStream;\n\nimport org.springframework.core.io.InputStreamResource;\n\npubl"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/ObjectMapperLineMapper.java",
    "chars": 556,
    "preview": "package com.redis.riot.file;\n\nimport org.springframework.batch.item.file.LineMapper;\n\nimport com.fasterxml.jackson.datab"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/OutputStreamResource.java",
    "chars": 1288,
    "preview": "package com.redis.riot.file;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimpor"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/ReadOptions.java",
    "chars": 2182,
    "preview": "package com.redis.riot.file;\n\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.u"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/ReaderFactory.java",
    "chars": 226,
    "preview": "package com.redis.riot.file;\n\nimport org.springframework.batch.item.ItemReader;\nimport org.springframework.core.io.Resou"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/ResourceFactory.java",
    "chars": 2450,
    "preview": "package com.redis.riot.file;\n\nimport java.io.IOException;\nimport java.util.HashSet;\nimport java.util.Set;\nimport java.ut"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/ResourceMap.java",
    "chars": 593,
    "preview": "package com.redis.riot.file;\n\nimport org.springframework.core.io.Resource;\nimport org.springframework.util.MimeType;\nimp"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/RiotResourceLoader.java",
    "chars": 3163,
    "preview": "package com.redis.riot.file;\n\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.util.ArrayList;\nim"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/RiotResourceMap.java",
    "chars": 1919,
    "preview": "package com.redis.riot.file;\n\nimport java.io.IOException;\nimport java.net.FileNameMap;\nimport java.net.URLConnection;\nim"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/RuntimeIOException.java",
    "chars": 355,
    "preview": "package com.redis.riot.file;\n\nimport java.io.IOException;\n\nimport org.springframework.core.NestedRuntimeException;\n\n@Sup"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/S3Options.java",
    "chars": 1712,
    "preview": "package com.redis.riot.file;\n\nimport java.net.URI;\n\nimport software.amazon.awssdk.auth.credentials.AnonymousCredentialsP"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/S3ProtocolResolver.java",
    "chars": 1971,
    "preview": "package com.redis.riot.file;\n\nimport java.util.function.Supplier;\n\nimport org.springframework.core.io.ProtocolResolver;\n"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/StdInProtocolResolver.java",
    "chars": 728,
    "preview": "package com.redis.riot.file;\n\nimport org.springframework.core.io.ProtocolResolver;\nimport org.springframework.core.io.Re"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/StdOutProtocolResolver.java",
    "chars": 641,
    "preview": "package com.redis.riot.file;\n\nimport org.springframework.core.io.ProtocolResolver;\nimport org.springframework.core.io.Re"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/SystemInResource.java",
    "chars": 389,
    "preview": "package com.redis.riot.file;\n\nimport java.io.InputStream;\n\npublic class SystemInResource extends NamedInputStreamResourc"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/SystemOutResource.java",
    "chars": 395,
    "preview": "package com.redis.riot.file;\n\nimport java.io.OutputStream;\n\npublic class SystemOutResource extends OutputStreamResource "
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/UncustomizedUrlResource.java",
    "chars": 643,
    "preview": "package com.redis.riot.file;\n\nimport org.springframework.core.io.UrlResource;\n\nimport java.io.IOException;\nimport java.n"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/WriteOptions.java",
    "chars": 2543,
    "preview": "package com.redis.riot.file;\n\nimport java.util.Map;\nimport java.util.function.Supplier;\n\nimport lombok.ToString;\n\n@ToStr"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/WriterFactory.java",
    "chars": 242,
    "preview": "package com.redis.riot.file;\n\nimport org.springframework.batch.item.ItemWriter;\nimport org.springframework.core.io.Writa"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/XmlReaderFactory.java",
    "chars": 911,
    "preview": "package com.redis.riot.file;\n\nimport org.springframework.batch.item.ItemReader;\nimport org.springframework.core.io.Resou"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/XmlWriterFactory.java",
    "chars": 1074,
    "preview": "package com.redis.riot.file;\n\nimport org.springframework.batch.item.ItemWriter;\nimport org.springframework.batch.item.js"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/xml/XmlItemReader.java",
    "chars": 3060,
    "preview": "package com.redis.riot.file.xml;\n\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\ni"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/xml/XmlItemReaderBuilder.java",
    "chars": 4024,
    "preview": "package com.redis.riot.file.xml;\n\nimport org.springframework.core.io.Resource;\nimport org.springframework.util.Assert;\ni"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/xml/XmlObjectReader.java",
    "chars": 2108,
    "preview": "package com.redis.riot.file.xml;\n\nimport com.fasterxml.jackson.core.JsonParseException;\nimport com.fasterxml.jackson.dat"
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/xml/XmlResourceItemWriter.java",
    "chars": 3753,
    "preview": "/*\n * Copyright 2018 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "core/riot-file/src/main/java/com/redis/riot/file/xml/XmlResourceItemWriterBuilder.java",
    "chars": 7494,
    "preview": "/*\n * Copyright 2018 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "core/riot-file/src/test/java/com/redis/riot/file/ReaderTests.java",
    "chars": 4581,
    "preview": "package com.redis.riot.file;\n\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\ni"
  },
  {
    "path": "core/riot-test/gradle.properties",
    "chars": 707,
    "preview": "#\n# SPDX-License-Identifier: Apache-2.0\n#\n# Copyright 2020-2023 The RIOT authors.\n#\n# Licensed under the Apache License,"
  },
  {
    "path": "core/riot-test/riot-test.gradle",
    "chars": 1182,
    "preview": "/*\n * SPDX-License-Identifier: Apache-2.0\n *\n * Copyright 2020-2023 The RIOT authors.\n *\n * Licensed under the Apache Li"
  },
  {
    "path": "core/riot-test/src/main/java/com/redis/riot/test/AbstractRiotTestBase.java",
    "chars": 3694,
    "preview": "package com.redis.riot.test;\n\nimport java.io.InputStream;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Str"
  },
  {
    "path": "docs/LICENSE",
    "chars": 10174,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "docs/guide/gradle.properties",
    "chars": 663,
    "preview": "#\n# SPDX-License-Identifier: Apache-2.0\n#\n# Copyright 2020-2023 The RIOT authors.\n#\n# Licensed under the Apache License,"
  },
  {
    "path": "docs/guide/guide.gradle",
    "chars": 622,
    "preview": "plugins {\n    id 'org.kordamp.gradle.guide'\n    id 'org.ajoberstar.git-publish'\n}\n\nconfigurations {\n    asciidoctorExten"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/_links.adoc",
    "chars": 1784,
    "preview": ":link_etl:              link:https://en.wikipedia.org/wiki/Extract,_transform,_load[ETL]\n:link_releases:         link:{p"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/changelog.adoc",
    "chars": 532,
    "preview": "[[_changelog]]\n= Changelog\n\nYou can use {project-title} to stream change data from a Redis database. \n\n.Streaming to std"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/concepts.adoc",
    "chars": 3062,
    "preview": "[[_concepts]]\n= Concepts\n\n{project-title} is essentially an {link_etl} tool where data is extracted from the source syst"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/cookbook.adoc",
    "chars": 223,
    "preview": "[[_cookbook]]\n= Cookbook\n\nHere are various recipes using {project-title}.\n\n:leveloffset: +1\ninclude::{includedir}/change"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/databases.adoc",
    "chars": 2892,
    "preview": "[[_db]]\n= Databases\n\n{project-title} includes two commands for interaction with relational databases:\n\n<<_db_import, `db"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/datagen.adoc",
    "chars": 2160,
    "preview": "[[_datagen]]\n= Data Generation\n\n{project-title} includes 2 commands for data generation:\n\n<<_datagen_struct,`generate`>>"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/elasticache.adoc",
    "chars": 4002,
    "preview": ":ec: ElastiCache\n\n[[_elasticache]]\n= {ec} Migration\n\nThis recipe contains step-by-step instructions to migrate an {ec} ("
  },
  {
    "path": "docs/guide/src/docs/asciidoc/export.adoc",
    "chars": 782,
    "preview": "= Exporting\n\nWhen exporting data from Redis the following options allow for filtering .\n\n== Key Filtering\n\nKey filtering"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/faq.adoc",
    "chars": 2082,
    "preview": "[[_faq]]\n= FAQ\n\n[qanda]\nLogs are cut off or missing::\n  This could be due to concurrency issues in the terminal when ref"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/files.adoc",
    "chars": 6437,
    "preview": "[[_file]]\n= Files\n\n{project-title} includes two commands to work with files in various formats:\n\n<<_file_import,`file-im"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/import.adoc",
    "chars": 2339,
    "preview": "= Importing\n\nWhen importing data into Redis (`file-import`, `db-import`, `faker`) the following options allow for field-"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/index.adoc",
    "chars": 438,
    "preview": "= Redis Input/Output Tools ({project-title})\nJulien Ruaux\n:title-logo-image: image:riot.svg[]\n:author: {project-author}\n"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/install.adoc",
    "chars": 1040,
    "preview": "[[_install]]\n= Install\n\n{project-title} can be installed on Linux, macOS, and Windows platforms and can be used as a sta"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/introduction.adoc",
    "chars": 1427,
    "preview": "[[_introduction]]\n= Introduction\n\n{project-title} is a command-line utility to get data in and out of Redis. It supports"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/ping.adoc",
    "chars": 611,
    "preview": "[[_ping]]\n= Connectivity Test\n\nThe `ping` command can be used to test connectivity to a Redis database.\n\n[source,console"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/replication.adoc",
    "chars": 7304,
    "preview": "[[_replication]]\n= Replication\n\nThe `replicate` command reads data from a *source* Redis database and writes to a *targe"
  },
  {
    "path": "docs/guide/src/docs/asciidoc/usage.adoc",
    "chars": 650,
    "preview": "[[_usage]]\n= Usage\n\nYou can launch {project-title} with the following command:\n\n[source,console]\n----\nriot\n----\n\nThis wi"
  },
  {
    "path": "docs/guide/src/docs/resources/images/Diagrams.drawio",
    "chars": 35013,
    "preview": "<mxfile host=\"Electron\" modified=\"2024-06-10T18:34:25.945Z\" agent=\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Apple"
  },
  {
    "path": "docs/guide/src/docs/resources/order.json",
    "chars": 368,
    "preview": "{\n  \"order_id\": 10248,\n  \"customer_id\": \"VINET\",\n  \"employee_id\": 5,\n  \"order_date\": \"1996-07-04\",\n  \"required_date\": \"1"
  },
  {
    "path": "docs/guide/src/docs/resources/redis-dump.json",
    "chars": 893,
    "preview": "[\n  {\n    \"key\": \"string:615\",\n    \"ttl\": -1,\n    \"value\": \"value:615\",\n    \"type\": \"STRING\"\n  },\n  {\n    \"key\": \"hash:5"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 253,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
  },
  {
    "path": "gradle.properties",
    "chars": 2018,
    "preview": "#\n# SPDX-License-Identifier: Apache-2.0\n#\n# Copyright 2022-2023 The RIOT authors.\n#\n# Licensed under the Apache License,"
  },
  {
    "path": "gradlew",
    "chars": 8740,
    "preview": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "gradlew.bat",
    "chars": 2966,
    "preview": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (th"
  },
  {
    "path": "jreleaser.yml",
    "chars": 6622,
    "preview": "environment:\n  properties:\n    jdkPathPrefix: 'plugins/riot/build/jdks'\n    jdkFilePrefix: 'zulu21.38.21-ca-jdk21.0.5'\n\n"
  },
  {
    "path": "plugins/LICENSE",
    "chars": 10174,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "plugins/riot/gradle.properties",
    "chars": 697,
    "preview": "#\n# SPDX-License-Identifier: Apache-2.0\n#\n# Copyright 2020-2023 The RIOT authors.\n#\n# Licensed under the Apache License,"
  },
  {
    "path": "plugins/riot/riot.gradle",
    "chars": 5070,
    "preview": "/*\n * SPDX-License-Identifier: Apache-2.0\n *\n * Copyright 2020-2023 The RIOT authors.\n *\n * Licensed under the Apache Li"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/AbstractCompareCommand.java",
    "chars": 6587,
    "preview": "package com.redis.riot;\n\nimport java.time.temporal.ChronoUnit;\nimport java.util.stream.Collectors;\n\nimport org.springfra"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/AbstractExportCommand.java",
    "chars": 3723,
    "preview": "package com.redis.riot;\n\nimport org.springframework.batch.item.ItemWriter;\nimport org.springframework.expression.spel.su"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/AbstractFileExport.java",
    "chars": 5065,
    "preview": "package com.redis.riot;\n\nimport java.io.IOException;\nimport java.util.Collections;\nimport java.util.Map;\n\nimport org.spr"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/AbstractFileImport.java",
    "chars": 6583,
    "preview": "package com.redis.riot;\n\nimport java.io.IOException;\nimport java.text.ParseException;\nimport java.util.ArrayList;\nimport"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/AbstractImportCommand.java",
    "chars": 6281,
    "preview": "package com.redis.riot;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Ma"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/AbstractRedisCommand.java",
    "chars": 1268,
    "preview": "package com.redis.riot;\n\nimport com.redis.lettucemod.api.sync.RedisModulesCommands;\nimport com.redis.riot.core.AbstractJ"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/AbstractRedisExportCommand.java",
    "chars": 1465,
    "preview": "package com.redis.riot;\n\nimport java.util.Map;\nimport java.util.regex.Pattern;\n\nimport org.springframework.batch.item.It"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/AbstractRedisImportCommand.java",
    "chars": 498,
    "preview": "package com.redis.riot;\n\nimport picocli.CommandLine.ArgGroup;\n\npublic abstract class AbstractRedisImportCommand extends "
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/AbstractRedisTargetExportCommand.java",
    "chars": 3022,
    "preview": "package com.redis.riot;\n\nimport org.springframework.expression.spel.support.StandardEvaluationContext;\n\nimport com.redis"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/Compare.java",
    "chars": 1100,
    "preview": "package com.redis.riot;\n\nimport org.springframework.batch.core.Job;\n\nimport picocli.CommandLine.Command;\nimport picocli."
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/CompareLoggingWriteListener.java",
    "chars": 1525,
    "preview": "package com.redis.riot;\n\nimport java.util.function.Function;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/CompareMode.java",
    "chars": 71,
    "preview": "package com.redis.riot;\n\npublic enum CompareMode {\n\tFULL, QUICK, NONE\n}"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/CompareStepListener.java",
    "chars": 2500,
    "preview": "package com.redis.riot;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.LinkedHashMap;\nimport jav"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/ContentType.java",
    "chars": 66,
    "preview": "package com.redis.riot;\n\npublic enum ContentType {\n\tSTRUCT, MAP\n}\n"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/DataSourceArgs.java",
    "chars": 1825,
    "preview": "package com.redis.riot;\n\nimport javax.sql.DataSource;\n\nimport org.springframework.boot.autoconfigure.jdbc.DataSourceProp"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/DatabaseExport.java",
    "chars": 2962,
    "preview": "package com.redis.riot;\n\nimport java.util.Map;\n\nimport javax.sql.DataSource;\n\nimport org.springframework.batch.core.Job;"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/DatabaseImport.java",
    "chars": 1452,
    "preview": "package com.redis.riot;\n\nimport java.util.Map;\n\nimport org.springframework.batch.core.Job;\nimport org.springframework.ba"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/DatabaseReaderArgs.java",
    "chars": 2624,
    "preview": "package com.redis.riot;\n\nimport org.springframework.batch.item.database.AbstractCursorItemReader;\n\nimport com.redis.riot"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/EvaluationContextArgs.java",
    "chars": 2967,
    "preview": "package com.redis.riot;\n\nimport java.text.DecimalFormat;\nimport java.text.SimpleDateFormat;\nimport java.util.LinkedHashM"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/ExportStepHelper.java",
    "chars": 2492,
    "preview": "package com.redis.riot;\n\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.stream.Collectors;\n\nimport org.slf"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/ExpressionProcessor.java",
    "chars": 740,
    "preview": "package com.redis.riot;\n\nimport java.util.Map;\n\nimport org.springframework.batch.item.ItemProcessor;\nimport org.springfr"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/FakerImport.java",
    "chars": 2069,
    "preview": "package com.redis.riot;\n\nimport java.util.LinkedHashMap;\nimport java.util.Locale;\nimport java.util.Map;\n\nimport org.spri"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/FileArgs.java",
    "chars": 2097,
    "preview": "package com.redis.riot;\n\nimport com.redis.riot.file.FileOptions;\n\nimport lombok.ToString;\nimport picocli.CommandLine.Arg"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/FileExport.java",
    "chars": 612,
    "preview": "package com.redis.riot;\n\nimport org.springframework.util.MimeType;\n\nimport picocli.CommandLine.ArgGroup;\nimport picocli."
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/FileImport.java",
    "chars": 605,
    "preview": "package com.redis.riot;\n\nimport org.springframework.util.MimeType;\n\nimport picocli.CommandLine.ArgGroup;\nimport picocli."
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/FileReaderArgs.java",
    "chars": 3106,
    "preview": "package com.redis.riot;\n\nimport java.util.List;\nimport java.util.Set;\n\nimport com.redis.riot.file.ReadOptions;\n\nimport l"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/FileTypeArgs.java",
    "chars": 1415,
    "preview": "package com.redis.riot;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.springf"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/FileWriterArgs.java",
    "chars": 4093,
    "preview": "package com.redis.riot;\n\nimport com.google.cloud.spring.core.GcpScope;\nimport com.redis.riot.file.WriteOptions;\n\nimport "
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/Generate.java",
    "chars": 3372,
    "preview": "package com.redis.riot;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.springframework.batch.core.Job;\n"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/GenerateArgs.java",
    "chars": 11540,
    "preview": "package com.redis.riot;\n\nimport java.time.Instant;\nimport java.util.List;\n\nimport com.redis.spring.batch.item.redis.comm"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/GoogleStorageArgs.java",
    "chars": 1280,
    "preview": "package com.redis.riot;\n\nimport java.nio.file.Path;\n\nimport com.redis.riot.file.GoogleStorageOptions;\n\nimport lombok.ToS"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/ImportProcessorArgs.java",
    "chars": 925,
    "preview": "package com.redis.riot;\n\nimport java.util.Map;\n\nimport com.redis.riot.core.Expression;\n\nimport lombok.ToString;\nimport p"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/JdbcCursorItemReaderFactory.java",
    "chars": 1389,
    "preview": "package com.redis.riot;\n\nimport java.util.Map;\n\nimport javax.sql.DataSource;\n\nimport org.springframework.batch.item.data"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/KeyFilterArgs.java",
    "chars": 3875,
    "preview": "package com.redis.riot;\n\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.function.Function;\nimport ja"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/KeyValueDeserializer.java",
    "chars": 5618,
    "preview": "package com.redis.riot;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport jav"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/KeyValueFilter.java",
    "chars": 1154,
    "preview": "package com.redis.riot;\n\nimport java.util.function.Function;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\ni"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/KeyValueProcessorArgs.java",
    "chars": 3462,
    "preview": "package com.redis.riot;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.function.Consumer;\n\nimport "
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/MemoryUsageArgs.java",
    "chars": 1209,
    "preview": "package com.redis.riot;\n\nimport org.springframework.util.unit.DataSize;\n\nimport com.redis.spring.batch.item.redis.RedisI"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/Ping.java",
    "chars": 3697,
    "preview": "package com.redis.riot;\n\nimport java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.S"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/PingExecution.java",
    "chars": 594,
    "preview": "package com.redis.riot;\n\nimport java.time.Duration;\n\npublic class PingExecution {\n\n\tprivate static final String PONG = \""
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/PingExecutionItemReader.java",
    "chars": 818,
    "preview": "package com.redis.riot;\n\nimport org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader;\nimport "
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/RangeConverter.java",
    "chars": 772,
    "preview": "package com.redis.riot;\n\nimport org.springframework.util.StringUtils;\n\nimport com.redis.spring.batch.item.redis.common.R"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/ReadFrom.java",
    "chars": 627,
    "preview": "package com.redis.riot;\n\npublic enum ReadFrom {\n\n\tUPSTREAM(io.lettuce.core.ReadFrom.UPSTREAM), UPSTREAM_PREFERRED(io.let"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/RedisArgs.java",
    "chars": 7158,
    "preview": "package com.redis.riot;\n\nimport java.io.File;\n\nimport com.redis.riot.core.RiotDuration;\n\nimport io.lettuce.core.RedisURI"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/RedisClientArgs.java",
    "chars": 1833,
    "preview": "package com.redis.riot;\n\nimport java.io.File;\n\nimport com.redis.lettucemod.RedisURIBuilder;\nimport com.redis.riot.core.R"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/RedisContext.java",
    "chars": 5383,
    "preview": "package com.redis.riot;\n\nimport org.springframework.beans.factory.InitializingBean;\n\nimport com.redis.lettucemod.RedisMo"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/RedisReaderArgs.java",
    "chars": 5238,
    "preview": "package com.redis.riot;\n\nimport java.time.temporal.ChronoUnit;\n\nimport org.springframework.batch.item.ItemProcessor;\nimp"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/RedisReaderLiveArgs.java",
    "chars": 1841,
    "preview": "package com.redis.riot;\n\nimport java.time.temporal.ChronoUnit;\n\nimport com.redis.riot.core.RiotDuration;\nimport com.redi"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/RedisURIConverter.java",
    "chars": 387,
    "preview": "package com.redis.riot;\n\nimport io.lettuce.core.RedisURI;\nimport picocli.CommandLine.ITypeConverter;\n\npublic class Redis"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/RedisWriterArgs.java",
    "chars": 2176,
    "preview": "package com.redis.riot;\n\nimport java.time.temporal.ChronoUnit;\n\nimport com.redis.riot.core.RiotDuration;\nimport com.redi"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/Replicate.java",
    "chars": 5079,
    "preview": "package com.redis.riot;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.springframework.batch.core.Job;\n"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/ReplicateReadLogger.java",
    "chars": 1663,
    "preview": "package com.redis.riot;\n\nimport java.util.function.Function;\n\nimport org.slf4j.Logger;\nimport org.springframework.batch."
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/ReplicateWriteLogger.java",
    "chars": 1401,
    "preview": "package com.redis.riot;\n\nimport java.util.function.Function;\n\nimport org.slf4j.Logger;\nimport org.springframework.batch."
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/Riot.java",
    "chars": 711,
    "preview": "package com.redis.riot;\n\nimport picocli.AutoComplete.GenerateCompletion;\nimport picocli.CommandLine.Command;\n\n@Command(n"
  },
  {
    "path": "plugins/riot/src/main/java/com/redis/riot/RiotMainCommand.java",
    "chars": 1588,
    "preview": "package com.redis.riot;\n\nimport com.redis.riot.core.MainCommand;\nimport com.redis.riot.operation.OperationCommand;\nimpor"
  }
]

// ... and 146 more files (download for full content)

About this extraction

This page contains the full source code of the redis-developer/riot GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 346 files (2.4 MB), approximately 646.6k tokens, and a symbol index with 1718 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!