Skip to content

Commit

Permalink
Merge pull request #1277 from Raizlabs/develop
Browse files Browse the repository at this point in the history
4.0.0
  • Loading branch information
agrosner authored May 11, 2017
2 parents f4d7b61 + c0aee93 commit 9e30167
Show file tree
Hide file tree
Showing 125 changed files with 2,289 additions and 5,775 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "usage2"]
path = usage2
url = https://git.gitbook.com/agrosner/dbflow.git
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ DBFlow is built from a collection of the best features of many database librarie
Changes exist in the [releases tab](https://github.com/Raizlabs/DBFlow/releases).

# Usage Docs
For more detailed usage, check out it out [here](/usage2/Intro.md)
For more detailed usage, check out it out [here](https://agrosner.gitbooks.io/dbflow/content/)

# Including in your project

Expand All @@ -41,7 +41,7 @@ Add the library to the project-level build.gradle, using the apt plugin to enabl

```groovy
def dbflow_version = "4.0.0-beta7"
def dbflow_version = "4.0.0"
// or dbflow_version = "develop-SNAPSHOT" for grabbing latest dependency in your project on the develop branch
// or 10-digit short-hash of a specific commit. (Useful for bugs fixed in develop, but not in a release yet)
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
buildscript {
ext.kotlin_version = '1.1.1'
ext.kotlin_version = '1.1.2'
repositories {
jcenter()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,13 @@
*/
boolean stubbedRelationship() default false;

/**
* @return If true, during a transaction, FK constraints are not violated immediately until the resulting transaction commits.
* This is useful for out of order foreign key operations.
* @see <a href="http://www.sqlite.org/foreignkeys.html#fk_deferred">Deferred Foreign Key Constraints</a>
*/
boolean deferred() default false;

/**
* @return an optional table class that this reference points to. It's only used if the field
* is NOT a Model class.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,10 @@ enum Method {
* a setter for it.
*/
boolean isVariablePrivate() default false;

/**
* @return If true, the code generated for this relationship done as efficiently as possible.
* It will not work on nested relationships, caching, and other code that requires overriding of BaseModel or Model operations.
*/
boolean efficientMethods() default true;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.raizlabs.android.dbflow.converter;

/**
* Description: Converts a {@link Character} into a {@link String} for database storage.
*/
public class CharConverter extends TypeConverter<String, Character> {

@Override
public String getDBValue(Character model) {
return model != null ? new String(new char[]{model}) : null;
}

@Override
public Character getModelValue(String data) {
return data != null ? data.charAt(0) : null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import com.raizlabs.android.dbflow.sql.language.IConditional
import com.raizlabs.android.dbflow.sql.language.Operator
import com.raizlabs.android.dbflow.sql.language.Operator.Between
import com.raizlabs.android.dbflow.sql.language.property.Property
import com.raizlabs.android.dbflow.structure.Model

/**
* Description: Provides property methods in via infix functions.
Expand Down Expand Up @@ -93,36 +92,28 @@ infix fun IConditional.notIn(values: Array<IConditional>): Operator.In<*> {
}
}

infix fun IConditional.`is`(baseModelQueriable: BaseModelQueriable<Model>): Operator<*> = this.`is`(baseModelQueriable)
infix fun <T> IConditional.`is`(baseModelQueriable: BaseModelQueriable<T>): Operator<*> = this.`is`(baseModelQueriable)

infix fun IConditional.eq(baseModelQueriable: BaseModelQueriable<Model>): Operator<*> = this.eq(baseModelQueriable)
infix fun <T> IConditional.eq(baseModelQueriable: BaseModelQueriable<T>): Operator<*> = this.eq(baseModelQueriable)

infix fun IConditional.isNot(baseModelQueriable: BaseModelQueriable<Model>): Operator<*> = this.isNot(baseModelQueriable)
infix fun <T> IConditional.isNot(baseModelQueriable: BaseModelQueriable<T>): Operator<*> = this.isNot(baseModelQueriable)
infix fun <T> IConditional.notEq(baseModelQueriable: BaseModelQueriable<T>): Operator<*> = this.notEq(baseModelQueriable)
infix fun <T> IConditional.like(baseModelQueriable: BaseModelQueriable<T>): Operator<*> = this.like(baseModelQueriable)
infix fun <T> IConditional.glob(baseModelQueriable: BaseModelQueriable<T>): Operator<*> = this.glob(baseModelQueriable)
infix fun <T> IConditional.greaterThan(baseModelQueriable: BaseModelQueriable<T>): Operator<*> = this.greaterThan(baseModelQueriable)
infix fun <T> IConditional.greaterThanOrEq(baseModelQueriable: BaseModelQueriable<T>): Operator<*> = this.greaterThanOrEq(baseModelQueriable)
infix fun <T> IConditional.lessThan(baseModelQueriable: BaseModelQueriable<T>): Operator<*> = this.lessThan(baseModelQueriable)
infix fun <T> IConditional.lessThanOrEq(baseModelQueriable: BaseModelQueriable<T>): Operator<*> = this.lessThanOrEq(baseModelQueriable)
infix fun <T> IConditional.between(baseModelQueriable: BaseModelQueriable<T>): Between<*> = this.between(baseModelQueriable)

infix fun IConditional.notEq(baseModelQueriable: BaseModelQueriable<Model>): Operator<*> = this.notEq(baseModelQueriable)

infix fun IConditional.like(baseModelQueriable: BaseModelQueriable<Model>): Operator<*> = this.like(baseModelQueriable)

infix fun IConditional.glob(baseModelQueriable: BaseModelQueriable<Model>): Operator<*> = this.glob(baseModelQueriable)

infix fun IConditional.greaterThan(baseModelQueriable: BaseModelQueriable<Model>): Operator<*> = this.greaterThan(baseModelQueriable)

infix fun IConditional.greaterThanOrEq(baseModelQueriable: BaseModelQueriable<Model>): Operator<*> = this.greaterThanOrEq(baseModelQueriable)

infix fun IConditional.lessThan(baseModelQueriable: BaseModelQueriable<Model>): Operator<*> = this.lessThan(baseModelQueriable)

infix fun IConditional.lessThanOrEq(baseModelQueriable: BaseModelQueriable<Model>): Operator<*> = this.lessThanOrEq(baseModelQueriable)

infix fun IConditional.between(baseModelQueriable: BaseModelQueriable<Model>): Between<*> = this.between(baseModelQueriable)

infix fun IConditional.`in`(values: Array<BaseModelQueriable<Model>>): Operator.In<*> {
infix fun <T> IConditional.`in`(values: Array<BaseModelQueriable<T>>): Operator.In<*> {
return when (values.size) {
1 -> `in`(values[0])
else -> this.`in`(values[0], *values.sliceArray(IntRange(1, values.size)))
}
}

infix fun IConditional.notIn(values: Array<BaseModelQueriable<Model>>): Operator.In<*> {
infix fun <T> IConditional.notIn(values: Array<BaseModelQueriable<T>>): Operator.In<*> {
return when (values.size) {
1 -> notIn(values[0])
else -> this.notIn(values[0], *values.sliceArray(IntRange(1, values.size)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import com.raizlabs.android.dbflow.sql.queriable.AsyncQuery
import com.raizlabs.android.dbflow.sql.queriable.ModelQueriable
import com.raizlabs.android.dbflow.sql.queriable.Queriable
import com.raizlabs.android.dbflow.structure.AsyncModel
import com.raizlabs.android.dbflow.structure.BaseModel
import com.raizlabs.android.dbflow.structure.Model
import com.raizlabs.android.dbflow.structure.database.transaction.QueryTransaction
import kotlin.reflect.KClass

Expand Down Expand Up @@ -100,18 +100,18 @@ inline val <T : Any> ModelQueriable<T>.async
get() = async()

infix inline fun <T : Any> AsyncQuery<T>.list(crossinline callback: (QueryTransaction<*>, MutableList<T>) -> Unit)
= queryListResultCallback { queryTransaction, mutableList -> callback(queryTransaction, mutableList) }
.execute()
= queryListResultCallback { queryTransaction, mutableList -> callback(queryTransaction, mutableList) }
.execute()

infix inline fun <T : Any> AsyncQuery<T>.result(crossinline callback: (QueryTransaction<*>, T?) -> Unit)
= querySingleResultCallback { queryTransaction, model -> callback(queryTransaction, model) }
.execute()
= querySingleResultCallback { queryTransaction, model -> callback(queryTransaction, model) }
.execute()

infix inline fun <T : Any> AsyncQuery<T>.cursorResult(crossinline callback: (QueryTransaction<*>, CursorResult<T>) -> Unit)
= queryResultCallback { queryTransaction, cursorResult -> callback(queryTransaction, cursorResult) }
.execute()
= queryResultCallback { queryTransaction, cursorResult -> callback(queryTransaction, cursorResult) }
.execute()

inline val BaseModel.async: AsyncModel<BaseModel>
inline val Model.async
get() = async()

infix inline fun <T : Any> AsyncModel<T>.insert(crossinline listener: (T) -> Unit) = withListener { listener(it) }.insert()
Expand Down Expand Up @@ -163,7 +163,7 @@ infix fun <T : Any> Update<T>.set(sqlOperator: SQLOperator) = set(sqlOperator)
inline fun <reified T : Any> delete() = SQLite.delete(T::class.java)

inline fun <reified T : Any> delete(deleteClause: From<T>.() -> BaseModelQueriable<T>)
= deleteClause(SQLite.delete(T::class.java))
= deleteClause(SQLite.delete(T::class.java))

// insert methods

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ object ClassNames {
val URI = ClassName.get("android.net", "Uri")
val URI_MATCHER = ClassName.get("android.content", "UriMatcher")
val CURSOR = ClassName.get("android.database", "Cursor")
val FLOW_CURSOR = ClassName.get(DATABASE, "FlowCursor")
val DATABASE_UTILS = ClassName.get("android.database", "DatabaseUtils")
val CONTENT_VALUES = ClassName.get("android.content", "ContentValues")
val CONTENT_URIS = ClassName.get("android.content", "ContentUris")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,34 +1,15 @@
package com.raizlabs.android.dbflow.processor

import com.google.common.collect.Sets
import com.raizlabs.android.dbflow.annotation.Database
import com.raizlabs.android.dbflow.annotation.ManyToMany
import com.raizlabs.android.dbflow.annotation.Migration
import com.raizlabs.android.dbflow.annotation.ModelView
import com.raizlabs.android.dbflow.annotation.MultipleManyToMany
import com.raizlabs.android.dbflow.annotation.QueryModel
import com.raizlabs.android.dbflow.annotation.Table
import com.raizlabs.android.dbflow.annotation.*
import com.raizlabs.android.dbflow.annotation.TypeConverter
import com.raizlabs.android.dbflow.annotation.provider.ContentProvider
import com.raizlabs.android.dbflow.annotation.provider.TableEndpoint
import com.raizlabs.android.dbflow.converter.BigDecimalConverter
import com.raizlabs.android.dbflow.converter.BooleanConverter
import com.raizlabs.android.dbflow.converter.CalendarConverter
import com.raizlabs.android.dbflow.converter.DateConverter
import com.raizlabs.android.dbflow.converter.SqlDateConverter
import com.raizlabs.android.dbflow.converter.UUIDConverter
import com.raizlabs.android.dbflow.processor.definition.ContentProviderDefinition
import com.raizlabs.android.dbflow.processor.definition.DatabaseDefinition
import com.raizlabs.android.dbflow.processor.definition.ManyToManyDefinition
import com.raizlabs.android.dbflow.processor.definition.MigrationDefinition
import com.raizlabs.android.dbflow.processor.definition.ModelViewDefinition
import com.raizlabs.android.dbflow.processor.definition.QueryModelDefinition
import com.raizlabs.android.dbflow.processor.definition.TableDefinition
import com.raizlabs.android.dbflow.processor.definition.TableEndpointDefinition
import com.raizlabs.android.dbflow.processor.definition.TypeConverterDefinition
import com.raizlabs.android.dbflow.converter.*
import com.raizlabs.android.dbflow.processor.definition.*
import com.raizlabs.android.dbflow.processor.utils.annotation
import javax.annotation.processing.RoundEnvironment
import javax.lang.model.element.Element
import javax.lang.model.element.Modifier
import javax.lang.model.element.PackageElement
import javax.lang.model.element.TypeElement

Expand Down Expand Up @@ -125,14 +106,14 @@ class TableHandler : BaseContainerHandler<Table>() {
val tableDefinition = TableDefinition(processorManager, element)
processorManager.addTableDefinition(tableDefinition)

if (element.getAnnotation(ManyToMany::class.java) != null) {
if (element.annotation<ManyToMany>() != null) {
val manyToManyDefinition = ManyToManyDefinition(element, processorManager)
processorManager.addManyToManyDefinition(manyToManyDefinition)
}

if (element.getAnnotation(MultipleManyToMany::class.java) != null) {
val multipleManyToMany = element.getAnnotation(MultipleManyToMany::class.java)
multipleManyToMany.value.forEach {
if (element.annotation<MultipleManyToMany>() != null) {
val multipleManyToMany = element.annotation<MultipleManyToMany>()
multipleManyToMany?.value?.forEach {
processorManager.addManyToManyDefinition(ManyToManyDefinition(element, processorManager, it))
}
}
Expand All @@ -154,7 +135,7 @@ class TypeConverterHandler : BaseContainerHandler<TypeConverter>() {

override fun onProcessElement(processorManager: ProcessorManager, element: Element) {
if (element is TypeElement) {
val className = ProcessorUtils.fromTypeMirror(element.asType(), processorManager)
val className = com.raizlabs.android.dbflow.processor.utils.fromTypeMirror(element.asType(), processorManager)
val converterDefinition = className?.let { TypeConverterDefinition(it, element.asType(), processorManager, element) }
converterDefinition?.let {
if (VALIDATOR.validate(processorManager, converterDefinition)) {
Expand All @@ -176,7 +157,8 @@ class TypeConverterHandler : BaseContainerHandler<TypeConverter>() {
private val DEFAULT_TYPE_CONVERTERS = arrayOf<Class<*>>(CalendarConverter::class.java,
BigDecimalConverter::class.java,
DateConverter::class.java, SqlDateConverter::class.java,
BooleanConverter::class.java, UUIDConverter::class.java)
BooleanConverter::class.java, UUIDConverter::class.java,
CharConverter::class.java)
}
}

Expand Down Expand Up @@ -232,7 +214,6 @@ class DatabaseHandler : BaseContainerHandler<Database>() {

companion object {
val TYPE_CONVERTER_MAP_FIELD_NAME = "typeConverters"
val METHOD_MODIFIERS: Set<Modifier> = Sets.newHashSet(Modifier.PUBLIC, Modifier.FINAL)
val MODEL_ADAPTER_MAP_FIELD_NAME = "modelAdapters"
val QUERY_MODEL_ADAPTER_MAP_FIELD_NAME = "queryModelAdapterMap"
val MIGRATION_FIELD_NAME = "migrationMap"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,23 +29,21 @@ class ProcessorManager internal constructor(val processingEnvironment: Processin
lateinit var manager: ProcessorManager
}

private val uniqueDatabases = Lists.newArrayList<TypeName>()
private val modelToDatabaseMap = Maps.newHashMap<TypeName, TypeName>()
val typeConverters = Maps.newLinkedHashMap<TypeName, TypeConverterDefinition>()
private val migrations = Maps.newHashMap<TypeName, MutableMap<Int, MutableList<MigrationDefinition>>>()
private val uniqueDatabases = arrayListOf<TypeName>()
private val modelToDatabaseMap = hashMapOf<TypeName, TypeName>()
val typeConverters = linkedMapOf<TypeName?, TypeConverterDefinition>()
private val migrations = hashMapOf<TypeName?, MutableMap<Int, MutableList<MigrationDefinition>>>()

private val databaseDefinitionMap = Maps.newHashMap<TypeName, DatabaseObjectHolder>()
private val handlers = ArrayList<BaseContainerHandler<*>>()
private val providerMap = Maps.newHashMap<TypeName, ContentProviderDefinition>()
private val databaseDefinitionMap = hashMapOf<TypeName?, DatabaseObjectHolder>()
private val handlers = mutableSetOf<BaseContainerHandler<*>>()
private val providerMap = hashMapOf<TypeName?, ContentProviderDefinition>()

init {
manager = this
}

fun addHandlers(vararg containerHandlers: BaseContainerHandler<*>) {
containerHandlers
.filterNot { handlers.contains(it) }
.forEach { handlers.add(it) }
containerHandlers.forEach { handlers.add(it) }
}

val messager: Messager = processingEnvironment.messager
Expand Down Expand Up @@ -179,14 +177,7 @@ class ProcessorManager internal constructor(val processingEnvironment: Processin
}
}

fun getMigrationsForDatabase(databaseName: TypeName): Map<Int, List<MigrationDefinition>> {
val migrationDefinitions = migrations[databaseName]
if (migrationDefinitions != null) {
return migrationDefinitions
} else {
return Maps.newHashMap<Int, List<MigrationDefinition>>()
}
}
fun getMigrationsForDatabase(databaseName: TypeName) = migrations[databaseName] ?: hashMapOf<Int, List<MigrationDefinition>>()

fun addContentProviderDefinition(contentProviderDefinition: ContentProviderDefinition) {
contentProviderDefinition.elementTypeName?.let {
Expand All @@ -210,11 +201,9 @@ class ProcessorManager internal constructor(val processingEnvironment: Processin
messager.printMessage(Diagnostic.Kind.ERROR, String.format("*==========*${callingClass ?: ""} :" + error?.trim() + "*==========*", *args))
var stackTraceElements = Thread.currentThread().stackTrace
if (stackTraceElements.size > 8) {
stackTraceElements = Arrays.copyOf(stackTraceElements, 8)
}
for (stackTrace in stackTraceElements) {
messager.printMessage(Diagnostic.Kind.ERROR, stackTrace.toString())
stackTraceElements = stackTraceElements.copyOf(8)
}
stackTraceElements.forEach { messager.printMessage(Diagnostic.Kind.ERROR, it.toString()) }
}

fun logError(error: String?, vararg args: Any?) = logError(callingClass = null, error = error, args = args)
Expand Down
Loading

0 comments on commit 9e30167

Please sign in to comment.