diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 58a121025..55f0d0448 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,6 +22,22 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} dry: true + # golangci-lint must be run separately from "validate" as there are go mod issues if you run it after the vet + golangci: + name: lint + runs-on: ubuntu-latest + steps: + - uses: actions/setup-go@v3 + with: + go-version: 1.19 + - uses: actions/checkout@v3 + - name: golangci-lint + uses: golangci/golangci-lint-action@v3 + with: + # Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version + # version: v1.29 + args: --timeout=5m + validate: name: Code Checks runs-on: ubuntu-latest @@ -40,10 +56,5 @@ jobs: - name: go vet run: go vet ./... - - name: golangci-lint - uses: golangci/golangci-lint-action@v3 - with: - args: --timeout=5m - - name: test run: go test ./... diff --git a/.golangci.yml b/.golangci.yml index d77b39858..cfd527473 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,1854 +1,60 @@ -# This file contains all available configuration options -# with their default values (in comments). -# -# This file is not a configuration example, -# it contains the exhaustive configuration with explanations of the options. - -# Options for analysis running. run: - # Timeout for analysis, e.g. 30s, 5m. - # Default: 1m + deadline: 5m timeout: 5m - - # Exit code when at least one issue was found. - # Default: 1 - issues-exit-code: 1 - - # Include test files or not. - # Default: true - tests: true - - # Enables skipping of directories: - # - vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ - # Default: true skip-dirs-use-default: true + #skip the protobuf generated files + skip-dirs: + - pb + - proto + skip-files: + - pql/pql.peg.go +linters: + enable: + - govet + - gofmt + - staticcheck + enable-all: false + disable-all: true - # If set we pass it to "go list -mod={option}". From "go help modules": - # If invoked with -mod=readonly, the go command is disallowed from the implicit - # automatic updating of go.mod described above. Instead, it fails when any changes - # to go.mod are needed. This setting is most useful to check that go.mod does - # not need updates, such as in a continuous integration and testing system. - # If invoked with -mod=vendor, the go command assumes that the vendor - # directory holds the correct copies of dependencies and ignores - # the dependency descriptions in go.mod. - # - # Allowed values: readonly|vendor|mod - # By default, it isn't set. - modules-download-mode: readonly - - # Allow multiple parallel golangci-lint instances running. - # If false (default) - golangci-lint acquires file lock on start. - allow-parallel-runners: false - - # Define the Go version limit. - # Mainly related to generics support since go1.18. - # Default: use Go version from the go.mod file, fallback on the env var `GOVERSION`, fallback on 1.18 - go: '1.19' - - -# output configuration options output: - # Format: colored-line-number|line-number|json|tab|checkstyle|code-climate|junit-xml|github-actions - # - # Multiple can be specified by separating them by comma, output can be provided - # for each of them by separating format name and path by colon symbol. - # Output path can be either `stdout`, `stderr` or path to the file to write to. - # Example: "checkstyle:report.json,colored-line-number" - # - # Default: colored-line-number - format: colored-line-number - - # Print lines of code with issue. - # Default: true + # colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number" + format: tab + # print lines of code with issue, default is true print-issued-lines: true - - # Print linter name in the end of issue text. - # Default: true + # print linter name in the end of issue text, default is true print-linter-name: true - # Make issues output unique by line. - # Default: true - uniq-by-line: true - - # Add a prefix to the output file references. - # Default is no prefix. - path-prefix: "" - - # Sort results by: filepath, line and column. - sort-results: true - - -# All available settings of specific linters. linters-settings: - asasalint: - # To specify a set of function names to exclude. - # The values are merged with the builtin exclusions. - # The builtin exclusions can be disabled by setting `use-builtin-exclusions` to `false`. - # Default: ["^(fmt|log|logger|t|)\.(Print|Fprint|Sprint|Fatal|Panic|Error|Warn|Warning|Info|Debug|Log)(|f|ln)$"] - exclude: - - Append - - \.Wrapf - # To enable/disable the asasalint builtin exclusions of function names. - # See the default value of `exclude` to get the builtin exclusions. - # Default: true - use-builtin-exclusions: false - # Ignore *_test.go files. - # Default: false - ignore-test: true - - bidichk: - # The following configurations check for all mentioned invisible unicode runes. - # All runes are enabled by default. - left-to-right-embedding: false - right-to-left-embedding: false - pop-directional-formatting: false - left-to-right-override: false - right-to-left-override: false - left-to-right-isolate: false - right-to-left-isolate: false - first-strong-isolate: false - pop-directional-isolate: false - - cyclop: - # The maximal code complexity to report. - # Default: 10 - max-complexity: 10 - # The maximal average package complexity. - # If it's higher than 0.0 (float) the check is enabled - # Default: 0.0 - package-average: 0.5 - # Should ignore tests. - # Default: false - skip-tests: false - - decorder: - # Required order of `type`, `const`, `var` and `func` declarations inside a file. - # Default: types before constants before variables before functions. - dec-order: - - type - - const - - var - - func - - # If true, order of declarations is not checked at all. - # Default: true (disabled) - disable-dec-order-check: false - - # If true, `init` func can be anywhere in file (does not have to be declared before all other functions). - # Default: true (disabled) - disable-init-func-first-check: false - - # If true, multiple global `type`, `const` and `var` declarations are allowed. - # Default: true (disabled) - disable-dec-num-check: false - - depguard: - # Kind of list is passed in. - # Allowed values: allowlist|denylist - # Default: denylist - list-type: denylist - - # Check the list against standard lib. - # Default: false - include-go-root: false - - # A list of packages for the list type specified. - # Can accept both string prefixes and string glob patterns. - # Default: [] - packages: [] - - # A list of packages for the list type specified. - # Specify an error message to output when a denied package is used. - # Default: [] - packages-with-error-message: [] - - # Specify rules by which the linter ignores certain files for consideration. - # Can accept both string prefixes and string glob patterns. - # The ! character in front of the rule is a special character - # which signals that the linter should negate the rule. - # This allows for more precise control, but it is only available for glob patterns. - # Default: [] - ignore-file-rules: [] - - dogsled: - # Checks assignments with too many blank identifiers. - # Default: 2 - max-blank-identifiers: 3 - - dupl: - # Tokens count to trigger issue. - # Default: 150 - threshold: 100 - - errcheck: - # Report about not checking of errors in type assertions: `a := b.(MyStruct)`. - # Such cases aren't reported by default. - # Default: false - check-type-assertions: true - - # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`. - # Such cases aren't reported by default. - # Default: false - check-blank: false - - # To disable the errcheck built-in exclude list. - # See `-excludeonly` option in https://github.com/kisielk/errcheck#excluding-functions for details. - # Default: false - disable-default-exclusions: false - - errchkjson: - # With check-error-free-encoding set to true, errchkjson does warn about errors - # from json encoding functions that are safe to be ignored, - # because they are not possible to happen. - # - # if check-error-free-encoding is set to true and errcheck linter is enabled, - # it is recommended to add the following exceptions to prevent from false positives: - # - # linters-settings: - # errcheck: - # exclude-functions: - # - encoding/json.Marshal - # - encoding/json.MarshalIndent - # - # Default: false - check-error-free-encoding: true - - # Issue on struct encoding that doesn't have exported fields. - # Default: false - report-no-exported: false - - errorlint: - # Check whether fmt.Errorf uses the %w verb for formatting errors. - # See the https://github.com/polyfloyd/go-errorlint for caveats. - # Default: true - errorf: false - # Check for plain type assertions and type switches. - # Default: true - asserts: false - # Check for plain error comparisons. - # Default: true - comparison: false - - exhaustive: - # Program elements to check for exhaustiveness. - # Default: [ switch ] - check: - - switch - - map - # Check switch statements in generated files also. - # Default: false - check-generated: true - # Presence of "default" case in switch statements satisfies exhaustiveness, - # even if all enum members are not listed. - # Default: false - default-signifies-exhaustive: true - # Enum members matching the supplied regex do not have to be listed in - # switch statements to satisfy exhaustiveness. - # Default: "" - ignore-enum-members: "Example.+" - # Consider enums only in package scopes, not in inner scopes. - # Default: false - package-scope-only: true - # Only run exhaustive check on switches with "//exhaustive:enforce" comment. - # Default: false - explicit-exhaustive-switch: true - # Only run exhaustive check on map literals with "//exhaustive:enforce" comment. - # Default: false - explicit-exhaustive-map: true - - exhaustruct: - # List of regular expressions to match struct packages and names. - # If this list is empty, all structs are tested. - # Default: [] - include: - - '.*\.Test' - - 'example\.com/package\.ExampleStruct[\d]{1,2}' - # List of regular expressions to exclude struct packages and names from check. - # Default: [] - exclude: - - 'cobra\.Command$' - - forbidigo: - # Forbid the following identifiers (list of regexp). - # Default: ["^(fmt\\.Print(|f|ln)|print|println)$"] - forbid: - - ^print.*$ - - 'fmt\.Print.*' - # Optionally put comments at the end of the regex, surrounded by `(# )?` - # Escape any special characters. - - 'fmt\.Print.*(# Do not commit print statements\.)?' - # Exclude godoc examples from forbidigo checks. - # Default: true - exclude_godoc_examples: false - - funlen: - # Checks the number of lines in a function. - # If lower than 0, disable the check. - # Default: 60 - lines: -1 - # Checks the number of statements in a function. - # If lower than 0, disable the check. - # Default: 40 - statements: -1 - - gci: - - # Section configuration to compare against. - # Section names are case-insensitive and may contain parameters in (). - # The default order of sections is `standard > default > custom > blank > dot`, - # If `custom-order` is `true`, it follows the order of `sections` option. - # Default: ["standard", "default"] - sections: - - standard # Standard section: captures all standard packages. - - default # Default section: contains all imports that could not be matched to another section type. - - prefix(github.com/featurebasedb/featurebase) # Custom section: groups all imports with the specified Prefix. - - blank # Blank section: contains all blank imports. This section is not present unless explicitly enabled. - - dot # Dot section: contains all dot imports. This section is not present unless explicitly enabled. - - # Skip generated files. - # Default: true - skip-generated: false - - # Enable custom order of sections. - # If `true`, make the section order the same as the order of `sections`. - # Default: false - custom-order: true - - gocognit: - # Minimal code complexity to report - # Default: 30 (but we recommend 10-20) - min-complexity: 30 - - goconst: - # Minimal length of string constant. - # Default: 3 - min-len: 2 - # Minimum occurrences of constant string count to trigger issue. - # Default: 3 - min-occurrences: 2 - # Ignore test files. - # Default: false - ignore-tests: true - # Look for existing constants matching the values. - # Default: true - match-constant: false - # Search also for duplicated numbers. - # Default: false - numbers: true - # Minimum value, only works with goconst.numbers - # Default: 3 - min: 2 - # Maximum value, only works with goconst.numbers - # Default: 3 - max: 2 - # Ignore when constant is not used as function argument. - # Default: true - ignore-calls: false - - gocritic: - # Which checks should be enabled; can't be combined with 'disabled-checks'. - # See https://go-critic.github.io/overview#checks-overview. - # To check which checks are enabled run `GL_DEBUG=gocritic golangci-lint run`. - # By default, list of stable checks is used. - enabled-checks: - - nestingReduce - - unnamedResult - - ruleguard - - truncateCmp - - # Which checks should be disabled; can't be combined with 'enabled-checks'. - # Default: [] - disabled-checks: [] - - # Settings passed to gocritic. - # The settings key is the name of a supported gocritic checker. - # The list of supported checkers can be find in https://go-critic.github.io/overview. - settings: - # Must be valid enabled check name. - nestingReduce: - # Min number of statements inside a branch to trigger a warning. - # Default: 5 - bodyWidth: 4 - ruleguard: - # Enable debug to identify which 'Where' condition was rejected. - # The value of the parameter is the name of a function in a ruleguard file. - # - # When a rule is evaluated: - # If: - # The Match() clause is accepted; and - # One of the conditions in the Where() clause is rejected, - # Then: - # ruleguard prints the specific Where() condition that was rejected. - # - # The flag is passed to the ruleguard 'debug-group' argument. - # Default: "" - debug: 'emptyDecl' - # Determines the behavior when an error occurs while parsing ruleguard files. - # If flag is not set, log error and skip rule files that contain an error. - # If flag is set, the value must be a comma-separated list of error conditions. - # - 'all': fail on all errors. - # - 'import': ruleguard rule imports a package that cannot be found. - # - 'dsl': gorule file does not comply with the ruleguard DSL. - # Default: "" - failOn: dsl - # Comma-separated list of file paths containing ruleguard rules. - # If a path is relative, it is relative to the directory where the golangci-lint command is executed. - # The special '${configDir}' variable is substituted with the absolute directory containing the golangci config file. - # Glob patterns such as 'rules-*.go' may be specified. - # Default: "" - rules: '${configDir}/ruleguard/rules-*.go,${configDir}/myrule1.go' - # Comma-separated list of enabled groups or skip empty to enable everything. - # Tags can be defined with # character prefix. - # Default: "" - enable: "myGroupName,#myTagName" - # Comma-separated list of disabled groups or skip empty to enable everything. - # Tags can be defined with # character prefix. - # Default: "" - disable: "myGroupName,#myTagName" - truncateCmp: - # Whether to skip int/uint/uintptr types. - # Default: true - skipArchDependent: false - unnamedResult: - # Whether to check exported functions. - # Default: false - checkExported: true - - gocyclo: - # Minimal code complexity to report. - # Default: 30 (but we recommend 10-20) - min-complexity: 10 - - godot: - # Comments to be checked: `declarations`, `toplevel`, or `all`. - # Default: declarations - scope: toplevel - # List of regexps for excluding particular comment lines from check. - # Default: [] - exclude: - # Exclude todo and fixme comments. - - "^fixme:" - - "^todo:" - # Check that each sentence ends with a period. - # Default: true - period: false - # Check that each sentence starts with a capital letter. - # Default: false - capital: true - - godox: - # Report any comments starting with keywords, this is useful for TODO or FIXME comments that - # might be left in the code accidentally and should be resolved before merging. - # Default: ["TODO", "BUG", "FIXME"] - keywords: - - NOTE - - OPTIMIZE # marks code that should be optimized before merging - - HACK # marks hack-around that should be removed before merging - gofmt: - # Simplify code: gofmt with `-s` option. - # Default: true simplify: true - - gofumpt: - # Module path which contains the source code being formatted. - # Default: "" - module-path: github.com/featurebasedb/featurebase - - # Choose whether to use the extra rules. - # Default: false - extra-rules: true - - goheader: - # Supports two types 'const` and `regexp`. - # Values can be used recursively. - # Default: {} - values: - const: - # Define here const type values in format k:v. - # For example: - COMPANY: MY COMPANY - regexp: - # Define here regexp type values. - # for example: - AUTHOR: .*@mycompany\.com - # The template use for checking. - # Default: "" - template: |- - # Put here copyright header template for source code files - # For example: - # Note: {{ YEAR }} is a builtin value that returns the year relative to the current machine time. - # - # {{ AUTHOR }} {{ COMPANY }} {{ YEAR }} - # SPDX-License-Identifier: Apache-2.0 - - # 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: - - # http://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. - # As alternative of directive 'template', you may put the path to file with the template source. - # Useful if you need to load the template from a specific file. - # Default: "" - template-path: /path/to/my/template.tmpl - - goimports: - # Put imports beginning with prefix after 3rd-party packages. - # It's a comma-separated list of prefixes. - # Default: "" - local-prefixes: github.com/org/project - - gomnd: - # List of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description. - # Default: ["argument", "case", "condition", "operation", "return", "assign"] - checks: - - argument - - case - - condition - - operation - - return - - assign - # List of numbers to exclude from analysis. - # The numbers should be written as string. - # Values always ignored: "1", "1.0", "0" and "0.0" - # Default: [] - ignored-numbers: - - '0666' - - '0755' - - '42' - # List of file patterns to exclude from analysis. - # Values always ignored: `.+_test.go` - # Default: [] - ignored-files: - - 'magic1_.*.go' - # List of function patterns to exclude from analysis. - # Values always ignored: `time.Date` - # Default: [] - ignored-functions: - - 'math.*' - - 'http.StatusText' - - gomoddirectives: - # Allow local `replace` directives. - # Default: false - replace-local: false - # List of allowed `replace` directives. - # Default: [] - replace-allow-list: - - launchpad.net/gocheck - # Allow to not explain why the version has been retracted in the `retract` directives. - # Default: false - retract-allow-no-explanation: false - # Forbid the use of the `exclude` directives. - # Default: false - exclude-forbidden: false - - gomodguard: - allowed: - # List of allowed modules. - # Default: [] - modules: - - gopkg.in/yaml.v2 - # List of allowed module domains. - # Default: [] - domains: - - golang.org - blocked: - # List of blocked modules. - # Default: [] - modules: - # Blocked module. - - github.com/uudashr/go-module: - # Recommended modules that should be used instead. (Optional) - recommendations: - - golang.org/x/mod - # Reason why the recommended module should be used. (Optional) - reason: "`mod` is the official go.mod parser library." - # List of blocked module version constraints. - # Default: [] - versions: - # Blocked module with version constraint. - - github.com/mitchellh/go-homedir: - # Version constraint, see https://github.com/Masterminds/semver#basic-comparisons. - version: "< 1.1.0" - # Reason why the version constraint exists. (Optional) - reason: "testing if blocked version constraint works." - # Set to true to raise lint issues for packages that are loaded from a local path via replace directive. - # Default: false - local_replace_directives: false - - gosimple: - # Sxxxx checks in https://staticcheck.io/docs/configuration/options/#checks - # Default: ["*"] - checks: [ "all" ] - - gosec: - # To select a subset of rules to run. - # Available rules: https://github.com/securego/gosec#available-rules - # Default: [] - means include all rules - includes: - - G101 # Look for hard coded credentials - - G102 # Bind to all interfaces - - G103 # Audit the use of unsafe block - - G104 # Audit errors not checked - - G106 # Audit the use of ssh.InsecureIgnoreHostKey - - G107 # Url provided to HTTP request as taint input - - G108 # Profiling endpoint automatically exposed on /debug/pprof - - G109 # Potential Integer overflow made by strconv.Atoi result conversion to int16/32 - - G110 # Potential DoS vulnerability via decompression bomb - - G111 # Potential directory traversal - - G112 # Potential slowloris attack - - G113 # Usage of Rat.SetString in math/big with an overflow (CVE-2022-23772) - - G114 # Use of net/http serve function that has no support for setting timeouts - - G201 # SQL query construction using format string - - G202 # SQL query construction using string concatenation - - G203 # Use of unescaped data in HTML templates - - G204 # Audit use of command execution - - G301 # Poor file permissions used when creating a directory - - G302 # Poor file permissions used with chmod - - G303 # Creating tempfile using a predictable path - - G304 # File path provided as taint input - - G305 # File traversal when extracting zip/tar archive - - G306 # Poor file permissions used when writing to a new file - - G307 # Deferring a method which returns an error - - G401 # Detect the usage of DES, RC4, MD5 or SHA1 - - G402 # Look for bad TLS connection settings - - G403 # Ensure minimum RSA key length of 2048 bits - - G404 # Insecure random number source (rand) - - G501 # Import blocklist: crypto/md5 - - G502 # Import blocklist: crypto/des - - G503 # Import blocklist: crypto/rc4 - - G504 # Import blocklist: net/http/cgi - - G505 # Import blocklist: crypto/sha1 - - G601 # Implicit memory aliasing of items from a range statement - - # To specify a set of rules to explicitly exclude. - # Available rules: https://github.com/securego/gosec#available-rules - # Default: [] - excludes: - - G101 # Look for hard coded credentials - - G102 # Bind to all interfaces - - G103 # Audit the use of unsafe block - - G104 # Audit errors not checked - - G106 # Audit the use of ssh.InsecureIgnoreHostKey - - G107 # Url provided to HTTP request as taint input - - G108 # Profiling endpoint automatically exposed on /debug/pprof - - G109 # Potential Integer overflow made by strconv.Atoi result conversion to int16/32 - - G110 # Potential DoS vulnerability via decompression bomb - - G111 # Potential directory traversal - - G112 # Potential slowloris attack - - G113 # Usage of Rat.SetString in math/big with an overflow (CVE-2022-23772) - - G114 # Use of net/http serve function that has no support for setting timeouts - - G201 # SQL query construction using format string - - G202 # SQL query construction using string concatenation - - G203 # Use of unescaped data in HTML templates - - G204 # Audit use of command execution - - G301 # Poor file permissions used when creating a directory - - G302 # Poor file permissions used with chmod - - G303 # Creating tempfile using a predictable path - - G304 # File path provided as taint input - - G305 # File traversal when extracting zip/tar archive - - G306 # Poor file permissions used when writing to a new file - - G307 # Deferring a method which returns an error - - G401 # Detect the usage of DES, RC4, MD5 or SHA1 - - G402 # Look for bad TLS connection settings - - G403 # Ensure minimum RSA key length of 2048 bits - - G404 # Insecure random number source (rand) - - G501 # Import blocklist: crypto/md5 - - G502 # Import blocklist: crypto/des - - G503 # Import blocklist: crypto/rc4 - - G504 # Import blocklist: net/http/cgi - - G505 # Import blocklist: crypto/sha1 - - G601 # Implicit memory aliasing of items from a range statement - - # Exclude generated files - # Default: false - exclude-generated: true - - # Filter out the issues with a lower severity than the given value. - # Valid options are: low, medium, high. - # Default: low - severity: medium - - # Filter out the issues with a lower confidence than the given value. - # Valid options are: low, medium, high. - # Default: low - confidence: medium - - # Concurrency value. - # Default: the number of logical CPUs usable by the current process. - concurrency: 12 - - # To specify the configuration of rules. - config: - # Globals are applicable to all rules. - global: - # If true, ignore #nosec in comments (and an alternative as well). - # Default: false - nosec: true - # Add an alternative comment prefix to #nosec (both will work at the same time). - # Default: "" - "#nosec": "#my-custom-nosec" - # Define whether nosec issues are counted as finding or not. - # Default: false - show-ignored: true - # Audit mode enables addition checks that for normal code analysis might be too nosy. - # Default: false - audit: true - G101: - # Regexp pattern for variables and constants to find. - # Default: "(?i)passwd|pass|password|pwd|secret|token|pw|apiKey|bearer|cred" - pattern: "(?i)example" - # If true, complain about all cases (even with low entropy). - # Default: false - ignore_entropy: false - # Maximum allowed entropy of the string. - # Default: "80.0" - entropy_threshold: "80.0" - # Maximum allowed value of entropy/string length. - # Is taken into account if entropy >= entropy_threshold/2. - # Default: "3.0" - per_char_threshold: "3.0" - # Calculate entropy for first N chars of the string. - # Default: "16" - truncate: "32" - # Additional functions to ignore while checking unhandled errors. - # Following functions always ignored: - # bytes.Buffer: - # - Write - # - WriteByte - # - WriteRune - # - WriteString - # fmt: - # - Print - # - Printf - # - Println - # - Fprint - # - Fprintf - # - Fprintln - # strings.Builder: - # - Write - # - WriteByte - # - WriteRune - # - WriteString - # io.PipeWriter: - # - CloseWithError - # hash.Hash: - # - Write - # os: - # - Unsetenv - # Default: {} - G104: - fmt: - - Fscanf - G111: - # Regexp pattern to find potential directory traversal. - # Default: "http\\.Dir\\(\"\\/\"\\)|http\\.Dir\\('\\/'\\)" - pattern: "custom\\.Dir\\(\\)" - # Maximum allowed permissions mode for os.Mkdir and os.MkdirAll - # Default: "0750" - G301: "0750" - # Maximum allowed permissions mode for os.OpenFile and os.Chmod - # Default: "0600" - G302: "0600" - # Maximum allowed permissions mode for os.WriteFile and ioutil.WriteFile - # Default: "0600" - G306: "0600" - govet: - # Report about shadowed variables. - # Default: false + # report about shadowed variables check-shadowing: true - # Settings per analyzer. + + # settings per analyzer settings: - # Analyzer name, run `go tool vet help` to see all analyzers. - printf: - # Comma-separated list of print function names to check (in addition to default, see `go tool vet help printf`). - # Default: [] - funcs: + printf: # analyzer name, run `go tool vet help` to see all analyzers + funcs: # run `go tool vet help printf` to see available settings for `printf` analyzer - (github.com/golangci/golangci-lint/pkg/logutils.Log).Infof - (github.com/golangci/golangci-lint/pkg/logutils.Log).Warnf - (github.com/golangci/golangci-lint/pkg/logutils.Log).Errorf - (github.com/golangci/golangci-lint/pkg/logutils.Log).Fatalf - shadow: - # Whether to be strict about shadowing; can be noisy. - # Default: false - strict: true - unusedresult: - # Comma-separated list of functions whose results must be used - # (in addition to defaults context.WithCancel,context.WithDeadline,context.WithTimeout,context.WithValue, - # errors.New,fmt.Errorf,fmt.Sprint,fmt.Sprintf,sort.Reverse) - # Default [] - funcs: - - pkg.MyFunc - # Comma-separated list of names of methods of type func() string whose results must be used - # (in addition to default Error,String) - # Default [] - stringmethods: - - MyMethod - - # Enable all analyzers. - # Default: false - enable-all: true - - grouper: - # Require the use of a single global 'const' declaration only. - # Default: false - const-require-single-const: true - # Require the use of grouped global 'const' declarations. - # Default: false - const-require-grouping: true - # Require the use of a single 'import' declaration only. - # Default: false - import-require-single-import: true - # Require the use of grouped 'import' declarations. - # Default: false - import-require-grouping: true - - # Require the use of a single global 'type' declaration only. - # Default: false - type-require-single-type: true - # Require the use of grouped global 'type' declarations. - # Default: false - type-require-grouping: true - - # Require the use of a single global 'var' declaration only. - # Default: false - var-require-single-var: true - # Require the use of grouped global 'var' declarations. - # Default: false - var-require-grouping: true - - importas: - # Do not allow unaliased imports of aliased packages. - # Default: false - no-unaliased: true - # Do not allow non-required aliases. - # Default: false - no-extra-aliases: true - # List of aliases - # Default: [] - alias: - # Using `servingv1` alias for `knative.dev/serving/pkg/apis/serving/v1` package. - - pkg: knative.dev/serving/pkg/apis/serving/v1 - alias: servingv1 - # Using `autoscalingv1alpha1` alias for `knative.dev/serving/pkg/apis/autoscaling/v1alpha1` package. - - pkg: knative.dev/serving/pkg/apis/autoscaling/v1alpha1 - alias: autoscalingv1alpha1 - # You can specify the package path by regular expression, - # and alias by regular expression expansion syntax like below. - # see https://github.com/julz/importas#use-regular-expression for details - - pkg: knative.dev/serving/pkg/apis/(\w+)/(v[\w\d]+) - alias: $1$2 - - interfacebloat: - # The maximum number of methods allowed for an interface. - # Default: 10 - max: 5 - - ireturn: - # ireturn allows using `allow` and `reject` settings at the same time. - # Both settings are lists of the keywords and regular expressions matched to interface or package names. - # keywords: - # - `empty` for `interface{}` - # - `error` for errors - # - `stdlib` for standard library - # - `anon` for anonymous interfaces - - # By default, it allows using errors, empty interfaces, anonymous interfaces, - # and interfaces provided by the standard library. - allow: - - anon - - error - - empty - - stdlib - # You can specify idiomatic endings for interface - - (or|er)$ - - # reject-list of interfaces - reject: - - github.com\/user\/package\/v4\.Type - - lll: - # Max line length, lines longer will be reported. - # '\t' is counted as 1 character by default, and can be changed with the tab-width option. - # Default: 120. - line-length: 120 - # Tab width in spaces. - # Default: 1 - tab-width: 1 - - # loggercheck: - # # Allow check for the github.com/go-kit/log library. - # # Default: true - # kitlog: false - # # Allow check for the k8s.io/klog/v2 library. - # # Default: true - # klog: false - # # Allow check for the github.com/go-logr/logr library. - # # Default: true - # logr: false - # # Allow check for the "sugar logger" from go.uber.org/zap library. - # # Default: true - # zap: false - # # Require all logging keys to be inlined constant strings. - # # Default: false - # require-string-key: true - # # Require printf-like format specifier (%s, %d for example) not present. - # # Default: false - # no-printf-like: true - # # List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers. - # # For example: https://github.com/timonwong/loggercheck/blob/7395ab86595781e33f7afba27ad7b55e6956ebcd/testdata/custom-rules.txt - # # Default: empty - # rules: - # - k8s.io/klog/v2.InfoS # package level exported functions - # - (github.com/go-logr/logr.Logger).Error # "Methods" - # - (*go.uber.org/zap.SugaredLogger).With # Also "Methods", but with a pointer receiver - - maintidx: - # Show functions with maintainability index lower than N. - # A high index indicates better maintainability (it's kind of the opposite of complexity). - # Default: 20 - under: 100 - - makezero: - # Allow only slices initialized with a length of zero. - # Default: false - always: true - - misspell: - # Correct spellings using locale preferences for US or UK. - # Setting locale to US will correct the British spelling of 'colour' to 'color'. - # Default is to use a neutral variety of English. - locale: US - # Default: [] - ignore-words: - - someword - - nakedret: - # Make an issue if func has more lines of code than this setting, and it has naked returns. - # Default: 30 - max-func-lines: 31 - - nestif: - # Minimal complexity of if statements to report. - # Default: 5 - min-complexity: 4 - - nilnil: - # Checks that there is no simultaneous return of `nil` error and an invalid value. - # Default: ["ptr", "func", "iface", "map", "chan"] - checked-types: - - ptr - - func - - iface - - map - - chan - - nlreturn: - # Size of the block (including return statement that is still "OK") - # so no return split required. - # Default: 1 - block-size: 2 - - nolintlint: - # Disable to ensure that all nolint directives actually have an effect. - # Default: false - allow-unused: true - # Exclude following linters from requiring an explanation. - # Default: [] - allow-no-explanation: [ ] - # Enable to require an explanation of nonzero length after each nolint directive. - # Default: false - require-explanation: true - # Enable to require nolint directives to mention the specific linter being suppressed. - # Default: false - require-specific: true - - nonamedreturns: - # Report named error if it is assigned inside defer. - # Default: false - report-error-in-defer: true - - paralleltest: - # Ignore missing calls to `t.Parallel()` and only report incorrect uses of it. - # Default: false - ignore-missing: true - - prealloc: - # IMPORTANT: we don't recommend using this linter before doing performance profiling. - # For most programs usage of prealloc will be a premature optimization. - - # Report pre-allocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them. - # Default: true - simple: false - # Report pre-allocation suggestions on range loops. - # Default: true - range-loops: false - # Report pre-allocation suggestions on for loops. - # Default: false - for-loops: true - - predeclared: - # Comma-separated list of predeclared identifiers to not report on. - # Default: "" - ignore: "new,int" - # Include method names and field names (i.e., qualified names) in checks. - # Default: false - q: true - - promlinter: - # Promlinter cannot infer all metrics name in static analysis. - # Enable strict mode will also include the errors caused by failing to parse the args. - # Default: false - strict: true - # Please refer to https://github.com/yeya24/promlinter#usage for detailed usage. - # Default: [] - disabled-linters: - - Help - - MetricUnits - - Counter - - HistogramSummaryReserved - - MetricTypeInName - - ReservedChars - - CamelCase - - UnitAbbreviations - - reassign: - # Patterns for global variable names that are checked for reassignment. - # See https://github.com/curioswitch/go-reassign#usage - # Default: ["EOF", "Err.*"] - patterns: - - ".*" - - revive: - # Maximum number of open files at the same time. - # See https://github.com/mgechev/revive#command-line-flags - # Defaults to unlimited. - max-open-files: 2048 - - # When set to false, ignores files with "GENERATED" header, similar to golint. - # See https://github.com/mgechev/revive#available-rules for details. - # Default: false - ignore-generated-header: true - - # Sets the default severity. - # See https://github.com/mgechev/revive#configuration - # Default: warning - severity: error - - # Enable all available rules. - # Default: false - enable-all-rules: true - - # Sets the default failure confidence. - # This means that linting errors with less than 0.8 confidence will be ignored. - # Default: 0.8 - confidence: 0.1 - - rules: - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#add-constant - - name: add-constant - severity: warning - disabled: false - arguments: - - maxLitCount: "3" - allowStrs: '""' - allowInts: "0,1,2" - allowFloats: "0.0,0.,1.0,1.,2.0,2." - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#argument-limit - - name: argument-limit - severity: warning - disabled: false - arguments: [ 4 ] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#atomic - - name: atomic - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#banned-characters - - name: banned-characters - severity: warning - disabled: false - arguments: [ "Ω","Σ","σ", "7" ] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#bare-return - - name: bare-return - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#blank-imports - - name: blank-imports - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#bool-literal-in-expr - - name: bool-literal-in-expr - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#call-to-gc - - name: call-to-gc - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#cognitive-complexity - - name: cognitive-complexity - severity: warning - disabled: false - arguments: [ 7 ] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#confusing-naming - - name: confusing-naming - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#confusing-results - - name: confusing-results - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#constant-logical-expr - - name: constant-logical-expr - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#context-as-argument - - name: context-as-argument - severity: warning - disabled: false - arguments: [] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#context-keys-type - - name: context-keys-type - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#cyclomatic - - name: cyclomatic - severity: warning - disabled: false - arguments: [ 3 ] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#datarace - - name: datarace - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#deep-exit - - name: deep-exit - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#defer - - name: defer - severity: warning - disabled: false - arguments: - - [ "call-chain", "loop" ] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#dot-imports - - name: dot-imports - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#duplicated-imports - - name: duplicated-imports - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#early-return - - name: early-return - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#empty-block - - name: empty-block - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#empty-lines - - name: empty-lines - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#error-naming - - name: error-naming - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#error-return - - name: error-return - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#error-strings - - name: error-strings - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#errorf - - name: errorf - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#exported - - name: exported - severity: warning - disabled: false - arguments: - - "checkPrivateReceivers" - - "sayRepetitiveInsteadOfStutters" - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#file-header - - name: file-header - severity: warning - disabled: false - arguments: - - This is the text that must appear at the top of source files. - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#flag-parameter - - name: flag-parameter - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#function-result-limit - - name: function-result-limit - severity: warning - disabled: false - arguments: [ 2 ] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#function-length - - name: function-length - severity: warning - disabled: false - arguments: [ 10, 0 ] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#get-return - - name: get-return - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#identical-branches - - name: identical-branches - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#if-return - - name: if-return - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#increment-decrement - - name: increment-decrement - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#indent-error-flow - - name: indent-error-flow - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#imports-blacklist - - name: imports-blacklist - severity: warning - disabled: false - arguments: - - "crypto/md5" - - "crypto/sha1" - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#import-shadowing - - name: import-shadowing - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#line-length-limit - - name: line-length-limit - severity: warning - disabled: false - arguments: [ 80 ] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#max-public-structs - - name: max-public-structs - severity: warning - disabled: false - arguments: [ 3 ] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#modifies-parameter - - name: modifies-parameter - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#modifies-value-receiver - - name: modifies-value-receiver - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#nested-structs - - name: nested-structs - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#optimize-operands-order - - name: optimize-operands-order - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#package-comments - - name: package-comments - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#range - - name: range - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#range-val-in-closure - - name: range-val-in-closure - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#range-val-address - - name: range-val-address - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#receiver-naming - - name: receiver-naming - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#redefines-builtin-id - - name: redefines-builtin-id - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#string-of-int - - name: string-of-int - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#string-format - - name: string-format - severity: warning - disabled: false - arguments: - - - 'core.WriteError[1].Message' - - '/^([^A-Z]|$)/' - - must not start with a capital letter - - - 'fmt.Errorf[0]' - - '/(^|[^\.!?])$/' - - must not end in punctuation - - - panic - - '/^[^\n]*$/' - - must not contain line breaks - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#struct-tag - - name: struct-tag - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#superfluous-else - - name: superfluous-else - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#time-equal - - name: time-equal - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#time-naming - - name: time-naming - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#var-naming - - name: var-naming - severity: warning - disabled: false - arguments: - - [ "ID" ] # AllowList - - [ "VM" ] # DenyList - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#var-declaration - - name: var-declaration - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unconditional-recursion - - name: unconditional-recursion - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unexported-naming - - name: unexported-naming - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unexported-return - - name: unexported-return - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unhandled-error - - name: unhandled-error - severity: warning - disabled: false - arguments: - - "fmt.Printf" - - "myFunction" - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unnecessary-stmt - - name: unnecessary-stmt - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unreachable-code - - name: unreachable-code - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unused-parameter - - name: unused-parameter - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unused-receiver - - name: unused-receiver - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#useless-break - - name: useless-break - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#waitgroup-by-value - - name: waitgroup-by-value - severity: warning - disabled: false - - rowserrcheck: - # database/sql is always checked - # Default: [] - packages: - - github.com/jmoiron/sqlx - - staticcheck: - # SAxxxx checks in https://staticcheck.io/docs/configuration/options/#checks - # Default: ["*"] - checks: [ "all" ] - - stylecheck: - # STxxxx checks in https://staticcheck.io/docs/configuration/options/#checks - # Default: ["*"] - checks: [ "all", "-ST1000", "-ST1003", "-ST1016", "-ST1020", "-ST1021", "-ST1022" ] - # https://staticcheck.io/docs/configuration/options/#dot_import_whitelist - # Default: ["github.com/mmcloughlin/avo/build", "github.com/mmcloughlin/avo/operand", "github.com/mmcloughlin/avo/reg"] - dot-import-whitelist: - - fmt - # https://staticcheck.io/docs/configuration/options/#initialisms - # Default: ["ACL", "API", "ASCII", "CPU", "CSS", "DNS", "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID", "IP", "JSON", "QPS", "RAM", "RPC", "SLA", "SMTP", "SQL", "SSH", "TCP", "TLS", "TTL", "UDP", "UI", "GID", "UID", "UUID", "URI", "URL", "UTF8", "VM", "XML", "XMPP", "XSRF", "XSS", "SIP", "RTP", "AMQP", "DB", "TS"] - initialisms: [ "ACL", "API", "ASCII", "CPU", "CSS", "DNS", "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID", "IP", "JSON", "QPS", "RAM", "RPC", "SLA", "SMTP", "SQL", "SSH", "TCP", "TLS", "TTL", "UDP", "UI", "GID", "UID", "UUID", "URI", "URL", "UTF8", "VM", "XML", "XMPP", "XSRF", "XSS", "SIP", "RTP", "AMQP", "DB", "TS" ] - # https://staticcheck.io/docs/configuration/options/#http_status_code_whitelist - # Default: ["200", "400", "404", "500"] - http-status-code-whitelist: [ "200", "400", "404", "500" ] - - tagliatelle: - # Check the struck tag name case. - case: - # Use the struct field name to check the name of the struct tag. - # Default: false - use-field-name: true - # `camel` is used for `json` and `yaml` (can be overridden) - # Default: {} - rules: - # Any struct tag type can be used. - # Support string case: `camel`, `pascal`, `kebab`, `snake`, `goCamel`, `goPascal`, `goKebab`, `goSnake`, `upper`, `lower` - json: camel - yaml: camel - xml: camel - bson: camel - avro: snake - mapstructure: kebab - - tenv: - # The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures. - # Otherwise, only methods that take `*testing.T`, `*testing.B`, and `testing.TB` as arguments are checked. - # Default: false - all: false - - testpackage: - # Regexp pattern to skip files. - # Default: "(export|internal)_test\\.go" - skip-regexp: (export|internal)_test\.go - # List of packages that don't end with _test that tests are allowed to be in. - # Default: "main" - allow-packages: - - example - - main - - usestdlibvars: - # Suggest the use of http.MethodXX. - # Default: true - http-method: false - # Suggest the use of http.StatusXX. - # Default: true - http-status-code: false - # Suggest the use of time.Weekday.String(). - # Default: true - time-weekday: true - # Suggest the use of time.Month.String(). - # Default: false - time-month: true - # Suggest the use of time.Layout. - # Default: false - time-layout: true - # Suggest the use of crypto.Hash.String(). - # Default: false - crypto-hash: true - # Suggest the use of rpc.DefaultXXPath. - # Default: false - default-rpc-path: true - # Suggest the use of os.DevNull. - # Default: false - os-dev-null: true - # Suggest the use of sql.LevelXX.String(). - # Default: false - sql-isolation-level: true - # Suggest the use of tls.SignatureScheme.String(). - # Default: false - tls-signature-scheme: true - # Suggest the use of constant.Kind.String(). - # Default: false - constant-kind: true - - unparam: - # Inspect exported functions. - # - # Set to true if no external program/library imports your code. - # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors: - # if it's called for subdir of a project it can't find external interfaces. All text editor integrations - # with golangci-lint call it on a directory with the changed file. - # - # Default: false - check-exported: true - - varnamelen: - # The longest distance, in source lines, that is being considered a "small scope". - # Variables used in at most this many lines will be ignored. - # Default: 5 - max-distance: 6 - # The minimum length of a variable's name that is considered "long". - # Variable names that are at least this long will be ignored. - # Default: 3 - min-name-length: 2 - # Check method receivers. - # Default: false - check-receiver: true - # Check named return values. - # Default: false - check-return: true - # Check type parameters. - # Default: false - check-type-param: true - # Ignore "ok" variables that hold the bool return value of a type assertion. - # Default: false - ignore-type-assert-ok: true - # Ignore "ok" variables that hold the bool return value of a map index. - # Default: false - ignore-map-index-ok: true - # Ignore "ok" variables that hold the bool return value of a channel receive. - # Default: false - ignore-chan-recv-ok: true - # Optional list of variable names that should be ignored completely. - # Default: [] - ignore-names: - - err - # Optional list of variable declarations that should be ignored completely. - # Entries must be in one of the following forms (see below for examples): - # - for variables, parameters, named return values, method receivers, or type parameters: - # ( can also be a pointer/slice/map/chan/...) - # - for constants: const - # - # Default: [] - ignore-decls: - - c echo.Context - - t testing.T - - f *foo.Bar - - e error - - i int - - const C - - T any - - m map[string]int - - whitespace: - # Enforces newlines (or comments) after every multi-line if statement. - # Default: false - multi-if: true - # Enforces newlines (or comments) after every multi-line function signature. - # Default: false - multi-func: true - - wrapcheck: - # An array of strings that specify substrings of signatures to ignore. - # If this set, it will override the default set of ignored signatures. - # See https://github.com/tomarrell/wrapcheck#configuration for more information. - # Default: [".Errorf(", "errors.New(", "errors.Unwrap(", ".Wrap(", ".Wrapf(", ".WithMessage(", ".WithMessagef(", ".WithStack("] - ignoreSigs: - - .Errorf( - - errors.New( - - errors.Unwrap( - - .Wrap( - - .Wrapf( - - .WithMessage( - - .WithMessagef( - - .WithStack( - # An array of strings that specify regular expressions of signatures to ignore. - # Default: [] - ignoreSigRegexps: - - \.New.*Error\( - # An array of strings that specify globs of packages to ignore. - # Default: [] - ignorePackageGlobs: - - encoding/* - - github.com/pkg/* - # An array of strings that specify regular expressions of interfaces to ignore. - # Default: [] - ignoreInterfaceRegexps: - - ^(?i)c(?-i)ach(ing|e) - - wsl: - # See https://github.com/bombsimon/wsl/blob/master/doc/configuration.md for documentation of available settings. - # These are the defaults for `golangci-lint`. - - # Do strict checking when assigning from append (x = append(x, y)). If - # this is set to true - the append call must append either a variable - # assigned, called or used on the line above. - strict-append: true - - # Allows assignments to be cuddled with variables used in calls on - # line above and calls to be cuddled with assignments of variables - # used in call on line above. - allow-assign-and-call: true - - # Allows assignments to be cuddled with anything. - allow-assign-and-anything: false - - # Allows cuddling to assignments even if they span over multiple lines. - allow-multiline-assign: true - - # If the number of lines in a case block is equal to or lager than this - # number, the case *must* end white a newline. - force-case-trailing-whitespace: 0 - - # Allow blocks to end with comments. - allow-trailing-comment: false - - # Allow multiple comments in the beginning of a block separated with newline. - allow-separated-leading-comment: false - - # Allow multiple var/declaration statements to be cuddled. - allow-cuddle-declarations: false - - # A list of call idents that everything can be cuddled with. - # Defaults to calls looking like locks. - allow-cuddle-with-calls: [ "Lock", "RLock" ] - - # AllowCuddleWithRHS is a list of right hand side variables that is allowed - # to be cuddled with anything. Defaults to assignments or calls looking - # like unlocks. - allow-cuddle-with-rhs: [ "Unlock", "RUnlock" ] - - # Causes an error when an If statement that checks an error variable doesn't - # cuddle with the assignment of that variable. - enforce-err-cuddling: false - - # When enforce-err-cuddling is enabled this is a list of names - # used for error variables to check for in the conditional. - error-variable-names: [ "err" ] - - # Causes an error if a short declaration (:=) cuddles with anything other than - # another short declaration. - # This logic overrides enforce-err-cuddling among others. - force-short-decl-cuddling: false - -linters: - # Enable specific linter - # https://golangci-lint.run/usage/linters/#enabled-by-default - enable: - - asasalint - - asciicheck - - bidichk - - bodyclose - - containedctx - - contextcheck - - cyclop - - decorder - - depguard - - dogsled - - dupl - - durationcheck - - errcheck - - errchkjson - - errname - - errorlint - - execinquery - - exhaustive - - exhaustruct - - exportloopref - - forbidigo - - forcetypeassert - - funlen - - gci - - gochecknoglobals - - gochecknoinits - - gocognit - - goconst - - gocritic - - gocyclo - - godot - - godox - - goerr113 - - gofmt - - gofumpt - - goheader - - goimports - - gomnd - - gomoddirectives - - gomodguard - - goprintffuncname - - gosec - - gosimple - - govet - - grouper - - importas - - ineffassign - - interfacebloat - - ireturn - - lll - - maintidx - - makezero - - misspell - - nakedret - - nestif - - nilerr - - nilnil - - nlreturn - - noctx - - nolintlint - - nonamedreturns - - nosprintfhostport - - prealloc - - predeclared - - promlinter - - reassign - - revive - - staticcheck - - stylecheck - - tagliatelle - - tenv - - testpackage - - thelper - - tparallel - - typecheck - - unconvert - - unparam - - unused - - usestdlibvars - - varnamelen - - whitespace - - wrapcheck - - wsl - - # Enable presets. - # https://golangci-lint.run/usage/linters - presets: - - bugs - - comment - - complexity - - error - - format - - import - - metalinter - - module - - performance - - sql - - style - - test - - unused - - # Run only fast linters from enabled linters set (first run won't be fast) - # Default: false - fast: true - - -# issues: -# # List of regexps of issue texts to exclude. -# # -# # But independently of this option we use default exclude patterns, -# # it can be disabled by `exclude-use-default: false`. -# # To list all excluded by default patterns execute `golangci-lint run --help` -# # -# # Default: https://golangci-lint.run/usage/false-positives/#default-exclusions -# exclude: -# - abcdef - -# # Excluding configuration per-path, per-linter, per-text and per-source -# exclude-rules: -# # Exclude some linters from running on tests files. -# - path: _test\.go -# linters: -# - gocyclo -# - errcheck -# - dupl -# - gosec - -# # Exclude known linters from partially hard-vendored code, -# # which is impossible to exclude via `nolint` comments. -# # `/` will be replaced by current OS file path separator to properly work on Windows. -# - path: internal/hmac/ -# text: "weak cryptographic primitive" -# linters: -# - gosec - -# # Exclude some `staticcheck` messages. -# - linters: -# - staticcheck -# text: "SA9003:" - -# # Exclude `lll` issues for long lines with `go:generate`. -# - linters: -# - lll -# source: "^//go:generate " - -# # Independently of option `exclude` we use default exclude patterns, -# # it can be disabled by this option. -# # To list all excluded by default patterns execute `golangci-lint run --help`. -# # Default: true. -# exclude-use-default: false - -# # If set to true exclude and exclude-rules regular expressions become case-sensitive. -# # Default: false -# exclude-case-sensitive: false - -# # The list of ids of default excludes to include or disable. -# # https://golangci-lint.run/usage/false-positives/#default-exclusions -# # Default: [] -# include: -# - EXC0001 -# - EXC0002 -# - EXC0003 -# - EXC0004 -# - EXC0005 -# - EXC0006 -# - EXC0007 -# - EXC0008 -# - EXC0009 -# - EXC0010 -# - EXC0011 -# - EXC0012 -# - EXC0013 -# - EXC0014 -# - EXC0015 - -# # Maximum issues count per one linter. -# # Set to 0 to disable. -# # Default: 50 -# max-issues-per-linter: 0 - -# # Maximum count of issues with the same text. -# # Set to 0 to disable. -# # Default: 3 -# max-same-issues: 0 - -# # Show only new issues: if there are unstaged changes or untracked files, -# # only those changes are analyzed, else only changes in HEAD~ are analyzed. -# # It's a super-useful option for integration of golangci-lint into existing large codebase. -# # It's not practical to fix all existing issues at the moment of integration: -# # much better don't allow issues in new code. -# # -# # Default: false. -# new: true - -# # Show only new issues created after git revision `REV`. -# new-from-rev: HEAD - -# # Show only new issues created in git patch with set file path. -# new-from-patch: path/to/patch/file - -# # Fix found issues (if it's supported by the linter). -# fix: true - - -# severity: - # Set the default severity for issues. - # - # If severity rules are defined and the issues do not match or no severity is provided to the rule - # this will be the default severity applied. - # Severities should match the supported severity names of the selected out format. - # - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity - # - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#SeverityLevel - # - GitHub: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message - # - # Default value is an empty string. - default-severity: error - - # If set to true `severity-rules` regular expressions become case-sensitive. - # Default: false - case-sensitive: true - - # When a list of severity rules are provided, severity information will be added to lint issues. - # Severity rules have the same filtering capability as exclude rules - # except you are allowed to specify one matcher per severity rule. - # Only affects out formats that support setting severity information. - # - # Default: [] - rules: - - linters: - - dupl - severity: info \ No newline at end of file + # enable or disable analyzers by name + # run `go tool vet help` to see all analyzers + enable: + - atomicalign + enable-all: false + disable: + - shadow + disable-all: false + + +issues: + exclude-use-default: false + max-issues-per-linter: 0 + max-same-issues: 0 + exclude: + - 'declaration of "(err|ctx)" shadows declaration at' + - 'Error return value of .(.*\.Help|.*\.MarkFlagRequired|(os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*printf?|os\.(Un)?Setenv). is not checked' diff --git a/api.go b/api.go index 9150cb14a..28bbf76f4 100644 --- a/api.go +++ b/api.go @@ -26,8 +26,8 @@ import ( "github.com/featurebasedb/featurebase/v3/dax" "github.com/featurebasedb/featurebase/v3/dax/computer" "github.com/featurebasedb/featurebase/v3/dax/storage" - "github.com/featurebasedb/featurebase/v3/logger" "github.com/featurebasedb/featurebase/v3/disco" + "github.com/featurebasedb/featurebase/v3/logger" "github.com/featurebasedb/featurebase/v3/rbf" "github.com/prometheus/client_golang/prometheus" diff --git a/apply.go b/apply.go index 127bbe8f6..dbde085fc 100644 --- a/apply.go +++ b/apply.go @@ -14,10 +14,10 @@ import ( "github.com/apache/arrow/go/v10/arrow" "github.com/apache/arrow/go/v10/arrow/array" "github.com/apache/arrow/go/v10/arrow/memory" - "github.com/gomem/gomem/pkg/dataframe" "github.com/featurebasedb/featurebase/v3/pql" "github.com/featurebasedb/featurebase/v3/tracing" "github.com/featurebasedb/featurebase/v3/vprint" + "github.com/gomem/gomem/pkg/dataframe" "github.com/pkg/errors" ivy "robpike.io/ivy/arrow" @@ -95,7 +95,7 @@ func IvyReduce(reduceCode string, opCode string, opt *ExecOptions) (func(ctx con col := value.ToArrowColumn(accumulator, pool) return dataframe.NewDataFrameFromColumns(pool, []arrow.Column{*col}) } - // only acutally reduce on the initiating node i hate the network + // only actually reduce on the initiating node i hate the network // over head but oh well ctxIvy.AssignGlobal("_", accumulator) ok, err := runIvyString(ctxIvy, reduceCode) @@ -541,7 +541,7 @@ func (sf *ShardFile) Save(name string) error { if sf.table != nil { // we append if there was existing file column := sf.table.Column(col) - // if primative type + // if primitive type switch column.DataType() { case arrow.BinaryTypes.String: chunks = sf.buildFromStrings(col, mem) diff --git a/arrow.go b/arrow.go index dac7dca36..3ddaa4178 100644 --- a/arrow.go +++ b/arrow.go @@ -17,9 +17,9 @@ import ( "github.com/apache/arrow/go/v10/parquet" "github.com/apache/arrow/go/v10/parquet/file" "github.com/apache/arrow/go/v10/parquet/pqarrow" - "github.com/gomem/gomem/pkg/dataframe" "github.com/featurebasedb/featurebase/v3/pql" "github.com/featurebasedb/featurebase/v3/tracing" + "github.com/gomem/gomem/pkg/dataframe" "github.com/pkg/errors" ) diff --git a/client/client.go b/client/client.go index 954cde9d7..01b25d317 100644 --- a/client/client.go +++ b/client/client.go @@ -20,7 +20,6 @@ import ( "sync" "time" - "github.com/golang/protobuf/proto" //nolint:staticcheck pilosa "github.com/featurebasedb/featurebase/v3" "github.com/featurebasedb/featurebase/v3/client/types" fbproto "github.com/featurebasedb/featurebase/v3/encoding/proto" // TODO use this everywhere and get rid of proto import @@ -30,6 +29,7 @@ import ( "github.com/featurebasedb/featurebase/v3/pql" "github.com/featurebasedb/featurebase/v3/roaring" "github.com/featurebasedb/featurebase/v3/vprint" + "github.com/golang/protobuf/proto" //nolint:staticcheck "github.com/opentracing/opentracing-go" "github.com/pkg/errors" "golang.org/x/sync/errgroup" diff --git a/cmd/pre_sort.go b/cmd/pre_sort.go new file mode 100644 index 000000000..ae834837a --- /dev/null +++ b/cmd/pre_sort.go @@ -0,0 +1,29 @@ +// Copyright 2021 Molecula Corp. All rights reserved. +package cmd + +import ( + "github.com/featurebasedb/featurebase/v3/ctl" + "github.com/featurebasedb/featurebase/v3/logger" + "github.com/spf13/cobra" +) + +func newPreSortCommand(logdest logger.Logger) *cobra.Command { + cmd := ctl.NewPreSortCommand(logdest) + ccmd := &cobra.Command{ + Use: "pre_sort", + Short: "Sort records within files into files by FB partition for more efficient ingest", + Long: ` +Takes all input files and writes PartitionN numbered files to a directory, where each file contains only records that will go into the partition it is named for. +`, + RunE: usageErrorWrapper(cmd), + } + + flags := ccmd.Flags() + flags.StringVarP(&cmd.File, "file", "", "", "Input file or directory.") + flags.StringVarP(&cmd.Table, "table", "", "", "Name of table (used to hash keys to determine partition).") + flags.StringVarP(&cmd.Type, "type", "", cmd.Type, "Input file type (csv or ndjson).") + flags.StringSliceVar(&cmd.PrimaryKeyFields, "primary-key-fields", []string{}, "Names of primary key fields. For CSV there must be a header row and these pulled from there.") + flags.IntVar(&cmd.PartitionN, "partition-n", cmd.PartitionN, "Number of partitions.") + flags.StringVarP(&cmd.OutputDir, "output-dir", "", cmd.OutputDir, "Directory name to write output to.") + return ccmd +} diff --git a/cmd/root.go b/cmd/root.go index 58528ea39..c29f50f05 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -107,6 +107,7 @@ at https://docs.featurebase.com/. rc.AddCommand(newCLICommand(logdest)) rc.AddCommand(newDAXCommand(stderr)) rc.AddCommand(newDataframeCsvLoaderCommand(logdest)) + rc.AddCommand(newPreSortCommand(logdest)) rc.SetOutput(stderr) return rc diff --git a/cmd/server.go b/cmd/server.go index 3b0d6503c..3a78ff16c 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -8,7 +8,6 @@ import ( "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/opentracer" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "github.com/featurebasedb/featurebase/v3/ctl" "github.com/featurebasedb/featurebase/v3/server" "github.com/featurebasedb/featurebase/v3/tracing" diff --git a/cmd/server_test.go b/cmd/server_test.go index 07f2ef0e3..3947e2f59 100644 --- a/cmd/server_test.go +++ b/cmd/server_test.go @@ -9,11 +9,11 @@ import ( "testing" "time" - "github.com/felixge/fgprof" "github.com/featurebasedb/featurebase/v3/cmd" _ "github.com/featurebasedb/featurebase/v3/test" "github.com/featurebasedb/featurebase/v3/testhook" "github.com/featurebasedb/featurebase/v3/toml" + "github.com/felixge/fgprof" "github.com/pkg/errors" ) diff --git a/ctl/keygen.go b/ctl/keygen.go index 3e5b6e824..d77581c34 100644 --- a/ctl/keygen.go +++ b/ctl/keygen.go @@ -8,8 +8,8 @@ import ( "io" "os" - "github.com/gorilla/securecookie" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/gorilla/securecookie" ) // Keygen represents a command for generating a cryptographic key. diff --git a/ctl/pre_sort.go b/ctl/pre_sort.go new file mode 100644 index 000000000..164bde1b2 --- /dev/null +++ b/ctl/pre_sort.go @@ -0,0 +1,245 @@ +package ctl + +import ( + "context" + "encoding/csv" + "encoding/json" + "fmt" + "hash/fnv" + "io" + "io/fs" + "os" + "path/filepath" + + "github.com/featurebasedb/featurebase/v3/logger" + "github.com/pkg/errors" +) + +type PreSortCommand struct { + // Optional Index filter + File string `json:"file"` + + Type string `json:"type"` + + Table string `json:"table"` + + PrimaryKeyFields []string `json:"primary-key-fields"` + + PartitionN int `json:"partition-n"` + + // Path to write sorted files to + OutputDir string + + // Standard input/output + logDest logger.Logger + + outputFiles map[int]*os.File +} + +// NewPreSortCommand returns a new instance of PreSortCommand. +func NewPreSortCommand(logdest logger.Logger) *PreSortCommand { + return &PreSortCommand{ + logDest: logdest, + Type: "ndjson", + OutputDir: "presorted_files", + PartitionN: 256, + outputFiles: make(map[int]*os.File), + } +} + +// Run executes the main program execution. +func (cmd *PreSortCommand) Run(ctx context.Context) error { + if cmd.File == "" { + return errors.New("must set a file or directory to read from") + } + if len(cmd.PrimaryKeyFields) == 0 { + return errors.New("must define primary-key-fields") + } + if cmd.Table == "" { + return errors.New("must set a table name") + } + filelist := []string{} + walkfunc := func(path string, d fs.DirEntry, err error) error { + if !d.IsDir() { + filelist = append(filelist, path) + } + return nil + } + err := filepath.WalkDir(cmd.File, walkfunc) + if err != nil { + return errors.Wrapf(err, "wakling %s", cmd.File) + } + if len(filelist) > 3 { + cmd.logDest.Printf("%d files: %v...", len(filelist), filelist[:3]) + } else { + cmd.logDest.Printf("Files: %v", filelist) + } + + if err := os.MkdirAll(cmd.OutputDir, 0755); err != nil { + return errors.Wrapf(err, "creating output directory: '%s'", cmd.OutputDir) + } + + for i := 0; i < cmd.PartitionN; i++ { + name := filepath.Join(cmd.OutputDir, fmt.Sprintf("output_%d", i)) + f, err := os.Create(name) + if err != nil { + return errors.Wrapf(err, "couldn't open output file %s", name) + } + cmd.outputFiles[i] = f + } + defer func() { + for _, f := range cmd.outputFiles { + _ = f.Close() + } + }() + + switch cmd.Type { + case "ndjson": + if err := cmd.RunNDJSON(filelist); err != nil { + return errors.Wrap(err, "running ndjson") + } + case "csv": + if err := cmd.RunCSV(filelist); err != nil { + return errors.Wrap(err, "running csv") + } + default: + return errors.Errorf("unsupported type %s, try ndjson or csv", cmd.Type) + } + + return nil +} + +func (cmd *PreSortCommand) RunNDJSON(filelist []string) error { + outputEncoders := make(map[int]*json.Encoder) + for i, f := range cmd.outputFiles { + outputEncoders[i] = json.NewEncoder(f) + outputEncoders[i].SetIndent("", "") + outputEncoders[i].SetEscapeHTML(false) + } + + for _, fname := range filelist { + f, err := os.Open(fname) + if err != nil { + cmd.logDest.Warnf("Could not open %s, skipping", fname) + } + dec := json.NewDecoder(f) + rec := map[string]interface{}{} + for err = dec.Decode(&rec); err == nil; err = dec.Decode(&rec) { + partition, err := cmd.ndjsonPartition(rec) + if err != nil { + return err + } + err = outputEncoders[partition].Encode(rec) + if err != nil { + return errors.Wrapf(err, "writing record to partition %d", partition) + } + } + if err != io.EOF && err != nil { + return errors.Wrapf(err, "error attempting to decode json from %s", fname) + } + } + return nil +} + +func (cmd *PreSortCommand) ndjsonPartition(rec map[string]interface{}) (int, error) { + h := fnv.New64a() + _, _ = h.Write([]byte(cmd.Table)) + + for i, name := range cmd.PrimaryKeyFields { + val, ok := rec[name] + if !ok { + return 0, errors.Errorf("couldn't find primary key part '%s' in record: %+v", name, rec) + } + h.Write([]byte(toString(val))) + if i < len(cmd.PrimaryKeyFields)-1 { + h.Write([]byte{'|'}) + } + } + return int(h.Sum64() % uint64(cmd.PartitionN)), nil +} + +func (cmd *PreSortCommand) RunCSV(filelist []string) error { + outputWriters := make(map[int]*csv.Writer) + for i, f := range cmd.outputFiles { + outputWriters[i] = csv.NewWriter(f) + } + + for _, fname := range filelist { + f, err := os.Open(fname) + if err != nil { + cmd.logDest.Warnf("Could not open %s, skipping", fname) + } + reader := csv.NewReader(f) + reader.ReuseRecord = true + rec, err := reader.Read() + if err != nil { + return errors.Wrap(err, "") + } + header := make(map[string]int) + for i, key := range rec { + header[key] = i + } + for rec, err = reader.Read(); err == nil; rec, err = reader.Read() { + partition, err := cmd.csvPartition(header, rec) + if err != nil { + return err + } + err = outputWriters[partition].Write(rec) + if err != nil { + return errors.Wrapf(err, "writing record to partition %d", partition) + } + } + if err != io.EOF && err != nil { + return errors.Wrapf(err, "error attempting to decode json from %s", fname) + } + } + + for _, w := range outputWriters { + w.Flush() + } + return nil +} + +func (cmd *PreSortCommand) csvPartition(header map[string]int, rec []string) (int, error) { + h := fnv.New64a() + _, _ = h.Write([]byte(cmd.Table)) + + for i, name := range cmd.PrimaryKeyFields { + pos, ok := header[name] + if !ok { + return 0, errors.Errorf("couldn't find primary key part '%s' in header: %+v", name, header) + } + val := rec[pos] + h.Write([]byte(toString(val))) + if i < len(cmd.PrimaryKeyFields)-1 { + h.Write([]byte{'|'}) + } + } + return int(h.Sum64() % uint64(cmd.PartitionN)), nil +} + +func toString(val interface{}) string { + switch valt := val.(type) { + case string: + return valt + case float64, int, int64, uint64, float32, uint: + return fmt.Sprintf("%d", valt) + default: + return fmt.Sprintf("%v", valt) + } +} + +func (cmd *PreSortCommand) partition(key string) int { + h := fnv.New64a() + _, _ = h.Write([]byte(cmd.Table)) + _, _ = h.Write([]byte(key)) + return int(h.Sum64() % uint64(cmd.PartitionN)) +} + +func partition(key string) int { + indexName := "karambit" + h := fnv.New64a() + _, _ = h.Write([]byte(indexName)) + _, _ = h.Write([]byte(key)) + return int(h.Sum64() % uint64(256)) +} diff --git a/ctl/pre_sort_test.go b/ctl/pre_sort_test.go new file mode 100644 index 000000000..ff070dc4c --- /dev/null +++ b/ctl/pre_sort_test.go @@ -0,0 +1,136 @@ +package ctl_test + +import ( + "context" + "io/fs" + "os" + "path/filepath" + "testing" + + "github.com/featurebasedb/featurebase/v3/ctl" + "github.com/featurebasedb/featurebase/v3/logger" +) + +func TestPreSort(t *testing.T) { + td := t.TempDir() + testFile(t, "sample.ndjson", td, sampleNDJSON) + testFile(t, "sample.csv", td, sampleCSV) + + com := ctl.NewPreSortCommand(logger.StderrLogger) + com.Type = "ndjson" + com.OutputDir = "ndjson_out" + com.File = "sample.ndjson" + com.Table = "blah" + com.PartitionN = 5 + com.PrimaryKeyFields = []string{"url"} + + os.Chdir(td) + + err := com.Run(context.Background()) + if err != nil { + t.Fatalf("running ndjson: %v", err) + } + + entries, err := os.ReadDir(filepath.Join(td, "ndjson_out")) + if err != nil { + t.Fatalf("reading dir: %v", err) + } + totalSize := 0 + numWithData := 0 + totalSizeRead := 0 + if len(entries) != 5 { + t.Errorf("expected 5 output files, but got: %d", len(entries)) + } + for _, entry := range entries { + stuff, err := os.ReadFile(filepath.Join(com.OutputDir, entry.Name())) + if err != nil { + t.Fatalf("reading: %v", err) + } + totalSizeRead += len(stuff) + t.Logf("%s\n", stuff) + if size(t, entry) > 0 { + totalSize += int(size(t, entry)) + numWithData++ + } + t.Log(entry.Name(), size(t, entry)) + } + if totalSize < len(sampleNDJSON) || totalSize > len(sampleNDJSON) { + t.Errorf("unexpected total data size orig: %d, got: %d", len(sampleNDJSON), totalSize) + } + + com = ctl.NewPreSortCommand(logger.StderrLogger) + com.Type = "csv" + com.OutputDir = "csv_out" + com.File = "sample.csv" + com.Table = "blah" + com.PartitionN = 5 + com.PrimaryKeyFields = []string{"a", "b"} + + err = com.Run(context.Background()) + if err != nil { + t.Fatalf("running ndjson: %v", err) + } + + entries, err = os.ReadDir(filepath.Join(td, com.OutputDir)) + if err != nil { + t.Fatalf("reading dir: %v", err) + } + totalSize = 0 + numWithData = 0 + totalSizeRead = 0 + if len(entries) != 5 { + t.Errorf("expected 5 output files, but got: %d", len(entries)) + } + for _, entry := range entries { + stuff, err := os.ReadFile(filepath.Join(com.OutputDir, entry.Name())) + if err != nil { + t.Fatalf("reading: %v", err) + } + totalSizeRead += len(stuff) + t.Logf("%s\n", stuff) + if size(t, entry) > 0 { + totalSize += int(size(t, entry)) + numWithData++ + } + t.Log(entry.Name(), size(t, entry)) + } + // -14 is removing the header + if totalSize < len(sampleCSV)-14 || totalSize > len(sampleCSV)-14 { + t.Errorf("unexpected total data size orig: %d, got: %d", len(sampleCSV), totalSize) + } + +} + +func size(t *testing.T, e fs.DirEntry) int64 { + info, err := e.Info() + if err != nil { + t.Fatalf(": %v", err) + } + return info.Size() +} + +func testFile(t *testing.T, name, dir, contents string) { + f, err := os.Create(filepath.Join(dir, name)) + if err != nil { + t.Fatalf("creating temp file: %v", err) + } + _, err = f.WriteString(contents) + if err != nil { + t.Fatalf("writing temp file: %v", err) + } +} + +var sampleNDJSON string = `{"url":"https://www.yelp.com/search?find_desc=Desserts&find_loc=San+Jose,+CA&start=0","result":{"extractorData":{"url":"https://www.yelp.com/search?find_desc=Desserts&find_loc=San+Jose,+CA&start=0","data":[{"group":[{"Business":[{"href":"https://www.yelp.com/biz/milk-and-wood-san-jose?osq=Desserts","text":"Milk & Wood"}]},{"Business":[{"href":"https://www.yelp.com/biz/dzuis-cakes-and-desserts-san-jose?osq=Desserts","text":"Dzui’s Cakes & Desserts"}]},{"Business":[{"href":"https://www.yelp.com/biz/recess-italian-ice-and-desserts-san-jose?osq=Desserts","text":"Recess Italian Ice and Desserts"}]},{"Business":[{"href":"https://www.yelp.com/biz/icicles-san-jose-7?osq=Desserts","text":"ICICLES"}]},{"Business":[{"href":"https://www.yelp.com/biz/sweet-rendezvous-san-jose?osq=Desserts","text":"Sweet Rendezvous"}]},{"Business":[{"href":"https://www.yelp.com/biz/passion-t-snacks-and-desserts-san-jose?osq=Desserts","text":"Passion-T Snacks and Desserts"}]},{"Business":[{"href":"https://www.yelp.com/biz/vampire-penguin-featuring-jastea-san-jose?osq=Desserts","text":"Vampire Penguin featuring Jastea"}]},{"Business":[{"href":"https://www.yelp.com/biz/sweet-gelato-tea-lounge-san-jose?osq=Desserts","text":"Sweet Gelato Tea Lounge"}]},{"Business":[{"href":"https://www.yelp.com/biz/matcha-love-san-jose-6?osq=Desserts","text":"Matcha Love"}]},{"Business":[{"href":"https://www.yelp.com/biz/anton-sv-p%C3%A2tisserie-san-jose-2?osq=Desserts","text":"Anton SV Pâtisserie"}]}]}]},"pageData":{"statusCode":200,"timestamp":1513286383006},"timestamp":1513286383006,"sequenceNumber":0}} +{"url":"https://www.yelp.com/search?find_desc=Desserts&find_loc=San+Jose,+CA&start=10","result":{"extractorData":{"url":"https://www.yelp.com/search?find_desc=Desserts&find_loc=San+Jose,+CA&start=10","data":[{"group":[{"Business":[{"href":"https://www.yelp.com/biz/oooh-san-jose-4?osq=Desserts","text":"Oooh"}]},{"Business":[{"href":"https://www.yelp.com/biz/hannah-san-jose?osq=Desserts","text":"Hannah"}]},{"Business":[{"href":"https://www.yelp.com/biz/chocatoo-san-jose?osq=Desserts","text":"Chocatoo"}]},{"Business":[{"href":"https://www.yelp.com/biz/nox-cookie-bar-san-jose?osq=Desserts","text":"Nox Cookie Bar"}]},{"Business":[{"href":"https://www.yelp.com/biz/sweet-fix-creamery-san-jose?osq=Desserts","text":"Sweet Fix Creamery"}]},{"Business":[{"href":"https://www.yelp.com/biz/my-milkshake-san-jose?osq=Desserts","text":"My Milkshake"}]},{"Business":[{"href":"https://www.yelp.com/biz/matcha-love-san-jose-6?osq=Desserts","text":"Matcha Love"}]},{"Business":[{"href":"https://www.yelp.com/biz/banana-cr%C3%AApe-san-jose-2?osq=Desserts","text":"Banana Crêpe"}]},{"Business":[{"href":"https://www.yelp.com/biz/marco-polo-italian-ice-cream-san-jose-4?osq=Desserts","text":"Marco Polo Italian Ice Cream"}]},{"Business":[{"href":"https://www.yelp.com/biz/blackball-desserts-san-jose-san-jose?osq=Desserts","text":"BlackBall Desserts San Jose"}]}]}]},"pageData":{"statusCode":200,"timestamp":1513286384917},"timestamp":1513286384917,"sequenceNumber":1}} +{"url":"https://www.yelp.com/search?find_desc=Desserts&find_loc=San+Jose,+CA&start=20","result":{"extractorData":{"url":"https://www.yelp.com/search?find_desc=Desserts&find_loc=San+Jose,+CA&start=20","data":[{"group":[{"Business":[{"href":"https://www.yelp.com/biz/anton-sv-p%C3%A2tisserie-san-jose-2?osq=Desserts","text":"Anton SV Pâtisserie"}]},{"Business":[{"href":"https://www.yelp.com/biz/soyful-desserts-san-jose-8?osq=Desserts","text":"Soyful Desserts"}]},{"Business":[{"href":"https://www.yelp.com/biz/cocola-bakery-san-jose?osq=Desserts","text":"Cocola Bakery"}]},{"Business":[{"href":"https://www.yelp.com/biz/charlies-cheesecake-works-san-jose?osq=Desserts","text":"Charlie’s Cheesecake Works"}]},{"Business":[{"href":"https://www.yelp.com/biz/jt-express-san-jose-2?osq=Desserts","text":"JT Express"}]},{"Business":[{"href":"https://www.yelp.com/biz/nox-cookie-bar-san-jose?osq=Desserts","text":"Nox Cookie Bar"}]},{"Business":[{"href":"https://www.yelp.com/biz/shuei-do-manju-shop-san-jose?osq=Desserts","text":"Shuei-Do Manju Shop"}]},{"Business":[{"href":"https://www.yelp.com/biz/churros-el-guero-san-jose?osq=Desserts","text":"Churros El Guero"}]},{"Business":[{"href":"https://www.yelp.com/biz/sno-crave-tea-house-san-jose-4?osq=Desserts","text":"Sno-Crave Tea House"}]},{"Business":[{"href":"https://www.yelp.com/biz/j-sweets-san-jose-3?osq=Desserts","text":"J.Sweets"}]}]}]},"pageData":{"statusCode":200,"timestamp":1513286395948},"timestamp":1513286395948,"sequenceNumber":2}} +{"url":"https://www.yelp.com/search?find_desc=Desserts&find_loc=San+Jose,+CA&start=30","result":{"extractorData":{"url":"https://www.yelp.com/search?find_desc=Desserts&find_loc=San+Jose,+CA&start=30","data":[{"group":[{"Business":[{"href":"https://www.yelp.com/biz/treatbot-san-jose-2?osq=Desserts","text":"Treatbot"}]},{"Business":[{"href":"https://www.yelp.com/biz/cream-san-jose?osq=Desserts","text":"CREAM"}]},{"Business":[{"href":"https://www.yelp.com/biz/my-milkshake-san-jose?osq=Desserts","text":"My Milkshake"}]},{"Business":[{"href":"https://www.yelp.com/biz/peters-bakery-san-jose?osq=Desserts","text":"Peters’ Bakery"}]},{"Business":[{"href":"https://www.yelp.com/biz/the-charming-kitchen-san-jose-5?osq=Desserts","text":"The Charming Kitchen"}]},{"Business":[{"href":"https://www.yelp.com/biz/sweet-fix-creamery-san-jose?osq=Desserts","text":"Sweet Fix Creamery"}]},{"Business":[{"href":"https://www.yelp.com/biz/california-mochi-santa-clara-4?osq=Desserts","text":"California Mochi"}]},{"Business":[{"href":"https://www.yelp.com/biz/raw-sugar-milpitas-2?osq=Desserts","text":"Raw Sugar"}]},{"Business":[{"href":"https://www.yelp.com/biz/chola-desserts-san-jose?osq=Desserts","text":"Chola Desserts"}]},{"Business":[{"href":"https://www.yelp.com/biz/san-jose-tofu-company-san-jose?osq=Desserts","text":"San Jose Tofu Company"}]}]}]},"pageData":{"statusCode":200,"timestamp":1513286386420},"timestamp":1513286386420,"sequenceNumber":3}} +{"url":"https://www.yelp.com/search?find_desc=Desserts&find_loc=San+Jose,+CA&start=40","result":{"extractorData":{"url":"https://www.yelp.com/search?find_desc=Desserts&find_loc=San+Jose,+CA&start=40","data":[{"group":[{"Business":[{"href":"https://www.yelp.com/biz/the-sweet-corner-san-jose?osq=Desserts","text":"The Sweet Corner"}]},{"Business":[{"href":"https://www.yelp.com/biz/marco-polo-italian-ice-cream-san-jose-4?osq=Desserts","text":"Marco Polo Italian Ice Cream"}]},{"Business":[{"href":"https://www.yelp.com/biz/honeyberry-san-jose-9?osq=Desserts","text":"Honeyberry"}]},{"Business":[{"href":"https://www.yelp.com/biz/my-ch%C3%A8-san-jose?osq=Desserts","text":"My Chè"}]},{"Business":[{"href":"https://www.yelp.com/biz/creme-paris-san-jose-3?osq=Desserts","text":"Cre’Me Paris"}]},{"Business":[{"href":"https://www.yelp.com/biz/snowflake-san-jose?osq=Desserts","text":"Snowflake"}]},{"Business":[{"href":"https://www.yelp.com/biz/willow-glen-creamery-san-jose-4?osq=Desserts","text":"Willow Glen Creamery"}]},{"Business":[{"href":"https://www.yelp.com/biz/vans-bakery-san-jose?osq=Desserts","text":"Van’s Bakery"}]},{"Business":[{"href":"https://www.yelp.com/biz/happiness-cafe-san-jose?osq=Desserts","text":"Happiness Cafe"}]},{"Business":[{"href":"https://www.yelp.com/biz/la-original-paleteria-y-neveria-san-jose?osq=Desserts","text":"La Original Paleteria Y Neveria"}]}]}]},"pageData":{"statusCode":200,"timestamp":1513286387763},"timestamp":1513286387763,"sequenceNumber":4}} +` + +var sampleCSV string = `a,b,c,d,e,f,g +1,2,3,4,5,6,7 +2,3,4,5,6,7,8 +3,4,5,6,7,8,9 +4,5,6,7,8,9,0 +0,1,2,3,4,5,6 +` diff --git a/ctl/util.go b/ctl/util.go index 07d716971..ccb365704 100644 --- a/ctl/util.go +++ b/ctl/util.go @@ -8,8 +8,8 @@ import ( "runtime" "time" - "github.com/felixge/fgprof" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/felixge/fgprof" "github.com/pkg/errors" ) diff --git a/dax/computer/service/computer.go b/dax/computer/service/computer.go index 63eb52c2a..3a8cd8127 100644 --- a/dax/computer/service/computer.go +++ b/dax/computer/service/computer.go @@ -7,14 +7,14 @@ import ( "net/http" featurebase "github.com/featurebasedb/featurebase/v3" - "github.com/featurebasedb/featurebase/v3/dax" - "github.com/featurebasedb/featurebase/v3/dax/computer" - mdsclient "github.com/featurebasedb/featurebase/v3/dax/mds/client" - "github.com/featurebasedb/featurebase/v3/dax/snapshotter" - "github.com/featurebasedb/featurebase/v3/dax/writelogger" - "github.com/featurebasedb/featurebase/v3/errors" - "github.com/featurebasedb/featurebase/v3/logger" - fbserver "github.com/featurebasedb/featurebase/v3/server" + "github.com/featurebasedb/featurebase/v3/dax" + "github.com/featurebasedb/featurebase/v3/dax/computer" + mdsclient "github.com/featurebasedb/featurebase/v3/dax/mds/client" + "github.com/featurebasedb/featurebase/v3/dax/snapshotter" + "github.com/featurebasedb/featurebase/v3/dax/writelogger" + "github.com/featurebasedb/featurebase/v3/errors" + "github.com/featurebasedb/featurebase/v3/logger" + fbserver "github.com/featurebasedb/featurebase/v3/server" ) // Ensure type implements interface. diff --git a/dax/mds/http/handler.go b/dax/mds/http/handler.go index 9926416d2..532010bf9 100644 --- a/dax/mds/http/handler.go +++ b/dax/mds/http/handler.go @@ -4,9 +4,9 @@ import ( "encoding/json" "net/http" - "github.com/gorilla/mux" "github.com/featurebasedb/featurebase/v3/dax" "github.com/featurebasedb/featurebase/v3/dax/mds" + "github.com/gorilla/mux" ) func Handler(mds *mds.MDS) http.Handler { diff --git a/dax/queryer/http/handler.go b/dax/queryer/http/handler.go index 419336bd3..24725115f 100644 --- a/dax/queryer/http/handler.go +++ b/dax/queryer/http/handler.go @@ -4,9 +4,9 @@ import ( "encoding/json" "net/http" - "github.com/gorilla/mux" "github.com/featurebasedb/featurebase/v3/dax" "github.com/featurebasedb/featurebase/v3/dax/queryer" + "github.com/gorilla/mux" ) func Handler(q *queryer.Queryer) http.Handler { diff --git a/dax/queryer/orchestrator.go b/dax/queryer/orchestrator.go index 75069b940..b51f153f3 100644 --- a/dax/queryer/orchestrator.go +++ b/dax/queryer/orchestrator.go @@ -11,11 +11,11 @@ import ( featurebase "github.com/featurebasedb/featurebase/v3" "github.com/featurebasedb/featurebase/v3/dax" - "github.com/prometheus/client_golang/prometheus" "github.com/featurebasedb/featurebase/v3/errors" "github.com/featurebasedb/featurebase/v3/logger" "github.com/featurebasedb/featurebase/v3/pql" "github.com/featurebasedb/featurebase/v3/tracing" + "github.com/prometheus/client_golang/prometheus" "golang.org/x/sync/errgroup" ) diff --git a/dax/service_manager.go b/dax/service_manager.go index ec24897c9..cbd8b57db 100644 --- a/dax/service_manager.go +++ b/dax/service_manager.go @@ -5,9 +5,9 @@ import ( "net/http" "sync" - "github.com/gorilla/mux" "github.com/featurebasedb/featurebase/v3/errors" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/gorilla/mux" ) // ServiceKey is a unique key used to identify one service managed by the diff --git a/encoding/proto/proto.go b/encoding/proto/proto.go index 19a8cfffd..dc8c2ad5e 100644 --- a/encoding/proto/proto.go +++ b/encoding/proto/proto.go @@ -15,8 +15,6 @@ import ( "github.com/apache/arrow/go/v10/parquet" "github.com/apache/arrow/go/v10/parquet/file" "github.com/apache/arrow/go/v10/parquet/pqarrow" - "github.com/gogo/protobuf/proto" - "github.com/gomem/gomem/pkg/dataframe" pilosa "github.com/featurebasedb/featurebase/v3" "github.com/featurebasedb/featurebase/v3/disco" pnet "github.com/featurebasedb/featurebase/v3/net" @@ -24,6 +22,8 @@ import ( "github.com/featurebasedb/featurebase/v3/pql" "github.com/featurebasedb/featurebase/v3/roaring" "github.com/featurebasedb/featurebase/v3/vprint" + "github.com/gogo/protobuf/proto" + "github.com/gomem/gomem/pkg/dataframe" "github.com/pkg/errors" ) diff --git a/encoding/proto/proto_test.go b/encoding/proto/proto_test.go index c401932b2..db049fc5f 100644 --- a/encoding/proto/proto_test.go +++ b/encoding/proto/proto_test.go @@ -9,9 +9,9 @@ import ( "github.com/apache/arrow/go/v10/arrow" "github.com/apache/arrow/go/v10/arrow/array" "github.com/apache/arrow/go/v10/arrow/memory" - "github.com/gomem/gomem/pkg/dataframe" pilosa "github.com/featurebasedb/featurebase/v3" "github.com/featurebasedb/featurebase/v3/pb" + "github.com/gomem/gomem/pkg/dataframe" ) func testOneRoundTrip(t *testing.T, s pilosa.Serializer, obj pilosa.Message, expectedMarshalErr error, expectedUnmarshalErr error, expectedMismatchErr error) { diff --git a/executor.go b/executor.go index 4fd1023a2..24dc1d3a3 100644 --- a/executor.go +++ b/executor.go @@ -17,8 +17,6 @@ import ( "time" "unsafe" - "github.com/gomem/gomem/pkg/dataframe" - "github.com/lib/pq" "github.com/featurebasedb/featurebase/v3/dax" "github.com/featurebasedb/featurebase/v3/disco" "github.com/featurebasedb/featurebase/v3/pql" @@ -28,6 +26,8 @@ import ( "github.com/featurebasedb/featurebase/v3/task" "github.com/featurebasedb/featurebase/v3/testhook" "github.com/featurebasedb/featurebase/v3/tracing" + "github.com/gomem/gomem/pkg/dataframe" + "github.com/lib/pq" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "golang.org/x/sync/errgroup" diff --git a/executor_test.go b/executor_test.go index b489c6738..fc2aabe86 100644 --- a/executor_test.go +++ b/executor_test.go @@ -26,6 +26,7 @@ import ( pilosa "github.com/featurebasedb/featurebase/v3" "github.com/featurebasedb/featurebase/v3/ctl" "github.com/featurebasedb/featurebase/v3/disco" + "github.com/featurebasedb/featurebase/v3/logger" "github.com/featurebasedb/featurebase/v3/pql" "github.com/featurebasedb/featurebase/v3/proto" "github.com/featurebasedb/featurebase/v3/server" @@ -33,7 +34,6 @@ import ( "github.com/featurebasedb/featurebase/v3/testhook" . "github.com/featurebasedb/featurebase/v3/vprint" // nolint:staticcheck "github.com/google/go-cmp/cmp" - "github.com/featurebasedb/featurebase/v3/logger" "github.com/pkg/errors" "github.com/stretchr/testify/assert" ) diff --git a/hack.go b/hack.go index bf40f3340..12b045aba 100644 --- a/hack.go +++ b/hack.go @@ -6,9 +6,9 @@ import ( "math" "time" - "github.com/gogo/protobuf/proto" "github.com/featurebasedb/featurebase/v3/pb" "github.com/featurebasedb/featurebase/v3/pql" + "github.com/gogo/protobuf/proto" ) func UnmarshalIndexOptions(name string, createdAt int64, buf []byte) (*IndexOptions, error) { diff --git a/http_handler.go b/http_handler.go index 142daabe1..0328d0302 100644 --- a/http_handler.go +++ b/http_handler.go @@ -28,9 +28,6 @@ import ( "time" "github.com/apache/arrow/go/v10/arrow" - "github.com/felixge/fgprof" - "github.com/gorilla/handlers" - "github.com/gorilla/mux" "github.com/featurebasedb/featurebase/v3/authn" "github.com/featurebasedb/featurebase/v3/authz" fbcontext "github.com/featurebasedb/featurebase/v3/context" @@ -43,10 +40,13 @@ import ( "github.com/featurebasedb/featurebase/v3/sql3/planner/types" "github.com/featurebasedb/featurebase/v3/storage" "github.com/featurebasedb/featurebase/v3/tracing" + "github.com/featurebasedb/featurebase/v3/wireprotocol" + "github.com/felixge/fgprof" + "github.com/gorilla/handlers" + "github.com/gorilla/mux" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/featurebasedb/featurebase/v3/wireprotocol" dto "github.com/prometheus/client_model/go" "github.com/prometheus/prom2json" uuid "github.com/satori/go.uuid" diff --git a/idk/bankgen/put.go b/idk/bankgen/put.go index 466ff7c6c..510b677bb 100644 --- a/idk/bankgen/put.go +++ b/idk/bankgen/put.go @@ -10,11 +10,11 @@ import ( "strings" "sync/atomic" - liavro "github.com/linkedin/goavro/v2" "github.com/featurebasedb/featurebase/v3/idk" "github.com/featurebasedb/featurebase/v3/idk/common" "github.com/featurebasedb/featurebase/v3/idk/kafka/csrc" "github.com/featurebasedb/featurebase/v3/logger" + liavro "github.com/linkedin/goavro/v2" "github.com/pkg/errors" confluent "github.com/confluentinc/confluent-kafka-go/kafka" diff --git a/idk/cmd/bankgen/main.go b/idk/cmd/bankgen/main.go index f970e5e80..a9d49d4dc 100644 --- a/idk/cmd/bankgen/main.go +++ b/idk/cmd/bankgen/main.go @@ -4,9 +4,9 @@ import ( "log" "os" - "github.com/jaffee/commandeer/pflag" "github.com/featurebasedb/featurebase/v3/idk/bankgen" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/jaffee/commandeer/pflag" ) func main() { diff --git a/idk/cmd/bankgen/main_test.go b/idk/cmd/bankgen/main_test.go index 35585079a..1ca7e2864 100644 --- a/idk/cmd/bankgen/main_test.go +++ b/idk/cmd/bankgen/main_test.go @@ -4,9 +4,9 @@ import ( "reflect" "testing" + "github.com/featurebasedb/featurebase/v3/idk/bankgen" "github.com/jaffee/commandeer" "github.com/jaffee/commandeer/pflag" - "github.com/featurebasedb/featurebase/v3/idk/bankgen" pflag13 "github.com/spf13/pflag" ) diff --git a/idk/cmd/datagen/main.go b/idk/cmd/datagen/main.go index a93180f8c..05e800b34 100644 --- a/idk/cmd/datagen/main.go +++ b/idk/cmd/datagen/main.go @@ -4,9 +4,9 @@ import ( "log" "os" - "github.com/jaffee/commandeer/pflag" "github.com/featurebasedb/featurebase/v3/idk/datagen" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/jaffee/commandeer/pflag" "gopkg.in/DataDog/dd-trace-go.v1/profiler" ) diff --git a/idk/cmd/datagen/main_test.go b/idk/cmd/datagen/main_test.go index d779415c3..9006c71f3 100644 --- a/idk/cmd/datagen/main_test.go +++ b/idk/cmd/datagen/main_test.go @@ -5,9 +5,9 @@ import ( "strings" "testing" + "github.com/featurebasedb/featurebase/v3/idk/datagen" "github.com/jaffee/commandeer" "github.com/jaffee/commandeer/pflag" - "github.com/featurebasedb/featurebase/v3/idk/datagen" pflag13 "github.com/spf13/pflag" ) diff --git a/idk/cmd/ingester/main.go b/idk/cmd/ingester/main.go index e7aca6ba5..5146223b5 100644 --- a/idk/cmd/ingester/main.go +++ b/idk/cmd/ingester/main.go @@ -6,11 +6,11 @@ import ( "net/http" "runtime/debug" - "github.com/gorilla/mux" - "github.com/jaffee/commandeer/pflag" pilosaclient "github.com/featurebasedb/featurebase/v3/client" "github.com/featurebasedb/featurebase/v3/idk" "github.com/featurebasedb/featurebase/v3/idk/api" + "github.com/gorilla/mux" + "github.com/jaffee/commandeer/pflag" "github.com/pkg/errors" ) diff --git a/idk/cmd/kafkagen/main.go b/idk/cmd/kafkagen/main.go index 8616f0745..db0fc38bd 100644 --- a/idk/cmd/kafkagen/main.go +++ b/idk/cmd/kafkagen/main.go @@ -4,9 +4,9 @@ import ( "log" "os" - "github.com/jaffee/commandeer/pflag" "github.com/featurebasedb/featurebase/v3/idk/kafkagen" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/jaffee/commandeer/pflag" ) func main() { diff --git a/idk/cmd/kafkagen/main_test.go b/idk/cmd/kafkagen/main_test.go index d0169bb27..d541e44ae 100644 --- a/idk/cmd/kafkagen/main_test.go +++ b/idk/cmd/kafkagen/main_test.go @@ -4,9 +4,9 @@ import ( "reflect" "testing" + "github.com/featurebasedb/featurebase/v3/idk/kafkagen" "github.com/jaffee/commandeer" "github.com/jaffee/commandeer/pflag" - "github.com/featurebasedb/featurebase/v3/idk/kafkagen" pflag13 "github.com/spf13/pflag" ) diff --git a/idk/cmd/kafkaput/main.go b/idk/cmd/kafkaput/main.go index 2bc9989f5..48058ac40 100644 --- a/idk/cmd/kafkaput/main.go +++ b/idk/cmd/kafkaput/main.go @@ -4,9 +4,9 @@ import ( "log" "os" - "github.com/jaffee/commandeer/pflag" "github.com/featurebasedb/featurebase/v3/idk/kafka" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/jaffee/commandeer/pflag" ) func main() { diff --git a/idk/cmd/kafkaput/main_test.go b/idk/cmd/kafkaput/main_test.go index 3d985292e..8d82f0ef7 100644 --- a/idk/cmd/kafkaput/main_test.go +++ b/idk/cmd/kafkaput/main_test.go @@ -4,9 +4,9 @@ import ( "reflect" "testing" + "github.com/featurebasedb/featurebase/v3/idk/kafka" "github.com/jaffee/commandeer" "github.com/jaffee/commandeer/pflag" - "github.com/featurebasedb/featurebase/v3/idk/kafka" pflag13 "github.com/spf13/pflag" ) diff --git a/idk/cmd/molecula-consumer-csv/main.go b/idk/cmd/molecula-consumer-csv/main.go index adc08cf4e..f56c287a5 100644 --- a/idk/cmd/molecula-consumer-csv/main.go +++ b/idk/cmd/molecula-consumer-csv/main.go @@ -5,9 +5,9 @@ import ( "log" "os" - "github.com/jaffee/commandeer/pflag" "github.com/featurebasedb/featurebase/v3/idk/csv" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/jaffee/commandeer/pflag" ) func main() { diff --git a/idk/cmd/molecula-consumer-csv/main_test.go b/idk/cmd/molecula-consumer-csv/main_test.go index 313ca3cbd..35c8d0e12 100644 --- a/idk/cmd/molecula-consumer-csv/main_test.go +++ b/idk/cmd/molecula-consumer-csv/main_test.go @@ -4,9 +4,9 @@ import ( "reflect" "testing" + "github.com/featurebasedb/featurebase/v3/idk/csv" "github.com/jaffee/commandeer" "github.com/jaffee/commandeer/pflag" - "github.com/featurebasedb/featurebase/v3/idk/csv" pflag13 "github.com/spf13/pflag" ) diff --git a/idk/cmd/molecula-consumer-kafka-delete/main.go b/idk/cmd/molecula-consumer-kafka-delete/main.go index 429632a40..8f51e3a77 100644 --- a/idk/cmd/molecula-consumer-kafka-delete/main.go +++ b/idk/cmd/molecula-consumer-kafka-delete/main.go @@ -3,8 +3,8 @@ package main import ( "log" - "github.com/jaffee/commandeer/pflag" "github.com/featurebasedb/featurebase/v3/idk/kafka" + "github.com/jaffee/commandeer/pflag" ) func main() { diff --git a/idk/cmd/molecula-consumer-kafka-delete/main_test.go b/idk/cmd/molecula-consumer-kafka-delete/main_test.go index 2aba1f68d..b675fe502 100644 --- a/idk/cmd/molecula-consumer-kafka-delete/main_test.go +++ b/idk/cmd/molecula-consumer-kafka-delete/main_test.go @@ -5,9 +5,9 @@ import ( "testing" "time" + "github.com/featurebasedb/featurebase/v3/idk/kafka" "github.com/jaffee/commandeer" "github.com/jaffee/commandeer/pflag" - "github.com/featurebasedb/featurebase/v3/idk/kafka" pflag13 "github.com/spf13/pflag" ) diff --git a/idk/cmd/molecula-consumer-kafka-sasl/main.go b/idk/cmd/molecula-consumer-kafka-sasl/main.go index f4a9ce861..64b1531b9 100644 --- a/idk/cmd/molecula-consumer-kafka-sasl/main.go +++ b/idk/cmd/molecula-consumer-kafka-sasl/main.go @@ -4,9 +4,9 @@ import ( "log" "os" - "github.com/jaffee/commandeer/pflag" "github.com/featurebasedb/featurebase/v3/idk/kafka_sasl" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/jaffee/commandeer/pflag" ) func main() { diff --git a/idk/cmd/molecula-consumer-kafka-static/main.go b/idk/cmd/molecula-consumer-kafka-static/main.go index 265bd5b6f..257228302 100644 --- a/idk/cmd/molecula-consumer-kafka-static/main.go +++ b/idk/cmd/molecula-consumer-kafka-static/main.go @@ -4,9 +4,9 @@ import ( "log" "os" - "github.com/jaffee/commandeer/pflag" "github.com/featurebasedb/featurebase/v3/idk/kafka_static" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/jaffee/commandeer/pflag" ) func main() { diff --git a/idk/cmd/molecula-consumer-kafka/main.go b/idk/cmd/molecula-consumer-kafka/main.go index 75ce39e89..02533e37b 100644 --- a/idk/cmd/molecula-consumer-kafka/main.go +++ b/idk/cmd/molecula-consumer-kafka/main.go @@ -4,9 +4,9 @@ import ( "log" "os" - "github.com/jaffee/commandeer/pflag" "github.com/featurebasedb/featurebase/v3/idk/kafka" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/jaffee/commandeer/pflag" ) func main() { diff --git a/idk/cmd/molecula-consumer-kafka/main_test.go b/idk/cmd/molecula-consumer-kafka/main_test.go index ff9fcdbe8..65ecbe12c 100644 --- a/idk/cmd/molecula-consumer-kafka/main_test.go +++ b/idk/cmd/molecula-consumer-kafka/main_test.go @@ -5,10 +5,10 @@ import ( "testing" "time" - "github.com/jaffee/commandeer" - "github.com/jaffee/commandeer/pflag" "github.com/featurebasedb/featurebase/v3/idk" "github.com/featurebasedb/featurebase/v3/idk/kafka" + "github.com/jaffee/commandeer" + "github.com/jaffee/commandeer/pflag" pflag13 "github.com/spf13/pflag" ) diff --git a/idk/cmd/molecula-consumer-kinesis/main.go b/idk/cmd/molecula-consumer-kinesis/main.go index f37572d6f..f4f0b1d39 100644 --- a/idk/cmd/molecula-consumer-kinesis/main.go +++ b/idk/cmd/molecula-consumer-kinesis/main.go @@ -4,9 +4,9 @@ import ( "log" "os" - "github.com/jaffee/commandeer/pflag" "github.com/featurebasedb/featurebase/v3/idk/kinesis" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/jaffee/commandeer/pflag" ) func logError(m *kinesis.Main, err error) { diff --git a/idk/cmd/molecula-consumer-sql/main.go b/idk/cmd/molecula-consumer-sql/main.go index af556fe24..f13b10ce0 100644 --- a/idk/cmd/molecula-consumer-sql/main.go +++ b/idk/cmd/molecula-consumer-sql/main.go @@ -4,9 +4,9 @@ import ( "log" "os" - "github.com/jaffee/commandeer/pflag" "github.com/featurebasedb/featurebase/v3/idk/sql" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/jaffee/commandeer/pflag" ) func main() { diff --git a/idk/cmd/molecula-consumer-sql/main_test.go b/idk/cmd/molecula-consumer-sql/main_test.go index f6b75d807..5ac4a8489 100644 --- a/idk/cmd/molecula-consumer-sql/main_test.go +++ b/idk/cmd/molecula-consumer-sql/main_test.go @@ -4,9 +4,9 @@ import ( "reflect" "testing" + "github.com/featurebasedb/featurebase/v3/idk/sql" "github.com/jaffee/commandeer" "github.com/jaffee/commandeer/pflag" - "github.com/featurebasedb/featurebase/v3/idk/sql" pflag13 "github.com/spf13/pflag" ) diff --git a/idk/datagen/cmd.go b/idk/datagen/cmd.go index e8e66ac8f..6a18b5a96 100644 --- a/idk/datagen/cmd.go +++ b/idk/datagen/cmd.go @@ -11,11 +11,11 @@ import ( "strings" "sync" - "github.com/glycerine/vprint" pilosaclient "github.com/featurebasedb/featurebase/v3/client" "github.com/featurebasedb/featurebase/v3/dax" "github.com/featurebasedb/featurebase/v3/idk" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/glycerine/vprint" "github.com/pkg/errors" "github.com/featurebasedb/featurebase/v3/idk/common" diff --git a/idk/ingest.go b/idk/ingest.go index ab4a9b640..e35405583 100644 --- a/idk/ingest.go +++ b/idk/ingest.go @@ -23,7 +23,6 @@ import ( "syscall" "time" - "github.com/felixge/fgprof" pilosacore "github.com/featurebasedb/featurebase/v3" pilosagrpc "github.com/featurebasedb/featurebase/v3/api/client" pilosabatch "github.com/featurebasedb/featurebase/v3/batch" @@ -35,6 +34,7 @@ import ( "github.com/featurebasedb/featurebase/v3/logger" "github.com/featurebasedb/featurebase/v3/pql" proto "github.com/featurebasedb/featurebase/v3/proto" + "github.com/felixge/fgprof" "github.com/pkg/errors" prom "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" diff --git a/idk/ingest_test.go b/idk/ingest_test.go index 64aab66e2..63f949b40 100644 --- a/idk/ingest_test.go +++ b/idk/ingest_test.go @@ -14,17 +14,17 @@ import ( "testing" "time" - "github.com/featurebasedb/featurebase/v3/authn" - pilosaclient "github.com/featurebasedb/featurebase/v3/client" - "github.com/featurebasedb/featurebase/v3/idk/idktest" - "github.com/featurebasedb/featurebase/v3/logger" - "github.com/golang-jwt/jwt" pilosa "github.com/featurebasedb/featurebase/v3" + "github.com/featurebasedb/featurebase/v3/authn" batch "github.com/featurebasedb/featurebase/v3/batch" + pilosaclient "github.com/featurebasedb/featurebase/v3/client" "github.com/featurebasedb/featurebase/v3/dax" mdsclient "github.com/featurebasedb/featurebase/v3/dax/mds/client" + "github.com/featurebasedb/featurebase/v3/idk/idktest" "github.com/featurebasedb/featurebase/v3/idk/mds" + "github.com/featurebasedb/featurebase/v3/logger" "github.com/featurebasedb/featurebase/v3/pql" + "github.com/golang-jwt/jwt" "github.com/pkg/errors" "github.com/stretchr/testify/assert" ) diff --git a/idk/kafka/cmd_delete_test.go b/idk/kafka/cmd_delete_test.go index f2512addf..b7daf517a 100644 --- a/idk/kafka/cmd_delete_test.go +++ b/idk/kafka/cmd_delete_test.go @@ -13,10 +13,10 @@ import ( "time" confluent "github.com/confluentinc/confluent-kafka-go/kafka" - "github.com/jaffee/commandeer/pflag" pilosaclient "github.com/featurebasedb/featurebase/v3/client" "github.com/featurebasedb/featurebase/v3/idk" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/jaffee/commandeer/pflag" "github.com/pkg/errors" ) diff --git a/idk/kafka/putsource.go b/idk/kafka/putsource.go index 43e38d381..703d096e4 100644 --- a/idk/kafka/putsource.go +++ b/idk/kafka/putsource.go @@ -15,13 +15,13 @@ import ( "time" confluent "github.com/confluentinc/confluent-kafka-go/kafka" - "github.com/go-avro/avro" - liavro "github.com/linkedin/goavro/v2" "github.com/featurebasedb/featurebase/v3/idk" "github.com/featurebasedb/featurebase/v3/idk/common" "github.com/featurebasedb/featurebase/v3/idk/kafka/csrc" "github.com/featurebasedb/featurebase/v3/logger" "github.com/featurebasedb/featurebase/v3/pql" + "github.com/go-avro/avro" + liavro "github.com/linkedin/goavro/v2" "github.com/pkg/errors" "golang.org/x/sync/errgroup" ) diff --git a/idk/kafka/putsource_test.go b/idk/kafka/putsource_test.go index 305fd7822..555a4410a 100644 --- a/idk/kafka/putsource_test.go +++ b/idk/kafka/putsource_test.go @@ -5,8 +5,8 @@ import ( "strings" "testing" - "github.com/go-avro/avro" "github.com/featurebasedb/featurebase/v3/idk" + "github.com/go-avro/avro" ) func TestIdkSchemaToAvroRecordSchema(t *testing.T) { diff --git a/internal/clustertests/cluster_test.go b/internal/clustertests/cluster_test.go index 1a2e2e975..53dd55ebd 100644 --- a/internal/clustertests/cluster_test.go +++ b/internal/clustertests/cluster_test.go @@ -14,12 +14,12 @@ import ( "testing" "time" - "github.com/golang-jwt/jwt" pilosa "github.com/featurebasedb/featurebase/v3" "github.com/featurebasedb/featurebase/v3/authn" "github.com/featurebasedb/featurebase/v3/ctl" "github.com/featurebasedb/featurebase/v3/disco" "github.com/featurebasedb/featurebase/v3/logger" + "github.com/golang-jwt/jwt" "github.com/pkg/errors" ) diff --git a/internal_client.go b/internal_client.go index 5ae930660..21ba3fba3 100644 --- a/internal_client.go +++ b/internal_client.go @@ -20,13 +20,13 @@ import ( fbcontext "github.com/featurebasedb/featurebase/v3/context" - "github.com/hashicorp/go-retryablehttp" "github.com/featurebasedb/featurebase/v3/authn" "github.com/featurebasedb/featurebase/v3/dax" "github.com/featurebasedb/featurebase/v3/disco" "github.com/featurebasedb/featurebase/v3/logger" pnet "github.com/featurebasedb/featurebase/v3/net" "github.com/featurebasedb/featurebase/v3/tracing" + "github.com/hashicorp/go-retryablehttp" "github.com/pkg/errors" "golang.org/x/oauth2" ) diff --git a/iterator.go b/iterator.go index 1b02d74e9..d8cc9b7a2 100644 --- a/iterator.go +++ b/iterator.go @@ -4,7 +4,6 @@ package pilosa import ( "fmt" - ) // iterator is an interface for looping over row/column pairs. diff --git a/prometheus/prometheus_test.go b/prometheus/prometheus_test.go index 3e60c4af5..1449c1a8f 100644 --- a/prometheus/prometheus_test.go +++ b/prometheus/prometheus_test.go @@ -5,7 +5,6 @@ package prometheus_test import ( "testing" - "github.com/featurebasedb/featurebase/v3/test" "github.com/prometheus/client_golang/prometheus" io_prometheus_client "github.com/prometheus/client_model/go" diff --git a/proto/vdsm/vdsm.pb.go b/proto/vdsm/vdsm.pb.go index b99cc5ecc..edeb0d3f1 100644 --- a/proto/vdsm/vdsm.pb.go +++ b/proto/vdsm/vdsm.pb.go @@ -6,8 +6,8 @@ package vdsm import ( context "context" fmt "fmt" - proto "github.com/golang/protobuf/proto" proto1 "github.com/featurebasedb/featurebase/v3/proto" + proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/roaring/roaring.go b/roaring/roaring.go index 76e5e734a..be2b06522 100644 --- a/roaring/roaring.go +++ b/roaring/roaring.go @@ -4517,7 +4517,7 @@ func intersectionCountArrayArray(a, b *Container) (n int32) { na, nb := len(ca), len(cb) if na > nb { ca, cb = cb, ca - na, nb = nb, na // nolint: staticcheck, ineffassign + na, nb = nb, na //nolint: staticcheck, ineffassign } j := 0 for _, va := range ca { @@ -4619,7 +4619,7 @@ func intersectionCallbackArrayArray(a, b *Container, fn func(uint16)) { na, nb := len(ca), len(cb) if na > nb { ca, cb = cb, ca - na, nb = nb, na // nolint: staticcheck, ineffassign + na, nb = nb, na //nolint: staticcheck, ineffassign } if (na << 2) < nb { for _, va := range ca { diff --git a/server.go b/server.go index 1a02fc5d1..34c759b04 100644 --- a/server.go +++ b/server.go @@ -19,17 +19,17 @@ import ( uuid "github.com/satori/go.uuid" daxstorage "github.com/featurebasedb/featurebase/v3/dax/storage" - "github.com/featurebasedb/featurebase/v3/disco" - "github.com/featurebasedb/featurebase/v3/logger" - pnet "github.com/featurebasedb/featurebase/v3/net" - rbfcfg "github.com/featurebasedb/featurebase/v3/rbf/cfg" - "github.com/featurebasedb/featurebase/v3/roaring" - "github.com/featurebasedb/featurebase/v3/sql3" - "github.com/featurebasedb/featurebase/v3/sql3/parser" - planner_types "github.com/featurebasedb/featurebase/v3/sql3/planner/types" - "github.com/featurebasedb/featurebase/v3/storage" - "github.com/pkg/errors" - "golang.org/x/sync/errgroup" + "github.com/featurebasedb/featurebase/v3/disco" + "github.com/featurebasedb/featurebase/v3/logger" + pnet "github.com/featurebasedb/featurebase/v3/net" + rbfcfg "github.com/featurebasedb/featurebase/v3/rbf/cfg" + "github.com/featurebasedb/featurebase/v3/roaring" + "github.com/featurebasedb/featurebase/v3/sql3" + "github.com/featurebasedb/featurebase/v3/sql3/parser" + planner_types "github.com/featurebasedb/featurebase/v3/sql3/planner/types" + "github.com/featurebasedb/featurebase/v3/storage" + "github.com/pkg/errors" + "golang.org/x/sync/errgroup" _ "github.com/lib/pq" ) diff --git a/server/server.go b/server/server.go index 1af669555..b72eee2e9 100644 --- a/server/server.go +++ b/server/server.go @@ -27,27 +27,27 @@ import ( "time" pilosa "github.com/featurebasedb/featurebase/v3" - "github.com/featurebasedb/featurebase/v3/authn" - "github.com/featurebasedb/featurebase/v3/authz" - "github.com/featurebasedb/featurebase/v3/dax" - "github.com/featurebasedb/featurebase/v3/dax/computer" - "github.com/featurebasedb/featurebase/v3/dax/storage" - "github.com/featurebasedb/featurebase/v3/disco" - "github.com/featurebasedb/featurebase/v3/encoding/proto" - petcd "github.com/featurebasedb/featurebase/v3/etcd" - "github.com/featurebasedb/featurebase/v3/gcnotify" - "github.com/featurebasedb/featurebase/v3/gopsutil" - "github.com/featurebasedb/featurebase/v3/logger" - pnet "github.com/featurebasedb/featurebase/v3/net" - "github.com/featurebasedb/featurebase/v3/sql3" - "github.com/featurebasedb/featurebase/v3/sql3/planner" - "github.com/featurebasedb/featurebase/v3/statik" - "github.com/featurebasedb/featurebase/v3/systemlayer" - "github.com/featurebasedb/featurebase/v3/syswrap" - "github.com/featurebasedb/featurebase/v3/testhook" - "github.com/pelletier/go-toml" - "github.com/pkg/errors" - "golang.org/x/sync/errgroup" + "github.com/featurebasedb/featurebase/v3/authn" + "github.com/featurebasedb/featurebase/v3/authz" + "github.com/featurebasedb/featurebase/v3/dax" + "github.com/featurebasedb/featurebase/v3/dax/computer" + "github.com/featurebasedb/featurebase/v3/dax/storage" + "github.com/featurebasedb/featurebase/v3/disco" + "github.com/featurebasedb/featurebase/v3/encoding/proto" + petcd "github.com/featurebasedb/featurebase/v3/etcd" + "github.com/featurebasedb/featurebase/v3/gcnotify" + "github.com/featurebasedb/featurebase/v3/gopsutil" + "github.com/featurebasedb/featurebase/v3/logger" + pnet "github.com/featurebasedb/featurebase/v3/net" + "github.com/featurebasedb/featurebase/v3/sql3" + "github.com/featurebasedb/featurebase/v3/sql3/planner" + "github.com/featurebasedb/featurebase/v3/statik" + "github.com/featurebasedb/featurebase/v3/systemlayer" + "github.com/featurebasedb/featurebase/v3/syswrap" + "github.com/featurebasedb/featurebase/v3/testhook" + "github.com/pelletier/go-toml" + "github.com/pkg/errors" + "golang.org/x/sync/errgroup" ) type loggerLogger interface { diff --git a/sql3/planner/compilebulkinsert.go b/sql3/planner/compilebulkinsert.go index ce80d024b..a72cfdf99 100644 --- a/sql3/planner/compilebulkinsert.go +++ b/sql3/planner/compilebulkinsert.go @@ -15,9 +15,6 @@ import ( "github.com/featurebasedb/featurebase/v3/sql3/parser" "github.com/featurebasedb/featurebase/v3/sql3/planner/types" goerrors "github.com/pkg/errors" - - - ) // compileBulkInsertStatement compiles a BULK INSERT statement into a diff --git a/sql3/planner/opdistinct.go b/sql3/planner/opdistinct.go index e3715ac61..a7d343a44 100644 --- a/sql3/planner/opdistinct.go +++ b/sql3/planner/opdistinct.go @@ -8,8 +8,8 @@ import ( "fmt" "github.com/featurebasedb/featurebase/v3/bufferpool" - "github.com/featurebasedb/featurebase/v3/extendiblehash" - "github.com/featurebasedb/featurebase/v3/sql3" + "github.com/featurebasedb/featurebase/v3/extendiblehash" + "github.com/featurebasedb/featurebase/v3/sql3" "github.com/featurebasedb/featurebase/v3/sql3/planner/types" ) diff --git a/sql3/sql_complex_test.go b/sql3/sql_complex_test.go index d780314ba..03ca4700b 100644 --- a/sql3/sql_complex_test.go +++ b/sql3/sql_complex_test.go @@ -11,14 +11,14 @@ import ( "testing" "time" - "github.com/google/go-cmp/cmp" pilosa "github.com/featurebasedb/featurebase/v3" "github.com/featurebasedb/featurebase/v3/dax" "github.com/featurebasedb/featurebase/v3/pql" sql_test "github.com/featurebasedb/featurebase/v3/sql3/test" "github.com/featurebasedb/featurebase/v3/test" + "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/assert" - ) +) func TestPlanner_Misc(t *testing.T) { d, err := pql.ParseDecimal("12.345678") diff --git a/wireprotocol/wireprimitives_test.go b/wireprotocol/wireprimitives_test.go index 79f7a2fe2..7d5534f25 100644 --- a/wireprotocol/wireprimitives_test.go +++ b/wireprotocol/wireprimitives_test.go @@ -5,11 +5,11 @@ import ( "testing" "time" - "github.com/google/go-cmp/cmp" "github.com/featurebasedb/featurebase/v3/pql" "github.com/featurebasedb/featurebase/v3/sql3/parser" "github.com/featurebasedb/featurebase/v3/sql3/planner/types" "github.com/featurebasedb/featurebase/v3/wireprotocol" + "github.com/google/go-cmp/cmp" ) func TestWireProtocol_Schema(t *testing.T) {