SearchMetadataQuery buildSearchMetadataQuery()

in metacat-metadata-mysql/src/main/java/com/netflix/metacat/metadata/mysql/MysqlUserMetadataService.java [906:975]


        SearchMetadataQuery buildSearchMetadataQuery(@Nullable final Set<String> propertyNames,
                                                     @Nullable final String type,
                                                     @Nullable final String name,
                                                     @Nullable final String sortByStr,
                                                     @Nullable final String sortOrderStr,
                                                     @Nullable final Integer offset,
                                                     @Nullable final Integer limit) {
            String sortBy = null;
            if (StringUtils.isNotBlank(sortByStr)) {
                sortBy = sortByStr.trim().toLowerCase();
                if (!DEFINITION_METADATA_SORT_BY_COLUMNS.contains(sortBy)) {
                    throw new IllegalArgumentException(String.format("Invalid sortBy column %s", sortBy));
                }
            }

            String sortOrder = null;
            if (StringUtils.isNotBlank(sortOrderStr)) {
                sortOrder = sortOrderStr.trim().toUpperCase();
                if (!VALID_SORT_ORDER.contains(sortOrder)) {
                    throw new IllegalArgumentException("Invalid sort order. Expected ASC or DESC");
                }
            }

            if (type != null) {
                String typeRegex = null;
                switch (type) {
                    case "catalog":
                        typeRegex = "^[^/]*$";
                        break;
                    case "database":
                        typeRegex = "^[^/]*/[^/]*$";
                        break;
                    case "table":
                        typeRegex = "^[^/]*/[^/]*/[^/]*$";
                        break;
                    case "partition":
                        typeRegex = "^[^/]*/[^/]*/[^/]*/.*$";
                        break;
                    default:
                }
                if (typeRegex != null) {
                    this.searchQuery.append(" and name rlike ?");
                    this.searchParamList.add(new SqlParameterValue(Types.VARCHAR, typeRegex));
                }
            }
            if (propertyNames != null && !propertyNames.isEmpty()) {
                propertyNames.forEach(propertyName -> {
                    this.searchQuery.append(" and data like ?");
                    searchParamList.add(new SqlParameterValue(Types.VARCHAR, "%\"" + propertyName + "\":%"));
                });
            }
            if (!Strings.isNullOrEmpty(name)) {
                this.searchQuery.append(" and name like ?");
                this.searchParamList.add(new SqlParameterValue(Types.VARCHAR, name));
            }
            if (!Strings.isNullOrEmpty(sortBy)) {
                this.searchQuery.append(" order by ").append(sortBy);
                if (!Strings.isNullOrEmpty(sortOrder)) {
                    this.searchQuery.append(" ").append(sortOrder);
                }
            }
            if (limit != null) {
                this.searchQuery.append(" limit ");
                if (offset != null) {
                    this.searchQuery.append(offset).append(",");
                }
                this.searchQuery.append(limit);
            }
            return this;
        }