/
vectordatabase.jl
67 lines (51 loc) · 2.04 KB
/
vectordatabase.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# This file is a part of SimilaritySearch.jl
#
# Wrapper for array-like containers
#
"""
struct VectorDatabase{V} <: AbstractDatabase
A wrapper for vector-like databases
"""
struct VectorDatabase{V} <: AbstractDatabase
vecs::V # abstract vector or something that looks like a vector
end
@inline Base.eltype(db::VectorDatabase) = eltype(db.vecs)
"""
VectorDatabase(vecs::T)
Creates a `VectorDatabase` from `vecs`. Please see [`AbstractDatabase`](@ref) for general usage.
"""
VectorDatabase(vecs::T) where {T<:AbstractVector} = VectorDatabase{T}(vecs)
"""
VectorDatabase(M::AbstractMatrix)
Creates a `VectorDatabase` from a matrix-like object. It will copy columns as objects of the new `VectorDatabase`.
Please see [`AbstractDatabase`](@ref) for general usage.
"""
VectorDatabase(M::T) where {T<:AbstractMatrix} = VectorDatabase([Vector(c) for c in eachcol(M)])
"""
VectorDatabase(D::AbstractDatabase)
Creates a `VectorDatabase` from an `AbstractDatabase`. It copies internal data.
Please see [`AbstractDatabase`](@ref) for general usage.
"""
VectorDatabase(D::AbstractDatabase) = VectorDatabase([Vector(c) for c in D])
"""
VectorDatabase(V::VectorDatabase)
Creates a `VectorDatabase` from another an `AbstractDatabase`. They will share their internal data.
Please see [`AbstractDatabase`](@ref) for general usage.
"""
VectorDatabase(V::VectorDatabase) = VectorDatabase(V.vecs)
"""
VectorDatabase(; type=Vector{Float32})
Creates an empty `VectorDatabase` where each object is of type `type`.
Please see [`AbstractDatabase`](@ref) for general usage.
"""
VectorDatabase(; type=Vector{Float32}) = VectorDatabase(type[])
Base.Base.@propagate_inbounds @inline Base.getindex(db::VectorDatabase, i::Integer) = db.vecs[i]
@inline Base.setindex!(db::VectorDatabase, value, i::Integer) = setindex!(db.vecs, value, i)
@inline Base.length(db::VectorDatabase) = length(db.vecs)
@inline push_item!(db::VectorDatabase, v) = (push!(db.vecs, v); db)
@inline function append_items!(db::VectorDatabase, B)
for b in B
push!(db.vecs, b)
end
db
end