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

qlking.preprocessor.1.0.4.source-code.Q Maven / Gradle / Ivy

Go to download

SQLKing is an Android SQLite ORM powered an annotation preprocessor, tables are defined by Model classes and CRUD classes expose an expressive api for SQLite executing queries.

The newest version!
package com.memtrip.sqlking.gen;

import android.database.Cursor;
import android.content.ContentValues;
import com.memtrip.sqlking.common.SQLQuery;
import com.memtrip.sqlking.common.Resolver;

import java.util.List;
import java.util.ArrayList;

public class Q {

    public static class DefaultResolver implements Resolver {

        @Override
        public SQLQuery getSQLQuery(Class classDef) {
            <#assign isAssignableFrom><#list tables as table>
            } else if (classDef.isAssignableFrom(${table.getPackage()}.${table.getName()?cap_first}.class)) {
                return new ${table.getName()?cap_first}();
            
            }
${isAssignableFrom?remove_beginning("            } else ")} else {
                throw new IllegalStateException("Please ensure all SQL tables are annotated with @Table");
            }
        }
    }
<#list tables as table>
<#assign getColumnNames><#list table.getColumns() as column>"${column.getName()}",
<#assign unionInsertColumnNames><#list table.getColumns() as column>${column.getName()},
<#assign packagedTableName>${table.getPackage()}.${table.getName()?cap_first}
    public static class ${table.getName()?cap_first} implements SQLQuery {
        <#list table.getColumns() as column>
        public static final String ${formatConstant(column.getName())} = "${column.getName()}";
        

        @Override
        public String getTableName() {
            return "${table.getName()}";
        }

        @Override
        public String getTableInsertQuery() {
            return ${assembleCreateTable(table)}
        }

        @Override
        public String[] buildUnionInsertQuery(Object[] modelsToInsert) {
            List> chunks = new ArrayList<>();
            List models = new ArrayList<>();

            for (int i = 0; i < modelsToInsert.length; i++) {
                models.add(modelsToInsert[i]);

                if ((i+1) % 500 == 0) {
                    chunks.add(new ArrayList<>(models));
                    models.clear();
                }
            }

            if (models.size() > 0) {
                chunks.add(models);
            }

            String[] unionInsertQueries = new String[chunks.size()];
            for (int i = 0; i < chunks.size(); i++) {
                unionInsertQueries[i] = buildInsertQuery(chunks.get(i));
            }

            return unionInsertQueries;
        }

        private String buildInsertQuery(List models) {
            StringBuilder sb = new StringBuilder();

            sb.append("INSERT INTO ${table.getName()?cap_first} ");

            for (int i = 0; i < models.size(); i++) {
                ${packagedTableName} ${table.getName()?lower_case} = (${packagedTableName})models.get(i);

                if (i == 0){
                    sb.append("(${unionInsertColumnNames?remove_ending(",")}) ");
                    sb.append("SELECT ");
                    <#list table.getColumns() as column>
                    <#assign getter>${table.getName()?lower_case}.get${column.getName()?cap_first}()
                    sb.append("${getInsertValue(column.getType(),getter)} AS ${column.getName()}, ");
                    
                    sb.delete(sb.length()-2,sb.length());
                } else {
                    sb.append(" UNION ALL SELECT ");
                    <#list table.getColumns() as column>
                    <#assign getter>${table.getName()?lower_case}.get${column.getName()?cap_first}()
                    sb.append("${getInsertValue(column.getType(),getter)}, ");
                    
                    sb.delete(sb.length()-2,sb.length());
                }
            }

            return sb.toString();
        }

        private String assembleBlob(byte[] val) {
            if (val != null) {
                StringBuilder sb = new StringBuilder();

                for (byte b : val)
                    sb.append(String.format("%02X ", b));

                return sb.toString();
            } else {
                return "NULL";
            }
        }

        @Override
        public ${packagedTableName}[] retrieveSQLSelectResults(Cursor cursor) {
            ${packagedTableName}[] result = new ${packagedTableName}[cursor.getCount()];

            cursor.moveToFirst();
            for (int i = 0; !cursor.isAfterLast(); i++) {
                ${packagedTableName} ${table.getName()?lower_case} = new ${packagedTableName}();

                for (int x = 0; x < cursor.getColumnCount(); x++) {
                <#assign retrieveSQLSelectResults><#list table.getColumns() as column>
                    } else if (cursor.getColumnName(x).equals(${formatConstant(column.getName())})) {
                        ${table.getName()?lower_case}.set${column.getName()?cap_first}(${getCursorGetter(column.getType())});
                    
                    }
                    ${retrieveSQLSelectResults?remove_beginning("                    } else ")}
                }

                result[i] = ${table.getName()?lower_case};
                cursor.moveToNext();
            }

            cursor.close();

            return result;
        }

        @Override
        public String[] getColumnNames() {
            return new String[]{${getColumnNames?remove_ending(",")}};
        }

        @Override
        public ContentValues getContentValues(Object model) {
            ${packagedTableName} ${table.getName()?lower_case} = (${packagedTableName})model;

            ContentValues contentValues = new ContentValues();
            <#list table.getColumns() as column>
            contentValues.put(${formatConstant(column.getName())}, ${table.getName()?lower_case}.get${column.getName()?cap_first}());
            

            return contentValues;
        }
    }

}