package io.crate.metadata.doc; import com.google.common.collect.ImmutableMap; import io.crate.metadata.*; import io.crate.types.DataType; import io.crate.types.DataTypes; import java.util.Map; import java.util.function.BiConsumer; public class DocSysColumns { public static class Names { public static final String ID = "_id"; public static final String VERSION = "_version"; public static final String SCORE = "_score"; public static final String UID = "_uid"; public static final String DOC = "_doc"; public static final String RAW = "_raw"; /** * Column that contains the lucene docId + a readerId. * See {@link io.crate.operation.projectors.fetch.FetchId} */ public static final String FETCHID = "_fetchid"; } public static final ColumnIdent ID = new ColumnIdent(Names.ID); public static final ColumnIdent VERSION = new ColumnIdent(Names.VERSION); public static final ColumnIdent SCORE = new ColumnIdent(Names.SCORE); public static final ColumnIdent UID = new ColumnIdent(Names.UID); public static final ColumnIdent DOC = new ColumnIdent(Names.DOC); public static final ColumnIdent RAW = new ColumnIdent(Names.RAW); /** * See {@link Names#FETCHID} */ public static final ColumnIdent FETCHID = new ColumnIdent(Names.FETCHID); public static final ImmutableMap<ColumnIdent, DataType> COLUMN_IDENTS = ImmutableMap.<ColumnIdent, DataType>builder() .put(ID, DataTypes.STRING) .put(VERSION, DataTypes.LONG) .put(SCORE, DataTypes.FLOAT) .put(UID, DataTypes.STRING) .put(DOC, DataTypes.OBJECT) .put(RAW, DataTypes.STRING) .put(FETCHID, DataTypes.LONG) .build(); private static final ImmutableMap<ColumnIdent, String> LUCENE_COLUMN_NAMES = ImmutableMap.<ColumnIdent, String>builder() .put(RAW, "_source") .put(ID, UID.name()) .build(); private static Reference newInfo(TableIdent table, ColumnIdent column, DataType dataType) { return new Reference(new ReferenceIdent(table, column), RowGranularity.DOC, dataType); } /** * Calls {@code consumer} for each sys column with a reference containing {@code tableIdent} */ public static void forTable(TableIdent tableIdent, BiConsumer<ColumnIdent, Reference> consumer) { for (Map.Entry<ColumnIdent, DataType> entry : COLUMN_IDENTS.entrySet()) { ColumnIdent columnIdent = entry.getKey(); consumer.accept(columnIdent, newInfo(tableIdent, columnIdent, entry.getValue())); } } public static Reference forTable(TableIdent table, ColumnIdent column) { return newInfo(table, column, COLUMN_IDENTS.get(column)); } public static String nameForLucene(ColumnIdent ident) { String name = LUCENE_COLUMN_NAMES.get(ident); if (name == null) { name = ident.name(); } return name; } }