hyrax-v2_graph_indexer 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +10 -0
- data/LICENSE +15 -0
- data/README.md +71 -0
- data/Rakefile +3 -0
- data/hyrax-v2_graph_indexer.gemspec +34 -0
- data/lib/hyrax/v2_graph_indexer/railtie.rb +32 -0
- data/lib/hyrax/v2_graph_indexer/version.rb +5 -0
- data/lib/hyrax/v2_graph_indexer.rb +126 -0
- data/lib/tasks/hyrax/v2_graph_indexer_tasks.rake +4 -0
- metadata +83 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3c228444cb3d0e2d5c4697fa414b161fffd0ece95d8da488d3a87b2e8216e4eb
|
4
|
+
data.tar.gz: be4552c5a5c335b1566b21d250379c0834d80673df06b38795b428a91621a58c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4dec66cb7d6cbc5c042f58c669283ba91c8f756ff8d5eb4fc0eb5d31aa9d880bc8afaf99feafc9c573050d7bb2f0b1cb85f59cbe2b4e34a2a1aa1f63493d3ba5
|
7
|
+
data.tar.gz: c8dd13415027c00f77864c057b188658d05996d3f5ed64872f5a7f07336cd8560edd20cccb166de9b18f38ea6581f919cc5ad7cd263e06c8bb269c99a698c5b0
|
data/Gemfile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
source "https://rubygems.org"
|
2
|
+
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
3
|
+
|
4
|
+
# Specify your gem's dependencies in hyrax-v2_graph_indexer.gemspec.
|
5
|
+
gemspec
|
6
|
+
|
7
|
+
gem "sqlite3"
|
8
|
+
|
9
|
+
# Start debugger with binding.b [https://github.com/ruby/debug]
|
10
|
+
# gem "debug", ">= 1.0.0"
|
data/LICENSE
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Copyright 2022 Software Services by Scientist.com
|
2
|
+
|
3
|
+
Additional copyright may be held by others, as reflected in the commit history.
|
4
|
+
|
5
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
you may not use this file except in compliance with the License.
|
7
|
+
You may obtain a copy of the License at
|
8
|
+
|
9
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
|
11
|
+
Unless required by applicable law or agreed to in writing, software
|
12
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
See the License for the specific language governing permissions and
|
15
|
+
limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
# Hyrax::V2GraphIndexer
|
2
|
+
|
3
|
+
The `Hyrax::V2GraphIndexer` gem encapsulates a quasi-backport of the graph indexing now in [Hyrax](https://github.com/samvera/hyrax)'s `main` branch as well as the Hyrax `3.x` release.
|
4
|
+
|
5
|
+
What do we mean by a quasi-backport? Namely it doesn't attempt to make the graphing configurable; instead when you include this gem you then replace the venerable and non-performant [Samvera::NestingIndexer](https://github.com/samvera-labs/samvera-nesting_indexer). You instead favor a the graph feature of SOLR.
|
6
|
+
|
7
|
+
## Usage
|
8
|
+
|
9
|
+
Add this gem to your `2.9.x` Hyrax application's Gemfile.
|
10
|
+
|
11
|
+
## Installation
|
12
|
+
|
13
|
+
Add this line to your application's Gemfile:
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
gem "hyrax-v2_graph_indexer"
|
17
|
+
```
|
18
|
+
|
19
|
+
And then execute:
|
20
|
+
```bash
|
21
|
+
$ bundle
|
22
|
+
```
|
23
|
+
|
24
|
+
Or install it yourself as:
|
25
|
+
```bash
|
26
|
+
$ gem install hyrax-v2_graph_indexer
|
27
|
+
```
|
28
|
+
|
29
|
+
## Contributing
|
30
|
+
|
31
|
+
## Discussion
|
32
|
+
|
33
|
+
This gem does not have much in the way of tests; it has instead been tested against production implementations. The lack of tests is a concession to the return on investment of writing tests for a previous major version of Hyrax which no longer sees updates.
|
34
|
+
|
35
|
+
This code was added to [Adventist's Hyku code-base](https://github.com/scientist-softserv/adventist-dl/) in the [fddb2863 commit](https://github.com/scientist-softserv/adventist-dl/commit/fddb28638a1f5a823399722ffb74916d0f584225).
|
36
|
+
|
37
|
+
From that commit message:
|
38
|
+
|
39
|
+
> Prior to this commit, we had disabled the logic for indexing the parent
|
40
|
+
> child relationships of objects. This results in broken behavior
|
41
|
+
> regarding nesting collections and works. Were we to enable the
|
42
|
+
> "classic" strategy for indexing, we created significant (and known)
|
43
|
+
> performance issues.
|
44
|
+
>
|
45
|
+
> With this commit, we are taking code that was backported to the 3.x
|
46
|
+
> branch of Hyrax via [samvera/hyrax#5858][5858] and
|
47
|
+
> [samvera/hyrax#5916][5916] and projecting that onto the 2.9.x
|
48
|
+
> implementation.
|
49
|
+
>
|
50
|
+
> This projection means that we are not directly backporting but instead
|
51
|
+
> structuring the code such that if you include it, it assumes you using
|
52
|
+
> SOLR's native graph indexing. The aforementioned PRs put those changes
|
53
|
+
> behind a configuration variable; which is not something that makes sense
|
54
|
+
> given this "hack."
|
55
|
+
>
|
56
|
+
> This PR aims to resolve three issues, which by their nature, are
|
57
|
+
> inter-related. The issues are:
|
58
|
+
>
|
59
|
+
> - [x] Adding works to a collection [#59][59]
|
60
|
+
> - [x] Backporting graph indexing [#68][68]
|
61
|
+
> - [x] Adding a collection to another collection [#70][70]
|
62
|
+
>
|
63
|
+
> [59]: #59
|
64
|
+
> [68]: #68
|
65
|
+
> [70]: #70
|
66
|
+
> [5858]: samvera/hyrax#5858
|
67
|
+
> [5916]: samvera/hyrax#5916
|
68
|
+
|
69
|
+
## License
|
70
|
+
|
71
|
+
The gem is available as open source under the terms of the [Apache 2](https://opensource.org/licenses/Apache-2.0).
|
data/Rakefile
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative "lib/hyrax/v2_graph_indexer/version"
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = "hyrax-v2_graph_indexer"
|
5
|
+
spec.version = Hyrax::V2GraphIndexer::VERSION
|
6
|
+
spec.authors = ["Jeremy Friesen"]
|
7
|
+
spec.email = ["jeremy.n.friesen@gmail.com"]
|
8
|
+
spec.homepage = "https://github.com/scientist-softserv/hyrax-v2_graph_indexer"
|
9
|
+
spec.summary = "A quasi-backport of the Hyrax 3+ Graph Indexing."
|
10
|
+
spec.description = "A quasi-backport of the Hyrax 3+ Graph Indexing."
|
11
|
+
spec.required_ruby_version = ">= 2.6.0"
|
12
|
+
|
13
|
+
spec.licenses = ["Apache-2.0"]
|
14
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
15
|
+
spec.metadata["source_code_uri"] = spec.homepage
|
16
|
+
spec.metadata["changelog_uri"] = File.join(spec.homepage, "CHANGELOG.md")
|
17
|
+
|
18
|
+
# Specify which files should be added to the gem when it is released.
|
19
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
20
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
21
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
22
|
+
(f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
|
23
|
+
end
|
24
|
+
end
|
25
|
+
spec.bindir = "exe"
|
26
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
27
|
+
spec.require_paths = ["lib"]
|
28
|
+
|
29
|
+
spec.add_dependency "hyrax", "~> 2.9"
|
30
|
+
|
31
|
+
# Instead of requiring all of Rails, let's just require the narrowest aspect of Rails to get this
|
32
|
+
# configuration/integration working. Besides, Hyrax will bring Rails into this as well.
|
33
|
+
spec.add_dependency "railties"
|
34
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Hyrax
|
2
|
+
module V2GraphIndexer
|
3
|
+
class Railtie < ::Rails::Railtie
|
4
|
+
|
5
|
+
config.to_prepare do
|
6
|
+
Hyrax::Collections::NestedCollectionPersistenceService.singleton_class.prepend(
|
7
|
+
Hyrax::V2GraphIndexer::NestedCollectionPersistenceServiceDecorator::ClassMethods
|
8
|
+
)
|
9
|
+
|
10
|
+
Hyrax::Forms::Dashboard::NestCollectionForm.prepend(
|
11
|
+
Hyrax::V2GraphIndexer::NestCollectionFormDecorator
|
12
|
+
)
|
13
|
+
|
14
|
+
Hyrax::Collections::NestedCollectionQueryService.singleton_class.prepend(
|
15
|
+
Hyrax::V2GraphIndexer::NestedCollectionQueryServiceDecorator::ClassMethods
|
16
|
+
)
|
17
|
+
|
18
|
+
Hyrax::WorkBehavior.prepend(
|
19
|
+
Hyrax::V2GraphIndexer::CollectionNestingDecorator
|
20
|
+
)
|
21
|
+
|
22
|
+
Hyrax::CollectionBehavior.prepend(
|
23
|
+
Hyrax::V2GraphIndexer::CollectionNestingDecorator
|
24
|
+
)
|
25
|
+
|
26
|
+
Hyrax::Dashboard::NestedCollectionsSearchBuilder.prepend(
|
27
|
+
Hyrax::V2GraphIndexer::NestedCollectionsSearchBuilderDecorator
|
28
|
+
)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "hyrax/v2_graph_indexer/version"
|
4
|
+
require "hyrax/v2_graph_indexer/railtie"
|
5
|
+
|
6
|
+
module Hyrax
|
7
|
+
# The purpose of this module is to consolidate the decorations necessary to leverage the native
|
8
|
+
# SOLR graph searches. That native SOLR graph searches replaces the venerable and non-performant
|
9
|
+
# nested indexing.
|
10
|
+
#
|
11
|
+
# These decorations are inspired from the following pull requests:
|
12
|
+
#
|
13
|
+
# - https://github.com/samvera/hyrax/pull/5858/
|
14
|
+
# - https://github.com/samvera/hyrax/pull/5916/
|
15
|
+
#
|
16
|
+
# This `lib` file is intended to stand in the place of minting a 2.9.x release (or 2.10.0
|
17
|
+
# release). In constructing these changes, I have opted not to backport the configuration.
|
18
|
+
# Meaning, if you include this `lib` file, you are stating that you will use the native SOLR graph
|
19
|
+
# searches. This simplifies some of the logic; most notably avoiding the conditional include of
|
20
|
+
# the `Hyrax::CollectionNesting` based on a configuration. Instead we have a module that shadows
|
21
|
+
# the methods introduced in the `Hyrax::CollectionNesting`.
|
22
|
+
module V2GraphIndexer
|
23
|
+
# @note from https://github.com/samvera/hyrax/pull/5916
|
24
|
+
module NestCollectionFormDecorator
|
25
|
+
def nesting_within_maximum_depth
|
26
|
+
true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# @note from https://github.com/samvera/hyrax/pull/5916
|
31
|
+
module NestedCollectionQueryServiceDecorator
|
32
|
+
module ClassMethods
|
33
|
+
def query_solr(collection:, access:, scope:, limit_to_id:, nest_direction:)
|
34
|
+
query_builder = Hyrax::Dashboard::NestedCollectionsSearchBuilder.new(
|
35
|
+
access: access,
|
36
|
+
collection: collection,
|
37
|
+
scope: scope,
|
38
|
+
nesting_attributes: nil,
|
39
|
+
nest_direction: nest_direction
|
40
|
+
)
|
41
|
+
|
42
|
+
query_builder.where(id: limit_to_id.to_s) if limit_to_id
|
43
|
+
query = clean_lucene_error(builder: query_builder)
|
44
|
+
scope.repository.search(query)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# @note from https://github.com/samvera/hyrax/pull/5858/
|
50
|
+
#
|
51
|
+
# This module is responsible for shadowing the methods of Hyrax::CollectionIndexing; we can't
|
52
|
+
# easily replace the inclusion of that module. However we can override it's behavior.
|
53
|
+
module CollectionNestingDecorator
|
54
|
+
def before_update_nested_collection_relationship_indices
|
55
|
+
true
|
56
|
+
end
|
57
|
+
|
58
|
+
def after_update_nested_collection_relationship_indices
|
59
|
+
true
|
60
|
+
end
|
61
|
+
|
62
|
+
def update_nested_collection_relationship_indices
|
63
|
+
true
|
64
|
+
end
|
65
|
+
|
66
|
+
def update_child_nested_collection_relationship_indices
|
67
|
+
true
|
68
|
+
end
|
69
|
+
|
70
|
+
def find_children_of(*)
|
71
|
+
true
|
72
|
+
end
|
73
|
+
|
74
|
+
def use_nested_reindexing?
|
75
|
+
true
|
76
|
+
end
|
77
|
+
|
78
|
+
def reindex_extent
|
79
|
+
true
|
80
|
+
end
|
81
|
+
|
82
|
+
def reindex_extent=(val)
|
83
|
+
@reindex_extent = val
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
def reindex_nested_relationships_for(*)
|
89
|
+
true
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# @note from https://github.com/samvera/hyrax/pull/5858/ with modifications based on v2.9.6 of
|
94
|
+
# Hyrax.
|
95
|
+
module NestedCollectionsSearchBuilderDecorator
|
96
|
+
# rubocop:disable Metrics/LineLength
|
97
|
+
def show_only_other_collections_of_the_same_collection_type(solr_parameters)
|
98
|
+
solr_parameters[:fq] ||= []
|
99
|
+
solr_parameters[:fq] += [
|
100
|
+
ActiveFedora::SolrQueryBuilder.construct_query(Collection.collection_type_gid_document_field_name => @collection.collection_type_gid),
|
101
|
+
"-{!graph from=id to=member_of_collection_ids_ssim#{' maxDepth=1' if @nest_direction == :as_parent}}id:#{@collection.id}",
|
102
|
+
"-{!graph to=id from=member_of_collection_ids_ssim#{' maxDepth=1' if @nest_direction == :as_child}}id:#{@collection.id}"
|
103
|
+
]
|
104
|
+
end
|
105
|
+
# rubocop:enable Metrics/LineLength
|
106
|
+
end
|
107
|
+
|
108
|
+
module NestedCollectionPersistenceServiceDecorator
|
109
|
+
# These overrides are needed because nothing in the 2.9.x implementation was explicitly
|
110
|
+
# **saving** the collection membership changes; they were being indexed but not saved. It's
|
111
|
+
# possible the indexing service was saving the objects.
|
112
|
+
module ClassMethods
|
113
|
+
def persist_nested_collection_for(parent:, child:)
|
114
|
+
child.member_of_collections.push(parent)
|
115
|
+
child.save
|
116
|
+
end
|
117
|
+
|
118
|
+
def remove_nested_relationship_for(parent:, child:)
|
119
|
+
child.member_of_collections.delete(parent)
|
120
|
+
child.save
|
121
|
+
true
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hyrax-v2_graph_indexer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jeremy Friesen
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-12-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: hyrax
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.9'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.9'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: railties
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: A quasi-backport of the Hyrax 3+ Graph Indexing.
|
42
|
+
email:
|
43
|
+
- jeremy.n.friesen@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- Gemfile
|
49
|
+
- LICENSE
|
50
|
+
- README.md
|
51
|
+
- Rakefile
|
52
|
+
- hyrax-v2_graph_indexer.gemspec
|
53
|
+
- lib/hyrax/v2_graph_indexer.rb
|
54
|
+
- lib/hyrax/v2_graph_indexer/railtie.rb
|
55
|
+
- lib/hyrax/v2_graph_indexer/version.rb
|
56
|
+
- lib/tasks/hyrax/v2_graph_indexer_tasks.rake
|
57
|
+
homepage: https://github.com/scientist-softserv/hyrax-v2_graph_indexer
|
58
|
+
licenses:
|
59
|
+
- Apache-2.0
|
60
|
+
metadata:
|
61
|
+
homepage_uri: https://github.com/scientist-softserv/hyrax-v2_graph_indexer
|
62
|
+
source_code_uri: https://github.com/scientist-softserv/hyrax-v2_graph_indexer
|
63
|
+
changelog_uri: https://github.com/scientist-softserv/hyrax-v2_graph_indexer/CHANGELOG.md
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options: []
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 2.6.0
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
requirements: []
|
79
|
+
rubygems_version: 3.1.4
|
80
|
+
signing_key:
|
81
|
+
specification_version: 4
|
82
|
+
summary: A quasi-backport of the Hyrax 3+ Graph Indexing.
|
83
|
+
test_files: []
|