All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sfm.datastax.DatastaxMapperFactory Maven / Gradle / Ivy

There is a newer version: 8.2.3
Show newest version
package org.sfm.datastax;

import com.datastax.driver.core.GettableByIndexData;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.exceptions.DriverException;
import org.sfm.datastax.impl.DatastaxMappingContextFactoryBuilder;
import org.sfm.datastax.impl.RowGetterFactory;
import org.sfm.datastax.impl.SettableDataSetterFactory;
import org.sfm.datastax.impl.mapping.DatastaxAliasProvider;
import org.sfm.jdbc.JdbcColumnKey;
import org.sfm.map.*;
import org.sfm.map.column.FieldMapperColumnDefinition;
import org.sfm.map.mapper.AbstractMapperFactory;
import org.sfm.map.mapper.ConstantTargetFieldMapperFactorImpl;
import org.sfm.map.mapper.DynamicSetRowMapper;
import org.sfm.map.mapper.FieldMapperColumnDefinitionProviderImpl;
import org.sfm.map.mapper.MapperKey;
import org.sfm.reflect.TypeReference;
import org.sfm.reflect.meta.ClassMeta;
import org.sfm.reflect.meta.JpaAliasProvider;
import org.sfm.utils.UnaryFactory;
import org.sfm.utils.UnaryFactoryWithException;

import java.lang.reflect.Type;

public class DatastaxMapperFactory extends AbstractMapperFactory, DatastaxMapperFactory> {

    static {
        DatastaxAliasProvider.registers();
    }

    private GetterFactory getterFactory = new RowGetterFactory(this);

    private DatastaxMapperFactory() {
        super(new FieldMapperColumnDefinitionProviderImpl(), FieldMapperColumnDefinition.identity());
    }

    private DatastaxMapperFactory(AbstractMapperFactory, ?> config) {
        super(config);
    }

    public static DatastaxMapperFactory newInstance() {
        return new DatastaxMapperFactory();
    }

    public static DatastaxMapperFactory newInstance(AbstractMapperFactory, ?> config) {
        return new DatastaxMapperFactory(config);
    }



    public  DatastaxMapperBuilder newBuilder(Class type) {
        return newBuilder((Type)type);
    }

    public  DatastaxMapperBuilder newBuilder(TypeReference type) {
        return newBuilder(type.getType());
    }

    public  DatastaxMapperBuilder newBuilder(Type type) {
        final ClassMeta classMeta = getClassMeta(type);
        return newBuilder(classMeta);
    }

    public  DatastaxMapperBuilder newBuilder(ClassMeta classMeta) {
        return new DatastaxMapperBuilder(classMeta,
                mapperConfig(),
                getterFactory,
                new DatastaxMappingContextFactoryBuilder());
    }

    public  SettableDataMapperBuilder newBuilderFrom(Type type) {
        ClassMeta classMeta = getClassMeta(type);
        MapperConfig> config = mapperConfig();
        return new SettableDataMapperBuilder(
                classMeta,
                config,
                ConstantTargetFieldMapperFactorImpl
                        .instance(new SettableDataSetterFactory(config, classMeta.getReflectionService())));
    }

    public  DatastaxBinder mapFrom(Class type) {
        return mapFrom((Type) type);
    }
    public  DatastaxBinder mapFrom(TypeReference type) {
        return mapFrom(type.getType());
    }
    public  DatastaxBinder mapFrom(Type type) {
        final ClassMeta classMeta = getClassMeta(type);
        return new DatastaxBinder(classMeta, mapperConfig());
    }

    public  DatastaxMapper mapTo(Class type) {
        return mapTo((Type) type);
    }
    public  DatastaxMapper mapTo(TypeReference type) {
        return mapTo(type.getType());
    }
    public  DatastaxMapper mapTo(Type type) {
        final ClassMeta classMeta = getClassMeta(type);
        return new DynamicDatastaxSetRowMapper(new MapperFactory(classMeta), new MapperKeyFromRowFactory(), new MapperKeyFromSet());
    }

    public  DatastaxCrudDSL crud(Class targetType, Class keyType) {
        return crud((Type)targetType, (Type)keyType);
    }
    public  DatastaxCrudDSL crud(Type targetType, Type keyType) {
        return new DatastaxCrudDSL(targetType, keyType, this);
    }

    private static class MapperKeyFromRowFactory implements UnaryFactoryWithException, DriverException> {
        @Override
        public MapperKey newInstance(Row row) throws DriverException {
            return DatastaxColumnKey.mapperKey(row.getColumnDefinitions());
        }
    }

    private static class MapperKeyFromSet implements UnaryFactoryWithException, DriverException> {
        @Override
        public MapperKey newInstance(ResultSet rows) throws DriverException {
            return DatastaxColumnKey.mapperKey(rows.getColumnDefinitions());
        }
    }

    private class MapperFactory implements UnaryFactory, SetRowMapper> {
        private final ClassMeta classMeta;

        public MapperFactory(ClassMeta classMeta) {
            this.classMeta = classMeta;
        }

        @Override
        public SetRowMapper newInstance(MapperKey datastaxColumnKeyMapperKey) {
            DatastaxMapperBuilder builder = newBuilder(classMeta);

            for(DatastaxColumnKey key : datastaxColumnKeyMapperKey.getColumns()) {
                builder.addMapping(key);
            }

            return builder.mapper();
        }
    }

    private static class DynamicDatastaxSetRowMapper
            extends DynamicSetRowMapper
            implements DatastaxMapper {

        public DynamicDatastaxSetRowMapper(
                UnaryFactory, SetRowMapper> mapperFactory,
                UnaryFactoryWithException, DriverException> mapperKeyFromRow,
                UnaryFactoryWithException, DriverException> mapperKeyFromSet) {
            super(mapperFactory, mapperKeyFromRow, mapperKeyFromSet);        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy