Как разрешить фильтр в Кассандре с Java Dasastax - PullRequest
0 голосов
/ 16 июня 2019
I created a table and two indexes on it i am not able to do filter query from my spring application 

сначала я создал таблицу

CREATE TABLE keyspace.favourite_setting (
id uuid,
user_name text,
filter_name text,
columns LIST<FROZEN<columns_def>>,
filters text,
PRIMARY KEY (id)

);

секунду я добавил два индекса

CREATE INDEX IF NOT EXISTS user_name_index ON keyspace.favourite_setting (user_name)
CREATE INDEX IF NOT EXISTS filter_name_index ON keyspace.favourite_setting (filter_name);

затем я пытаюсь отфильтровать ошибкуВы должны разрешить фильтр, хотя я уже это делаю ...

Мой аксессуар

@Accessor
 public interface FavouriteSettingAccessor {


@Query("select * from favourite_setting where user_name =:userName allow filtering  " )
Result<FavouriteSetting> getAllByUserName(@Param("userName") String userName );

      }

Мой сервис Impl

@Override
public List<FavouriteSetting> getAllFilterNames(String userName) throws  Exception {

    session = cassandraFactory.getDataSource();


    favouriteSettingAccessor =
            new MappingManager(session).createAccessor(FavouriteSettingAccessor.class);


    return favouriteSettingAccessor.getAllByUserName(userName).all();
}

Моя любимая модель настроек

@Table(keyspace = "keyspace", name = "favourite_setting")
public class FavouriteSetting {

@PartitionKey
@Column(name = "id")
private UUID id;

@Column(name = "user_name")
private String userName;

@Column(name = "filter_name")
private String filterName;

@Column(name = "columns")
private List<ColumnsDef> columns;

@Column(name = "filters")
private String filters;

 public FavouriteSetting(UUID id, String userName, String filterName, 
 List<ColumnsDef> columns, String filters) {
    this.id = id;
    this.userName = userName;
    this.filterName = filterName;
    this.columns = columns;
    this.filters = filters;
}

public FavouriteSetting() {
}

public UUID getId() {
    return id;
}

public void setId(UUID id) {
    this.id = id;
}

public String getFilterName() {
    return filterName;
}

public void setFilterName(String filterName) {
    this.filterName = filterName;
}

public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public List<ColumnsDef> getColumns() {
    return columns;
}

public void setColumns(List<ColumnsDef> columns) {
    this.columns = columns;
}

public String getFilters() {
    return filters;
}

public void setFilters(String filters) {
    this.filters = filters;
}

}

Невозможно выполнить этот запрос, так как он может включать фильтрацию данных и, следовательно, может иметь непредсказуемую производительность.Если вы хотите выполнить этот запрос, несмотря на непредсказуемость производительности, используйте ALLOW FILTERING

Ответы [ 2 ]

1 голос
/ 16 июня 2019

для запроса

@Query("select * from favourite_setting where user_name =:userName ... " )

userName не является частью первичного ключа, вы можете установить его как ключ кластеризации. Для получения дополнительной информации вы можете посмотреть здесь или здесь .

Обратите внимание, что для добавления ключа кластеризации не существует оператора alter, вам потребуется пересоздать таблицу с:

CREATE TABLE keyspace.favourite_setting (
id uuid,
user_name text,
filter_name text,
columns LIST<FROZEN<columns_def>>,
filters text,
PRIMARY KEY (id, username)

Индекс, созданный для столбца имени пользователя, считается одним из антипаттернов для индексов, поскольку ожидается, что он будет уникальным (и, следовательно, он будет иметь большую мощность); Вы можете найти больше информации о том, почему это проблема здесь

allow filtering никогда не должен использоваться, как объяснено здесь you should resist the urge to just add ALLOW FILTERING to it. You should think about your data, your model and what you are trying to do.

0 голосов
/ 16 июня 2019

Это работает сейчас, добавив имя_пользователя в качестве ключа кластера и ДОБАВЬТЕ до конца запроса РАЗРЕШИТЬ ФИЛЬТРАЦИЮ .. Спасибо :)

...