<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nnaemeka Daniel John</title>
    <description>The latest articles on DEV Community by Nnaemeka Daniel John (@dukeofhazardz).</description>
    <link>https://dev.to/dukeofhazardz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1060890%2F95891dc2-061b-4f58-a0ba-fd0cd55fdf93.png</url>
      <title>DEV Community: Nnaemeka Daniel John</title>
      <link>https://dev.to/dukeofhazardz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dukeofhazardz"/>
    <language>en</language>
    <item>
      <title>Building BioDetect: Turning a Simple React App into a 3D Butterfly Experience with WebGi</title>
      <dc:creator>Nnaemeka Daniel John</dc:creator>
      <pubDate>Sat, 28 Sep 2024 20:25:42 +0000</pubDate>
      <link>https://dev.to/dukeofhazardz/building-biodetect-turning-a-simple-react-app-into-a-3d-butterfly-experience-with-webgi-58mg</link>
      <guid>https://dev.to/dukeofhazardz/building-biodetect-turning-a-simple-react-app-into-a-3d-butterfly-experience-with-webgi-58mg</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;BioDetect: Bringing the Natural World Closer to You!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjtvqz7b2acmoae22zpx.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjtvqz7b2acmoae22zpx.gif" alt="The initial version of the app" width="394" height="184"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The initial version of the app&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It all started as a simple, personal project, a little idea I had when &lt;strong&gt;Google&lt;/strong&gt; released the Gemini API. I’m that guy who stares at every leaf, butterfly, and flower but has zero clue about what I'm looking at. So, I thought: &lt;em&gt;“Why not build an app that can identify plants and animals with just a photo?”&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;That’s how &lt;strong&gt;BioDetect&lt;/strong&gt; was born, a fun side project to help satisfy my curiosity about the natural world. I initially built it as an API bare-bones tool: just make an &lt;strong&gt;POST&lt;/strong&gt; request with a picture, and boom, you'd get some basic information in &lt;em&gt;JSON format&lt;/em&gt;. I wasn’t planning on making it super fancy, just a backend-focused tool because that’s my domain of expertise as a backend engineer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entering the Google Gemini Developer Competition
&lt;/h2&gt;

&lt;p&gt;Months later, while browsing online, I stumbled upon the &lt;strong&gt;Google Gemini Developer Competition&lt;/strong&gt;. I thought, “Why not give BioDetect a shot?” It had potential, but it needed to go through a serious glow-up. It had to evolve from a cool personal project to something... extraordinary.&lt;/p&gt;

&lt;p&gt;I began rethinking the entire experience. How could I make it more engaging? More polished? More creative?&lt;/p&gt;

&lt;h3&gt;
  
  
  Iterating and Simplifying: The Minimalist Approach
&lt;/h3&gt;

&lt;p&gt;First off, I decided to revamped the front end to be minimalistic, yet intuitive. &lt;em&gt;A clean interface makes a world of difference&lt;/em&gt;. The goal was to keep the experience simple but immersive, so I kept distractions to a minimum and let the information stand out.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Butterfly Moment: Adding 3D Model Using WebGi
&lt;/h3&gt;

&lt;p&gt;But then came the real game-changer: &lt;strong&gt;a 3D animated butterfly&lt;/strong&gt;. I thought, why not add a visual element that captures the essence of nature’s beauty? I wanted users to feel like they were part of an enchanting world as they scrolled through the app. So I found an incredible 3D butterfly model by &lt;a href="https://sketchfab.com/TPackard" rel="noopener noreferrer"&gt;&lt;em&gt;TPackard&lt;/em&gt;&lt;/a&gt; on &lt;a href="https://sketchfab.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Sketchfab&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu0bdi2sg2qrijv13aixl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu0bdi2sg2qrijv13aixl.png" alt="Sketchfab butterfly" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s when I dipped my toes into &lt;strong&gt;WebGi&lt;/strong&gt;, a powerful library that allows for interactive 3D models. As a backend engineer, this was a new frontier for me, but I loved the challenge. Creating and integrating the 3D butterfly, which flutters beautifully across the screen as you scroll, was no small feat. I had to really dig into frontend technologies and push myself beyond my usual comfort zone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faesmovjkq7ysztdg0p1m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faesmovjkq7ysztdg0p1m.png" alt="Code Snippet for animations on scroll" width="800" height="451"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Code Snippet for animations on scroll&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;React frontend&lt;/strong&gt; was my canvas, and WebGi was my paintbrush. I spent countless nights experimenting, tweaking, and polishing to make the 3D butterfly animate seamlessly on scroll. In the end, I think it was totally worth it. The butterfly adds such a unique and interactive flair, making BioDetect not just functional but delightful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnjkfpoe6ldtvprzmw51q.GIF" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnjkfpoe6ldtvprzmw51q.GIF" alt="The finished Biodetect product" width="1024" height="1024"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The finished product&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Behind BioDetect
&lt;/h2&gt;

&lt;p&gt;Here’s the breakdown of how BioDetect works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python FastAPI Backend&lt;/strong&gt;: This is the core of the app. When a user uploads an image, it gets processed by FastAPI. The backend sends the image to &lt;strong&gt;Google’s Gemini-1.5-Flash API&lt;/strong&gt;, which analyzes it and returns a detailed description.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Parsing&lt;/strong&gt;: The API response is packed with rich insights, so I wrote logic to parse out the key details like species, characteristics, and habitat. This keeps the user-facing data concise yet informative.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;React Frontend&lt;/strong&gt;: The frontend is built with React, designed to showcase the image and information in a clean, digestible format. I used &lt;strong&gt;React Hooks&lt;/strong&gt; to manage the state of the application, ensuring a smooth and dynamic user experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;3D Animation with WebGi&lt;/strong&gt;: I wanted to go beyond static information, so I integrated a &lt;strong&gt;3D butterfly animation&lt;/strong&gt; using WebGi. As users scroll through the page, the butterfly interacts with the content, creating a captivating effect that brings the natural world to life.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Pushing Myself as a Developer
&lt;/h2&gt;

&lt;p&gt;Building BioDetect wasn’t just a coding exercise, it was a learning journey. As someone who lives and breathes backend development, diving into &lt;strong&gt;frontend technologies&lt;/strong&gt; like React and WebGi was challenging but incredibly rewarding. I grew as a developer, learning how to balance both the front and back ends of a project while keeping the user experience at the forefront.&lt;/p&gt;

&lt;p&gt;There were definitely moments of frustration (especially with the 3D butterfly), but there’s something deeply satisfying about seeing your vision come to life. And now, with BioDetect, I’ve created something that blends education, technology, and design in a way that feels both informative and magical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try BioDetect and Support My Journey
&lt;/h2&gt;

&lt;p&gt;I’d love for you to check out &lt;a href="https://biodetect.onrender.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;BioDetect&lt;/strong&gt;&lt;/a&gt; and let me know what you think. Whether you’re a nature enthusiast or just curious about how it works, I promise it’s a fun and educational experience.&lt;/p&gt;

&lt;p&gt;➡️ &lt;a href="https://biodetect.onrender.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Try BioDetect&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
➡️ &lt;a href="https://youtu.be/5el3a5EfCx8?si=6qaJ7ZwLw5wzkkOB" rel="noopener noreferrer"&gt;&lt;strong&gt;Watch the Demo Video&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
➡️ &lt;a href="https://ai.google.dev/competition/projects/biodetect" rel="noopener noreferrer"&gt;&lt;strong&gt;Vote for BioDetect&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m really excited to see how far this project can go, and I’m grateful for any support you can give by voting or sharing!&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking for Opportunities!
&lt;/h2&gt;

&lt;p&gt;Finally, I’m currently on the lookout for &lt;strong&gt;opportunities as a backend or fullstack developer&lt;/strong&gt;. If you know of any openings or can refer me to someone who is hiring, I’d love to chat. Feel free to reach out!&lt;/p&gt;

&lt;p&gt;Thanks for joining me on this journey, BioDetect wouldn’t be where it is without the initial curiosity, countless hours of development, and a little push from the Google Gemini competition. I can’t wait to see what’s next!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Let’s build something incredible together!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fojdxpuyc0wlt9uzw9yzm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fojdxpuyc0wlt9uzw9yzm.gif" alt="A cheers gif" width="480" height="200"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Links:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://biodetect.onrender.com/" rel="noopener noreferrer"&gt;BioDetect App&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/5el3a5EfCx8?si=6qaJ7ZwLw5wzkkOB" rel="noopener noreferrer"&gt;Demo Video&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ai.google.dev/competition/projects/biodetect" rel="noopener noreferrer"&gt;Vote on Google Gemini&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>react</category>
      <category>ai</category>
    </item>
    <item>
      <title>CoduimAI's New Cover-Agent: The Ultimate Guide</title>
      <dc:creator>Nnaemeka Daniel John</dc:creator>
      <pubDate>Tue, 21 May 2024 05:42:00 +0000</pubDate>
      <link>https://dev.to/dukeofhazardz/coduimais-new-cover-agent-the-ultimate-guide-2pao</link>
      <guid>https://dev.to/dukeofhazardz/coduimais-new-cover-agent-the-ultimate-guide-2pao</guid>
      <description>&lt;p&gt;The Cover-Agent test coverage tool just dropped!!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq20h52drn11r3qfq2vgw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq20h52drn11r3qfq2vgw.gif" alt="Big mood" width="498" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, I'll be walking you through everything you need to know in order to get Cover-Agent up and running locally on your workstation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Overview of Cover-Agent
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;First, let's understand what the Cover-Agent is and what it does.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Cover-Agent is an opensource test coverage tool by CodiumAI that utilizes various Generative AI models to automate unit test creation for your projects.&lt;br&gt;
Under the hood, the Cover-Agent is comprised of various components, namely;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Test Runner:&lt;/strong&gt; Which runs the test suite and generates code coverage reports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Coverage Parser:&lt;/strong&gt; Which verifies that code coverage increases as tests are added, ensuring that new tests contribute to the overall test effectiveness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Prompt Builder:&lt;/strong&gt; Which gathers the necessary data from the codebase and constructs the prompt to be passed to the Large Language Model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Caller:&lt;/strong&gt; Which interacts with the LLM to generate tests based on the prompt provided.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cover-Agent can currently be run locally on your terminal, although CodiumAI is working on making it compatible with popular CI platforms.&lt;/p&gt;


&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Before you begin, ensure you have the following:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;OPENAI_API_KEY&lt;/em&gt;:&lt;/strong&gt; Required for calling the OpenAI API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Python/PIP&lt;/em&gt;:&lt;/strong&gt; Required for installing Cover-Agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get Cover-Agent running as fast as possible, the easiest setup would be to install Cover-Agent as a Python Pip package using the command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/Codium-ai/cover-agent.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To ensure that Cover-Agent have been properly installed, you can run the &lt;code&gt;cover-agent&lt;/code&gt; command on the terminal, and you should see something like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cover-agent
usage: cover-agent &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-h&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;--source-file-path&lt;/span&gt; SOURCE_FILE_PATH &lt;span class="nt"&gt;--test-file-path&lt;/span&gt; TEST_FILE_PATH &lt;span class="nt"&gt;--code-coverage-report-path&lt;/span&gt; CODE_COVERAGE_REPORT_PATH &lt;span class="nt"&gt;--test-command&lt;/span&gt; TEST_COMMAND
                   &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--test-command-dir&lt;/span&gt; TEST_COMMAND_DIR] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--included-files&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;INCLUDED_FILES ...]] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--coverage-type&lt;/span&gt; COVERAGE_TYPE] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--report-filepath&lt;/span&gt; REPORT_FILEPATH]
                   &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--desired-coverage&lt;/span&gt; DESIRED_COVERAGE] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--max-iterations&lt;/span&gt; MAX_ITERATIONS] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--additional-instructions&lt;/span&gt; ADDITIONAL_INSTRUCTIONS] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--openai-model&lt;/span&gt; OPENAI_MODEL] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--prompt-only&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
cover-agent: error: the following arguments are required: &lt;span class="nt"&gt;--source-file-path&lt;/span&gt;, &lt;span class="nt"&gt;--test-file-path&lt;/span&gt;, &lt;span class="nt"&gt;--code-coverage-report-path&lt;/span&gt;, &lt;span class="nt"&gt;--test-command&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, you need to set your OpenAI key in your environment variables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;**********************&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Generating Tests using Cover-Agent
&lt;/h3&gt;

&lt;p&gt;Now you are ready to run the Cover Agent to generate and validate unit tests.&lt;br&gt;
You can execute it from the command line using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cover-agent &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--source-file-path&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;path_to_source_file&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--test-file-path&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;path_to_test_file&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--code-coverage-report-path&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;path_to_coverage_report&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--test-command&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;test_command_to_run&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--test-command-dir&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;directory_to_run_test_command&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--coverage-type&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;type_of_coverage_report&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--desired-coverage&lt;/span&gt; &amp;lt;desired_coverage_between_0_and_100&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-iterations&lt;/span&gt; &amp;lt;max_number_of_llm_iterations&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--included-files&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;optional_list_of_files_to_include&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Running Cover-Agent
&lt;/h4&gt;

&lt;p&gt;I have a Python project which auto-generates portfolios using the GitHub API. The API endpoints in this project are located in my &lt;code&gt;app.py&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsaigifp9enoqfcw16kvh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsaigifp9enoqfcw16kvh.gif" alt="App.py" width="600" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also have a test file &lt;code&gt;test_app.py&lt;/code&gt;, for testing the API endpoints.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlegsqqknnm05ftdftm4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlegsqqknnm05ftdftm4.png" alt="Test file" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So with this setup I’m ready to run cover-agent from the terminal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fth7cud2dbf0hcgzsynvv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fth7cud2dbf0hcgzsynvv.gif" alt="Terminal" width="1024" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I ran the command below to generate relevant unit tests for my project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cover-agent &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--source-file-path&lt;/span&gt; &lt;span class="s2"&gt;"app.py"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--test-file-path&lt;/span&gt; &lt;span class="s2"&gt;"test_app.py"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--code-coverage-report-path&lt;/span&gt; &lt;span class="s2"&gt;"coverage.xml"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--test-command&lt;/span&gt; &lt;span class="s2"&gt;"pytest --cov=. --cov-report=xml --cov-report=term"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--test-command-dir&lt;/span&gt; &lt;span class="s2"&gt;"."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--coverage-type&lt;/span&gt; &lt;span class="s2"&gt;"cobertura"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--desired-coverage&lt;/span&gt; 70 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-iterations&lt;/span&gt; 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure you replace the file paths with the  actual file path where your code and test files are located.&lt;/p&gt;

&lt;h4&gt;
  
  
  Changes
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Cover-Agent appends the generated unit tests to your test file.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzdvl3vbrlp7ln3alw0ra.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzdvl3vbrlp7ln3alw0ra.gif" alt="Test file" width="600" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;After generating tests for your project, you’ll notice some new files in your repo.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;generated_prompt.md:&lt;/strong&gt; Which contains the full prompt that is sent to the LLM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktm2tarhkjeok2n58ogr.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktm2tarhkjeok2n58ogr.gif" alt="generated" width="600" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;coverage.xml:&lt;/strong&gt; Which contains the test coverage scope.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9nfozixjfyl4y3ajo0wx.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9nfozixjfyl4y3ajo0wx.gif" alt="coverage" width="600" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;run.log:&lt;/strong&gt; Which contains a copy of the logger that gets dumped to your stdout.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbu9vomf3gmgufyv1fh2n.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbu9vomf3gmgufyv1fh2n.gif" alt="Run log" width="600" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;test_results.html:&lt;/strong&gt; Which contains the results table that contains the following for each generated test:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Test status&lt;/li&gt;
&lt;li&gt;Failure reason (if applicable)&lt;/li&gt;
&lt;li&gt;Exit code,&lt;/li&gt;
&lt;li&gt;stderr&lt;/li&gt;
&lt;li&gt;stdout&lt;/li&gt;
&lt;li&gt;Generated test&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhrdmumok9isufw16t5ax.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhrdmumok9isufw16t5ax.gif" alt="browser" width="1024" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Testing is no doubt one of the most important aspects of software development. And with a few steps you can up your testing game by utilizing the Cover-Agent tool to generate meaningful tests for your projects, ensuring test coverage for your codebase in no time.&lt;/p&gt;

&lt;p&gt;Cover-Agent is an opensource software on GitHub, which means you can take a look at the inner workings of the tool, make meaningful contributions and help extend the capabilities of the tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;u&gt;References&lt;/u&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Codium-ai/cover-agent" rel="noopener noreferrer"&gt;Cover-Agent GitHub Repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Codium-ai/cover-agent/releases" rel="noopener noreferrer"&gt;Cover-Agent Releases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>productivity</category>
      <category>ai</category>
      <category>testing</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Introduction to PR-Agent: Enhancing Productivity with AI 🚀</title>
      <dc:creator>Nnaemeka Daniel John</dc:creator>
      <pubDate>Sun, 12 May 2024 11:38:46 +0000</pubDate>
      <link>https://dev.to/dukeofhazardz/introduction-to-pr-agent-enhancing-productivity-with-ai-14n5</link>
      <guid>https://dev.to/dukeofhazardz/introduction-to-pr-agent-enhancing-productivity-with-ai-14n5</guid>
      <description>&lt;p&gt;In today's software development ecosystem, speed is king. Developers are constantly under a lot of pressure to deliver high-quality code quickly. But managing pull requests (PRs) can be a time-consuming and tedious task.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Good news!!!&lt;br&gt;
PR-Agent can help!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;How?! you may ask..&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this article, I'll fill you in on PR-Agent as well as its key features, benefits and use case scenarios.&lt;/p&gt;

&lt;h4&gt;
  
  
  PR-Agent's Purpose
&lt;/h4&gt;

&lt;p&gt;PR-Agent is an innovative tool by CodiumAI that uses &lt;em&gt;Artificial Intelligence&lt;/em&gt; and various learning models to speed up your PR workflow.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How does it do this?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Imagine you have a helpful and intelligent assistant who can analyze code changes, identify potential issues, and suggest improvements. That's essentially what PR-Agent does. It uses advanced AI to understand your code and provide valuable feedback in a clear and concise way.&lt;/p&gt;




&lt;h4&gt;
  
  
  Explanation of Automated Pull Requests
&lt;/h4&gt;

&lt;p&gt;Pull requests are an important part of software development workflows. They allow developers to propose changes to a codebase, which are then reviewed and merged into the main branch. PR-Agent is your coding buddy who catches typos, suggests improvements, and makes reviewing code less of a chore.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PR-Agent uses automation to make pull request management faster and smoother.&lt;/em&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  Key Features of PR-Agent
&lt;/h4&gt;

&lt;p&gt;Here are some of the few things that makes PR-Agent your new best friend in development:&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;Review Automation&lt;/strong&gt;: With the &lt;code&gt;/review&lt;/code&gt; command, you no longer have to spend hours combing through lines of code. PR-Agent helps you review changes quickly, highlights potential issues and offers you suggestions for improvement. It frees you up to focus on the bigger picture and write awesome code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ukbmdtf54ds66t0vf3m.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ukbmdtf54ds66t0vf3m.gif" alt="Review" width="600" height="368"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;🔍 &lt;strong&gt;Code Suggestions&lt;/strong&gt;: PR-Agent doesn't just point out problems; it also suggests ways to make your code cleaner, more efficient, and easier to understand by others. It's like having an extra pair of really smart eyes on your project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb6jllqpurpi0ordfr8b8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb6jllqpurpi0ordfr8b8.gif" alt="Improve" width="600" height="366"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;📝 &lt;strong&gt;Auto Description&lt;/strong&gt;: Writing PR descriptions can be time-consuming and a pain point for most developers, and that is why PR-Agent automates the process of generating your PR descriptions, saving your time and ensuring that all the necessary information is included.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdnr2ag87zn2z5j0tlcj4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdnr2ag87zn2z5j0tlcj4.gif" alt="Description" width="600" height="377"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;🤖 &lt;strong&gt;Question Answering&lt;/strong&gt;: &lt;em&gt;Are you stuck? or have question about your PR?&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PR-Agent is there to help!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All you need to do is use the &lt;code&gt;/ask&lt;/code&gt; command directly in your pull request, and it will help you clarify things. Whether you have a question about the code itself or how your changes might interact with other parts of the project, PR-Agent will provide insights that will keep you moving forward.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F49zincio1n2b9derhknh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F49zincio1n2b9derhknh.gif" alt="Ask" width="600" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://pr-agent-docs.codium.ai/tools/" rel="noopener noreferrer"&gt;Explore more tools and commands&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  Benefits of Using PR-Agent
&lt;/h4&gt;

&lt;p&gt;⏱️ &lt;strong&gt;Get More Done in Less Time&lt;/strong&gt;: PR-Agent does the grunt work by automating repetitive tasks like reviews and help you write clear descriptions faster, so you can spend less time managing PRs and more time building awesome features.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F98a0lkynk3238tsocwf7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F98a0lkynk3238tsocwf7.gif" alt="Right on Time" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;📈 &lt;strong&gt;Increased Productivity&lt;/strong&gt;: Imagine smoother code reviews, fewer roadblocks, and happier developers. That's the PR-Agent effect!&lt;br&gt;
PR-Agent keeps your team moving at lightning speed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffw2a8j1tol5ic56uispk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffw2a8j1tol5ic56uispk.gif" alt="Productivity" width="320" height="192"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;🚀 &lt;strong&gt;Faster Feedback Loop&lt;/strong&gt;: PR-Agent gives you instant insights and suggestions, so you can fix issues and iterate on your code quickly. This means faster project turnaround times and happier clients or users.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F137m2szkw6py9j7zfh2j.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F137m2szkw6py9j7zfh2j.gif" alt="Do your Job" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  Use Cases and Scenarios
&lt;/h4&gt;

&lt;p&gt;👩‍💻 &lt;strong&gt;Large-Scale Projects&lt;/strong&gt;: Managing a massive codebase with a lot of PRs can feel very daunting. But PR-Agent can help you keep track of everything, ensuring timely reviews, and keep your project running smoothly, even with a large team of developers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp31pa10dph60m8dvtit9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp31pa10dph60m8dvtit9.gif" alt="Speed" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👨‍👩‍👦‍👦 &lt;strong&gt;Remote Teams&lt;/strong&gt;: Distance doesn't have to slow you down. PR-Agent can bridge the gap and keep everyone on the same page, no matter where they're located.&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Open Source Contributions&lt;/strong&gt;: Contributing to open source projects is amazing, but reviewing a lot of PRs can be overwhelming. PR-Agent can help you manage contributions and engage with the community effectively.&lt;/p&gt;




&lt;p&gt;PR-Agent represents the future of code review and collaboration, using the power of AI to 10x productivity and efficiency in software development.&lt;/p&gt;

&lt;p&gt;PR-Agent is not just some fancy AI tool. It's your coding companion, that helps you write better code, collaborate effectively, and get things done faster.&lt;/p&gt;

&lt;p&gt;With PR-Agent by your side, you can automate repetitive tasks and focus on building incredible software solutions.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;u&gt;References&lt;/u&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.codium.ai/products/git-plugin/" rel="noopener noreferrer"&gt;CodiumAI PR-Agent Git Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Codium-ai/pr-agent" rel="noopener noreferrer"&gt;CodiumAI PR-Agent Open-Source Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pr-agent-docs.codium.ai/tools/" rel="noopener noreferrer"&gt;PR-Agent Tools&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>git</category>
      <category>codiumai</category>
    </item>
    <item>
      <title>Revolutionizing Pull Request Collaboration: CodiumAI PR-Agent VS GitHub Copilot For Pull Requests</title>
      <dc:creator>Nnaemeka Daniel John</dc:creator>
      <pubDate>Tue, 12 Dec 2023 07:49:53 +0000</pubDate>
      <link>https://dev.to/dukeofhazardz/revolutionizing-pull-request-collaboration-codiumai-pr-agent-vs-github-copilot-for-pull-requests-2e7o</link>
      <guid>https://dev.to/dukeofhazardz/revolutionizing-pull-request-collaboration-codiumai-pr-agent-vs-github-copilot-for-pull-requests-2e7o</guid>
      <description>&lt;p&gt;In the dynamic world of software development, tools that enhance productivity and streamline workflows are highly sought after, AI-powered tools have surfaced to enhance the efficiency and 10x the productivity of developers. Among these tools, CodiumAI's PR-Agent and GitHub Copilot stand out, offering distinct approaches to enhancing code quality and developer productivity.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;u&gt;AI for 10x Productivity&lt;/u&gt;
&lt;/h3&gt;

&lt;p&gt;Before getting into the specifics of CodiumAI's PR-Agent and GitHub Copilot, it's important to acknowledge the transformative impact of AI on productivity. These tools leverage artificial intelligence to not only facilitate code review processes but also to significantly amplify the productivity of developers, allowing them to achieve more in less time.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article will focus specifically on the Git solution provided by PR-Agent and GitHub Copilot solution for pull requests.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;u&gt;A Closer Look at PR-Agent by CodiumAI&lt;/u&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Overview
&lt;/h3&gt;

&lt;p&gt;PR-Agent, an open-source AI-powered tool by CodiumAI, aims at automating pull request analysis, feedback, and suggestions. Its development focus includes identifying potential code problems, improving code quality, and facilitating collaborative feedback from other developers.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Versatile Git Compatibility
&lt;/h3&gt;

&lt;p&gt;From auto-generating descriptions to suggesting code improvements and answering free-text questions, PR-Agent seamlessly functions within Git and various integrated development environments (IDEs).&lt;/p&gt;

&lt;p&gt;Notably, PR-Agent extends its support to all Git platforms, ensuring its adaptability to different version control systems. Some prominent Git platforms that PR-Agent seamlessly integrates with includes but are not limited to GitHub, GitLab, Bitbucket, CodeCommit, Azure Devops etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Quick Setup Procedure
&lt;/h3&gt;

&lt;p&gt;For the quickest setup of PR-Agent on your repositories, I recommend running it as a GitHub Action. The installation guide can be found &lt;a href="https://github.com/Codium-ai/pr-agent/blob/main/INSTALL.md#run-as-a-github-action" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're planning to use PR-Agent on both public and private repositories, consider running it as a GitHub App. The installation guide for GitHub App setup is available &lt;a href="https://github.com/Codium-ai/pr-agent/blob/main/INSTALL.md#run-as-a-github-app" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Choose the option that best fits your repository needs, and follow the provided guides for a seamless PR-Agent setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Commands and Usage
&lt;/h3&gt;

&lt;p&gt;PR-Agent prides itself on offering a comprehensive set of commands designed to empower developers in various aspects of pull request management, each serving a unique purpose in the code review and improvement process. Here's a detailed look at some key commands:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8438tmazr161stxj70bn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8438tmazr161stxj70bn.png" alt="CodiumAI PR-Agent Commands" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you've installed Codium PR-Agent on a private repository, you can utilize commands like &lt;code&gt;/describe&lt;/code&gt;. On the other hand, for public repositories, simply mention the name &lt;code&gt;@CodiumAI-Agent&lt;/code&gt; in your Git provider environment, then request actions such as &lt;code&gt;/review&lt;/code&gt; or &lt;code&gt;/describe&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Use Case
&lt;/h3&gt;

&lt;p&gt;In a recent scenario involving the Alxfolio project, a portfolio-generating site utilizing the GitHub API for fetching user data, I opened a pull request. Within this pull request, my focus was on enhancing the &lt;code&gt;get_user&lt;/code&gt; function. The refactoring process involved code improvements, also, I globalized the GitHub API URL for better maintainability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbrrnisx2s7fgdtqkzf2a.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbrrnisx2s7fgdtqkzf2a.gif" alt="My Pull Request" width="1024" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After submitting the pull request, the PR-Agent, set up as a GitHub Action, automatically conducted checks on the changes. As a result, it stands ready to accept commands from me, paving the way for a streamlined process for further review and interaction. The PR-Agent's automated checks help ensure the integrity of the pull request and enhance collaboration within the development workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffu1btax3zklyjg5gt8a7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffu1btax3zklyjg5gt8a7.gif" alt="GitHub Action checks" width="1024" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;u&gt;&lt;strong&gt;Auto Description (/describe):&lt;/strong&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Public Repo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@CodiumAI-Agent /describe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Private Repo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/describe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I generated a description for my pull request by commenting the &lt;code&gt;/describe&lt;/code&gt; command on the pull request. This command efficiently generates a concise yet comprehensive PR description. It encompasses crucial details such as title, type, summary, code walkthrough, and labels.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0l20k5x58h3mro26bltv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0l20k5x58h3mro26bltv.gif" alt="Describe command" width="449" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;u&gt;&lt;strong&gt;Auto Review (/review):&lt;/strong&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Public Repo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@CodiumAI-Agent /review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Private Repo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By commenting the &lt;code&gt;/review&lt;/code&gt; command, I received adjustable feedback covering key aspects, including the PR's main theme, type, relevant tests, security considerations, and diverse suggestions for enhancing the overall content.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwyevdypkde98qnugmzux.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwyevdypkde98qnugmzux.gif" alt="CodiumAI PR-Agent review" width="1024" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;u&gt;&lt;strong&gt;Question Answering (/ask ...):&lt;/strong&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Public Repo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@CodiumAI-Agent /ask "something"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Private Repo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/ask "something"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the ongoing interaction with the Alxfolio project's pull request with PR-Agent, I leveraged the &lt;code&gt;/ask&lt;/code&gt; command to seek insights. Specifically, I inquired about “The primary purpose of the get_user function”. The &lt;code&gt;/ask&lt;/code&gt; command excels in addressing free-text questions related to the PR. It provided me with valuable information and clarifications about the code and its broader context, contributing to a more nuanced understanding of the changes introduced.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdqqms8i1is8xo14638bu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdqqms8i1is8xo14638bu.gif" alt="CodiumAI PR-Agent ask" width="456" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;u&gt;&lt;strong&gt;Code Refactoring (/improve):&lt;/strong&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Public Repo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@CodiumAI-Agent /improve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Private Repo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/improve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I applied the &lt;code&gt;/improve&lt;/code&gt; command and it played a crucial role in suggesting opportunities for enhancing not only the &lt;code&gt;get_user&lt;/code&gt; function but also other supporting functions within the &lt;code&gt;functions.py&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;/improve&lt;/code&gt; command is designed to identify areas for refactoring, focusing on aspects such as code quality, readability, and maintainability. Following these suggestions, I am prepared to commit these changes, ensuring that the codebase benefits from optimized practices.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffsiwaxw30xj94c54oz3r.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffsiwaxw30xj94c54oz3r.gif" alt="CodiumAI PR-Agent improve" width="458" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;u&gt;&lt;strong&gt;Code Documentation (/add_docs):&lt;/strong&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Public Repo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@CodiumAI-Agent /add_docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Private Repo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/add_docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I used the &lt;code&gt;/add_docs&lt;/code&gt; command to streamline the documentation process and it performed an automatic scan of my code, identifying undocumented functions and code blocks within the pull request. The command adds documentation to previously un-documented functions and classes. The automated detection and addition of documentation enhance the overall clarity and understanding of the codebase.&lt;/p&gt;

&lt;p&gt;With the suggested documentation in place, I have the option to commit these changes, ensuring that the pull request not only introduces code enhancements but also maintains comprehensive and well-documented code practices.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzc9jbmzo104p6i32y06c.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzc9jbmzo104p6i32y06c.gif" alt="CodiumAI PR-Agent add_docs" width="1024" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You can refer to &lt;a href="https://github.com/Codium-ai/pr-agent" rel="noopener noreferrer"&gt;PR-Agent on Github&lt;/a&gt; to see more Commands.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Open-source Nature
&lt;/h3&gt;

&lt;p&gt;One notable strength of PR-Agent lies in its open-source nature, inviting transparency and community collaboration. Developers have the freedom to inspect and modify the tool, fostering a culture of shared innovation and continuous improvement.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;u&gt;Exploring GitHub Copilot For Pull Requests&lt;/u&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Overview
&lt;/h3&gt;

&lt;p&gt;GitHub Copilot, a collaboration between GitHub and OpenAI, is another powerhouse in the AI-driven development landscape. GitHub Copilot for pull requests focuses on generating summaries with specific commands. Developers can initiate this feature during PR creation, by editing the pull request description post-creation, or by commenting in the pull request thread. The main commands include showcasing all types of content, generating a one-paragraph summary, creating a detailed list of changes, or even crafting a poetic description.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Marker Tags for Description Expansion
&lt;/h3&gt;

&lt;p&gt;Copilot's output for pull request summaries consists of a concise three-sentence prose overview, providing a high-level understanding of the changes. Additionally, it generates 3–5 bulleted changes listed with links to the respective lines of code they refer to.&lt;br&gt;
In addition to pull request summaries, Copilot introduces marker tags for enhancing pull request descriptions. Developers can use markers like &lt;code&gt;copilot:all&lt;/code&gt;, &lt;code&gt;copilot:summary&lt;/code&gt;, and &lt;code&gt;copilot:walkthrough&lt;/code&gt; to guide Copilot in expanding descriptions into summaries of changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzpr3fo43gpci6frxwws.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzpr3fo43gpci6frxwws.gif" alt="Copilot for pr" width="600" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. GitHub Integration
&lt;/h3&gt;

&lt;p&gt;One of Copilot's key strengths lies in its seamless integration with GitHub and various code repositories. Operating directly within popular code editors like Visual Studio Code, it ensures developers have immediate access to its suggestions during the coding process.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Proprietary Nature
&lt;/h3&gt;

&lt;p&gt;Unlike PR-Agent's open-source model, GitHub Copilot follows a proprietary approach. While this may restrict access to some extent, it also reflects a dedication to delivering polished features and an enhanced user experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;u&gt;Comparative Analysis Between CodiumAI's PR-Agent and GitHub Copilot For Pull Requests&lt;/u&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Specialization vs. Generalization
&lt;/h3&gt;

&lt;p&gt;PR-Agent specializes in comprehensive pull request reviews with a myriad of tools and commands, covering various aspects of the review process. On the other hand, GitHub Copilot, while powerful, is more focused on generating descriptions and summaries in response to specific commands.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Usability and Integration
&lt;/h3&gt;

&lt;p&gt;Both PR-Agent and Copilot emphasize seamless integration into developer workflows. PR-Agent's compatibility with multiple Git platforms and IDEs, including GitHub, GitLab, Bitbucket, CodeCommit, Azure DevOps, etc, positions it as a tool suitable for a broad audience, regardless of the chosen development environment. Copilot, while seamlessly integrating with GitHub, its compatibility is limited exclusively to the GitHub platform. &lt;/p&gt;

&lt;h3&gt;
  
  
  3. Extensive Commands vs. Specific Descriptions
&lt;/h3&gt;

&lt;p&gt;PR-Agent provides an extensive array of commands for nuanced interactions, ranging from code improvements to answering questions. In contrast, Copilot's commands are tailored specifically to generate pull request descriptions and summaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Flexibility and Customization
&lt;/h3&gt;

&lt;p&gt;PR-Agent's open-source nature and versatile commands provide developers with flexibility. GitHub Copilot, with its proprietary model, GitHub Copilot, in the context of pull requests, streamlines its focus on providing concise, AI-generated descriptions.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Command Variety
&lt;/h3&gt;

&lt;p&gt;PR-Agent supports a diverse range of commands, each serving a specific purpose in code review and improvement. Developers can utilize commands such as &lt;code&gt;/describe&lt;/code&gt;, &lt;code&gt;/review&lt;/code&gt;, &lt;code&gt;/ask&lt;/code&gt;, &lt;code&gt;/refactor&lt;/code&gt;, &lt;code&gt;/generate&lt;/code&gt;, &lt;code&gt;/summarize&lt;/code&gt;, &lt;code&gt;/test&lt;/code&gt;, &lt;code&gt;/debug&lt;/code&gt;, &lt;code&gt;/optimize&lt;/code&gt;, and &lt;code&gt;/document&lt;/code&gt;, enabling a comprehensive set of functionalities.&lt;/p&gt;

&lt;p&gt;In contrast, GitHub Copilot for pull requests has a more singular focus, primarily offering concise AI-generated descriptions using markers such as &lt;code&gt;copilot:all&lt;/code&gt;, &lt;code&gt;copilot:summary&lt;/code&gt;, and &lt;code&gt;copilot:walkthrough&lt;/code&gt;. While this streamlines its functionality for pull requests, it lacks the command variety found in PR-Agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Community Involvement
&lt;/h3&gt;

&lt;p&gt;PR-Agent, being open-source, fosters community involvement. Developers can contribute to its development, report issues, and participate in enhancing its capabilities. GitHub Copilot, being a proprietary tool, operates without the same level of community engagement in terms of direct contributions to its codebase.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Cost and Accessibility
&lt;/h3&gt;

&lt;p&gt;PR-Agent is free to use, being an open-source tool, making it accessible to developers without any cost barriers. On the other hand, GitHub Copilot follows a subscription-based model, costing $10 USD per month or $100 USD per year, potentially limiting its accessibility, especially for individual developers or small teams.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;u&gt;Conclusion&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;In conclusion, the comparison between PR-Agent and GitHub Copilot reveals distinct approaches to pull request summaries. PR-Agent distinguishes itself with a feature-rich arsenal of commands, a variety of tools, and compatibility across a broad spectrum of Git platforms, making it a comprehensive solution for robust pull request reviews. On the contrary, GitHub Copilot excels in its specialized role, focusing on generating descriptions and summaries through specific commands.&lt;/p&gt;

&lt;p&gt;It's worth noting that PR-Agent is freely available, making it a cost-effective choice, while GitHub Copilot comes with associated costs. Personally, I find the comprehensive and free nature of CodiumAI's PR-Agent solution for GitHub to be a compelling factor, further solidifying its appeal for developers seeking a versatile and budget-friendly tool for pull request management. As these tools evolve, they continue to be instrumental in driving innovation, efficiency, and collaboration within the dynamic landscape of software development. Developers are encouraged to explore and harness the strengths of both tools, with PR-Agent emerging as a robust and accessible choice for GitHub repositories.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;u&gt;References&lt;/u&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.codium.ai/products/git-plugin/" rel="noopener noreferrer"&gt;CodiumAI PR-Agent Git Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Codium-ai/pr-agent" rel="noopener noreferrer"&gt;CodiumAI PR-Agent Open-Source Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://githubnext.com/projects/copilot-for-pull-requests" rel="noopener noreferrer"&gt;GitHub Copilot for Pull Requests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/github-copilot-enterprise/copilot-pull-request-summaries/about-copilot-pull-request-summaries" rel="noopener noreferrer"&gt;Copilot Pull Request Summaries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>codiumai</category>
      <category>ai</category>
      <category>git</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Guide: Creating Temporary Tables in PostgreSQL</title>
      <dc:creator>Nnaemeka Daniel John</dc:creator>
      <pubDate>Mon, 28 Aug 2023 16:29:02 +0000</pubDate>
      <link>https://dev.to/dukeofhazardz/guide-creating-temporary-tables-in-postgresql-4i05</link>
      <guid>https://dev.to/dukeofhazardz/guide-creating-temporary-tables-in-postgresql-4i05</guid>
      <description>&lt;p&gt;In this guide, we will take a look at the process of creating temporary tables in PostgreSQL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding Temporary Tables
&lt;/h3&gt;

&lt;p&gt;Temporary tables in PostgreSQL are a special type of table that exist only for the duration of a database session. They are very useful when you need to store and process data temporarily without the need for permanent storage. Temporary tables are created within a specific schema and are automatically dropped at the end of the session or transaction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating Temporary Tables
&lt;/h3&gt;

&lt;p&gt;Let's dive into the steps of creating temporary tables in PostgreSQL:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Connect to the Database&lt;/strong&gt;&lt;br&gt;
Before creating any table, you need to establish a connection to your PostgreSQL database using a client of your choice. This can be achieved using tools like psql, a popular command-line interface, or through graphical user interfaces like pgAdmin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Syntax for Creating Temporary Tables&lt;/strong&gt;&lt;br&gt;
The syntax for creating a temporary table is similar to that of a regular table, with one key difference: the use of the &lt;code&gt;TEMPORARY&lt;/code&gt; keyword. Here's a basic template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TEMPORARY TABLE table_name (
    column1 data_type,
    column2 data_type,
    -- Define other columns here
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_db=# CREATE TEMPORARY TABLE temp_table (
    id SERIAL PRIMARY KEY NOT NULL
    name VARCHAR(25) NOT NULL);
CREATE TABLE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: Populating the Temporary Table&lt;/strong&gt;&lt;br&gt;
Once you've defined the structure of your temporary table, you can populate it with data using the standard INSERT INTO statement. This allows you to work with the temporary data just like you would with any other table.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_db=# INSERT INTO temp_table(name) VALUES('Daniel'),
my_db-# ('Mary'), ('George');
INSERT 0 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_db=# SELECT * FROM temp_table;
 id |  name
----+--------
  1 | Daniel
  2 | Mary
  3 | George
(3 rows)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Performing Operations&lt;/strong&gt;&lt;br&gt;
Temporary tables can be used for a variety of purposes, such as:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Intermediate Calculations:&lt;/strong&gt; When you need to perform complex calculations or data transformations, temporary tables provide a way to store intermediate results before arriving at the final output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Session-Specific Data:&lt;/strong&gt; Temporary tables are session-specific, which means different users can work with their own copies of the same temporary table without conflicting with each other's data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Batch Processing:&lt;/strong&gt; Temporary tables are commonly used in batch processing scenarios, where you can load data into a temporary table, manipulate it, and then insert the processed data into your main tables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Dropping Temporary Tables&lt;/strong&gt;&lt;br&gt;
Remember that temporary tables are automatically dropped at the end of your session or transaction. But, if you want to explicitly drop a temporary table before that, you can use the &lt;code&gt;DROP TABLE&lt;/code&gt; statement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DROP TABLE IF EXISTS table_name;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_db=# DROP TABLE IF EXISTS temp_table;
DROP TABLE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Creating temporary tables in PostgreSQL offers a versatile and efficient way to manage and process data within the context of a session. These tables are particularly handy for intermediate data storage during complex calculations, batch processing, and more. By understanding the syntax and use cases of temporary tables, you can unlock a powerful tool in your PostgreSQL toolkit. Whether you're an analyst, developer, or database administrator, temporary tables can enhance your data manipulation capabilities and streamline your workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/sql-createtable.html" rel="noopener noreferrer"&gt;PostgreSQL CREATE TABLES&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/install-procedure.html#CONFIGURE-OPTIONS" rel="noopener noreferrer"&gt;PostgreSQL Installation Procedure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Website: &lt;a href="https://age.apache.org/" rel="noopener noreferrer"&gt;https://age.apache.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE GitHub: &lt;a href="https://github.com/apache/age" rel="noopener noreferrer"&gt;https://github.com/apache/age&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Viewer GitHub: &lt;a href="https://github.com/apache/age-viewer" rel="noopener noreferrer"&gt;https://github.com/apache/age-viewer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>apacheage</category>
      <category>database</category>
      <category>postgres</category>
      <category>postgressql</category>
    </item>
    <item>
      <title>Guide: Creating Views in PostgreSQL</title>
      <dc:creator>Nnaemeka Daniel John</dc:creator>
      <pubDate>Fri, 25 Aug 2023 17:38:40 +0000</pubDate>
      <link>https://dev.to/dukeofhazardz/guide-creating-views-in-postgresql-5fp9</link>
      <guid>https://dev.to/dukeofhazardz/guide-creating-views-in-postgresql-5fp9</guid>
      <description>&lt;p&gt;Welcome to this informative blog post that delves into the fascinating world of creating views in PostgreSQL. If you're looking to enhance your database management skills, understanding how to create views is a crucial step. Views offer a way to simplify complex queries, improve security, and optimize data retrieval, and we'll explore the process step by step. So, let's dive in!&lt;/p&gt;

&lt;h3&gt;
  
  
  What are Views in PostgreSQL?
&lt;/h3&gt;

&lt;p&gt;In PostgreSQL, a view is a virtual table that presents data from one or more base tables or other views. It's like a window into your data, allowing you to structure and present it in a way that makes sense for your specific use case. Views are particularly helpful when dealing with intricate queries or when you need to grant users access to specific data without exposing the entire database schema.&lt;/p&gt;




&lt;h3&gt;
  
  
  Getting Started
&lt;/h3&gt;

&lt;p&gt;Before we jump into creating views, let's ensure you have the necessary environment set up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Operating System: Ubuntu 22.04.2 LTS&lt;/li&gt;
&lt;li&gt;PostgreSQL Version: postgresql-13.10&lt;/li&gt;
&lt;li&gt;Development Environment
For this tutorial, I've used a development environment within a WSL Ubuntu machine.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Creating Your First View
&lt;/h3&gt;

&lt;p&gt;Let's start by creating a simple view to understand the process. Imagine we have a database containing information about products and their prices. Our goal is to create a view that displays products with their corresponding prices. Here's how you can achieve this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Defining the Query:&lt;/strong&gt;&lt;br&gt;
Open your preferred PostgreSQL client or terminal and connect to your database. Then, define the query that retrieves the desired information. In our case, the query might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_db=# SELECT * FROM products;
 product_id | product_name | price
------------+--------------+-------
          1 | Product A    | 19.99
          2 | Product B    | 29.99
          3 | Product C    |  9.99
          4 | Product D    | 39.99
          5 | Product E    | 14.99
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_db=# CREATE VIEW product_prices AS
my_db-#    SELECT product_name, price
my_db-# FROM products;
CREATE VIEW
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;- Creating the View:&lt;/strong&gt;&lt;br&gt;
The above SQL statement creates a view named product_prices. It fetches the product_name and price columns from the products table and presents them in a new virtual table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Using the View:&lt;/strong&gt;&lt;br&gt;
Once the view is created, you can use it just like any other table in your database. For instance, you can run a simple query like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_db=# SELECT * FROM product_prices;
 product_name | price
--------------+-------
 Product A    | 19.99
 Product B    | 29.99
 Product C    |  9.99
 Product D    | 39.99
 Product E    | 14.99
(5 rows)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This query retrieves all the data from the &lt;code&gt;product_prices&lt;/code&gt; view, making it easier to access the desired information.&lt;/p&gt;




&lt;h3&gt;
  
  
  Best Practices
&lt;/h3&gt;

&lt;p&gt;To ensure your views are effective and maintainable, consider these best practices:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Keep it Simple:&lt;/strong&gt; Views are meant to simplify complex queries. Avoid overcomplicating them; if a view becomes too intricate, it might defeat its purpose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Security:&lt;/strong&gt; Views can help you control data access. Grant permissions only to the views users need, safeguarding sensitive information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Performance:&lt;/strong&gt; While views are powerful, be mindful of performance implications, especially when dealing with large datasets. Optimize queries and indexes as needed.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;In this comprehensive guide, we've explored the world of creating views in PostgreSQL. Views are an essential tool in a database administrator's toolkit, offering ways to streamline queries and enhance security. By defining, creating, and utilizing views effectively, you can simplify data retrieval and present information in a structured and user-friendly manner. Remember to adapt solutions to challenges and follow best practices to ensure your views serve your database needs efficiently.&lt;/p&gt;

&lt;p&gt;So, go ahead and experiment with creating views in PostgreSQL. Unlock the potential to harness your data more effectively than ever before! Happy coding! 🚀&lt;/p&gt;




&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/sql-createview.html" rel="noopener noreferrer"&gt;PostgreSQL CREATE VIEW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/install-procedure.html#CONFIGURE-OPTIONS" rel="noopener noreferrer"&gt;PostgreSQL Installation Procedure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Website: &lt;a href="https://age.apache.org/" rel="noopener noreferrer"&gt;https://age.apache.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE GitHub: &lt;a href="https://github.com/apache/age" rel="noopener noreferrer"&gt;https://github.com/apache/age&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Viewer GitHub: &lt;a href="https://github.com/apache/age-viewer" rel="noopener noreferrer"&gt;https://github.com/apache/age-viewer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>apacheage</category>
      <category>database</category>
      <category>postgres</category>
      <category>postgressql</category>
    </item>
    <item>
      <title>Creating User-Defined Functions in PostgreSQL: A Journey into Customization</title>
      <dc:creator>Nnaemeka Daniel John</dc:creator>
      <pubDate>Thu, 24 Aug 2023 19:22:02 +0000</pubDate>
      <link>https://dev.to/dukeofhazardz/creating-user-defined-functions-in-postgresql-a-journey-into-customization-5935</link>
      <guid>https://dev.to/dukeofhazardz/creating-user-defined-functions-in-postgresql-a-journey-into-customization-5935</guid>
      <description>&lt;p&gt;In the realm of database management, PostgreSQL stands tall as one of the most powerful and versatile options available. Its extensibility allows developers to utilize its capabilities by creating their own functions, tailored to their specific needs. In this blogpost, we will take a look at creating custom functions within the PostgreSQL environment, understanding the intricacies of the process and the benefits it offers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Create Custom Functions?
&lt;/h3&gt;

&lt;p&gt;At times, the predefined functions offered by PostgreSQL might not fully align with the requirements of a particular application. This is where custom functions comes into play. These custom functions are carefully created to perform specific tasks that may involve complex calculations, data manipulations, or tailored business logic.&lt;/p&gt;

&lt;p&gt;Consider a scenario where you need to compute a unique scoring algorithm for your application's users based on various data points. The predefined functions available in PostgreSQL might not encapsulate your precise requirements. Crafting a custom function empowers you to design a solution that aligns perfectly with your business logic.&lt;/p&gt;




&lt;h3&gt;
  
  
  Components of a Custom Function
&lt;/h3&gt;

&lt;p&gt;Creating a custom function in PostgreSQL involves a mix of SQL and PL/pgSQL. PL/pgSQL is a procedural language specifically designed for PostgreSQL, allowing developers to embed procedural code within SQL statements. This blend of declarative SQL and procedural constructs forms the backbone of custom functions.&lt;/p&gt;

&lt;p&gt;Let's walk through the creation of a custom function. Imagine a scenario where you need to calculate the total purchase amount for a given customer based on their order history. The predefined functions falls short, and it's time to activate your creativity.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE OR REPLACE FUNCTION calculate_total_purchase(customer_id INT)
RETURNS NUMERIC AS $$
DECLARE
    total_purchase NUMERIC := 0;
BEGIN
    SELECT SUM(order_amount) INTO total_purchase
    FROM orders
    WHERE orders.customer_id = calculate_total_purchase.customer_id;

    RETURN total_purchase;
END;
$$ LANGUAGE plpgsql;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above query, we've created a function named &lt;code&gt;calculate_total_purchase&lt;/code&gt;. This function accepts a &lt;code&gt;customer_id&lt;/code&gt; as input and returns the total purchase amount as a &lt;code&gt;NUMERIC&lt;/code&gt;. The way we use PL/pgSQL syntax inside the function lets us combine SQL queries, control actions, and variables together.&lt;/p&gt;




&lt;h3&gt;
  
  
  Calling Custom Functions
&lt;/h3&gt;

&lt;p&gt;After you've created your custom function, you have can use it whenever you want. Using it is quite straightforward. &lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
Given table &lt;code&gt;orders&lt;/code&gt;;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_db=# select * from orders;
 order_id | customer_id | order_amount
----------+-------------+--------------
        1 |           1 |       100.50
        2 |           1 |        75.20
        3 |           2 |        50.00
        4 |           3 |       200.75
        5 |           2 |       120.30
        6 |           3 |        50.50
        7 |           1 |       300.25
        8 |           2 |        75.60
        9 |           3 |       150.00
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And to call the function &lt;code&gt;calculate_total_purchase&lt;/code&gt;;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_db=# SELECT calculate_total_purchase(2);
 calculate_total_purchase
--------------------------
                   245.90
(1 row)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, we've used our custom function called "calculate_total_purchase" and passed in the customer ID of 2. The function becomes active and starts going through the records of past orders made by that customer. It adds up all the amounts from those orders to figure out the total amount the customer has spent. Finally, it gives us this total amount as an outcome or result.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Advantages of Custom Functions in PostgreSQL
&lt;/h3&gt;

&lt;p&gt;When we delve into the world of custom functions in PostgreSQL, we uncover a wide range of benefits:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Tailored Solutions:&lt;/strong&gt; Custom functions offer you the ability to create solutions that fit perfectly with your application's specific needs. This lets you open up new possibilities for how your application works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Improved Performance:&lt;/strong&gt; By optimizing your custom functions for specific tasks, you can make your application work faster and more efficiently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Better Organization:&lt;/strong&gt; When you wrap complex business logic within custom functions, you make your code easier to manage and understand. This keeps your application's codebase clean and maintainable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Reusability:&lt;/strong&gt; Once you've created custom functions, you can use them in different parts of your application. This promotes the reuse of code and reduces the need for repeating the same code over and over.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Adaptability:&lt;/strong&gt; As your application grows and changes, your custom functions can change with it. This means they can always meet the new requirements, keeping your data management effective.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;As I conclude this blogpost, the importance of custom functions in PostgreSQL remains strong. Every time you design a custom function, you breathe life into how your application handles data and give it a touch of your unique ingenuity.&lt;/p&gt;

&lt;p&gt;Keep in mind that PostgreSQL is more than just a database; it's a vast canvas where your creative ideas can thrive. Use the power of custom functions to shape your data in ways that align with your imagination. Witness your applications move beyond the ordinary and step into the extraordinary.&lt;/p&gt;




&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/sql-createfunction.html" rel="noopener noreferrer"&gt;PostgreSQL CREATE FUNCTION&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/install-procedure.html#CONFIGURE-OPTIONS" rel="noopener noreferrer"&gt;PostgreSQL Installation Procedure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Website: &lt;a href="https://age.apache.org/" rel="noopener noreferrer"&gt;https://age.apache.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE GitHub: &lt;a href="https://github.com/apache/age" rel="noopener noreferrer"&gt;https://github.com/apache/age&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Viewer GitHub: &lt;a href="https://github.com/apache/age-viewer" rel="noopener noreferrer"&gt;https://github.com/apache/age-viewer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>postgres</category>
      <category>database</category>
      <category>postgressql</category>
      <category>apacheage</category>
    </item>
    <item>
      <title>Guide: Creating Triggers in PostgreSQL</title>
      <dc:creator>Nnaemeka Daniel John</dc:creator>
      <pubDate>Wed, 23 Aug 2023 16:08:02 +0000</pubDate>
      <link>https://dev.to/dukeofhazardz/guide-creating-triggers-in-postgresql-8ab</link>
      <guid>https://dev.to/dukeofhazardz/guide-creating-triggers-in-postgresql-8ab</guid>
      <description>&lt;p&gt;In the world of relational databases, PostgreSQL stands out as a powerful and versatile option. It offers a lot of features that allow developers to implement sophisticated solutions for various data management challenges. One of these features, triggers, plays a crucial role in automating actions based on events occurring within a database. In this article, we will take a look at the triggers in PostgreSQL, exploring their purpose, implementation, and potential use cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding Triggers
&lt;/h3&gt;

&lt;p&gt;A trigger in PostgreSQL is a procedural code block that gets executed automatically in response to specific events occurring within a database table. These events can include data manipulation language (DML) actions like INSERT, UPDATE, and DELETE statements. Triggers provide a way to enforce business rules, maintain data integrity, and carry out complex actions without requiring explicit user intervention.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Components of a Trigger
&lt;/h3&gt;

&lt;p&gt;Before we dive into creating triggers, let's break down the essential components that make up a PostgreSQL trigger:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Event:&lt;/strong&gt; This is the database operation that triggers the execution of the trigger. Events can include INSERT, UPDATE, DELETE, or even a combination of these.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Trigger Function:&lt;/strong&gt; A trigger function is a block of code written in PL/pgSQL, which is PostgreSQL's procedural language. This function is executed when the trigger's associated event occurs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Trigger Constraint:&lt;/strong&gt; This is an optional condition that determines whether the trigger function should be executed. It is specified using a WHEN clause in the trigger's definition.&lt;/p&gt;




&lt;h3&gt;
  
  
  Creating a Trigger
&lt;/h3&gt;

&lt;p&gt;Now that we understand the components, let's walk through the process of creating a trigger step by step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create a Trigger Function&lt;/strong&gt;&lt;br&gt;
First, we need to define the trigger function. This function encapsulates the logic that should be executed when the trigger's event occurs. Here's an example of a trigger function that logs a message when a new row is inserted into a table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE OR REPLACE FUNCTION log_insert() RETURNS TRIGGER AS $$
BEGIN
    RAISE NOTICE 'New row inserted with ID: %', NEW.id;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Step 2: Create the Trigger&lt;/strong&gt;&lt;br&gt;
Once the trigger function is defined, we can create the actual trigger that associates the function with a specific event on a table. Here's how you can create a trigger that fires after an &lt;code&gt;INSERT&lt;/code&gt; operation on a table named "trigg_table":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TRIGGER after_insert_trigger
AFTER INSERT ON trigg_table
FOR EACH ROW
EXECUTE FUNCTION log_insert();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Step 3: Test the Trigger&lt;/strong&gt;&lt;br&gt;
With the trigger in place, you can now test its functionality by performing an action that triggers the event. In this case, inserting a new row into the "trigg_table" table will cause the trigger function to execute and log the inserted row's ID.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For example:
Given table
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_db=# CREATE TABLE trigg_table(id SERIAL PRIMARY KEY NOT NULL, name VARCHAR(20));
CREATE TABLE
my_db=# INSERT INTO trigg_table(name) VALUES('Daniel');
NOTICE:  New row inserted with ID: 1
INSERT 0 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, a &lt;code&gt;NOTICE&lt;/code&gt; was raised indiating the insertion of a new row into the &lt;code&gt;trigg_table&lt;/code&gt; table.&lt;/p&gt;




&lt;h3&gt;
  
  
  Use Cases for Triggers
&lt;/h3&gt;

&lt;p&gt;Triggers can be immensely useful in various scenarios. Here are a few common use cases:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Audit Trail:&lt;/strong&gt; Triggers can be employed to track changes made to critical data. By capturing before-and-after values, you can maintain an audit trail of all modifications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Data Validation:&lt;/strong&gt; Triggers can enforce complex data validation rules that go beyond simple constraints, ensuring that only valid data is inserted, updated, or deleted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Derived Data:&lt;/strong&gt; When certain columns depend on others, triggers can automatically calculate and update these derived values whenever the base data changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Notifications:&lt;/strong&gt; Triggers can be used to send notifications or alerts based on specific events, keeping stakeholders informed in real-time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Archiving:&lt;/strong&gt; Triggers can facilitate data archiving by moving old records from one table to another based on predefined criteria.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices
&lt;/h3&gt;

&lt;p&gt;While triggers offer powerful automation capabilities, they should be used judiciously. Here are a few best practices to keep in mind:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Keep Logic Simple:&lt;/strong&gt; Triggers should focus on lightweight tasks. Complex operations are better suited for application code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Document Thoroughly:&lt;/strong&gt; Clearly document the purpose, behavior, and logic of your triggers. This will aid in maintenance and troubleshooting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Testing is Crucial:&lt;/strong&gt; Thoroughly test triggers before deploying them in production to avoid unexpected behaviors or performance bottlenecks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Monitor Performance:&lt;/strong&gt; Triggers can impact database performance, especially if they involve complex operations. Regularly monitor their impact on query performance.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Triggers in PostgreSQL provide a mechanism for automating actions based on database events, making them a powerful tool for maintaining data integrity, enforcing business rules, and reducing manual intervention. By understanding their components, creating well-defined trigger functions, and adhering to best practices, developers can harness the full potential of triggers to streamline their database operations and achieve more efficient data management.&lt;/p&gt;




&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/sql-createtrigger.html" rel="noopener noreferrer"&gt;PostgreSQL CREATE TRIGGER&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/install-procedure.html#CONFIGURE-OPTIONS" rel="noopener noreferrer"&gt;PostgreSQL Installation Procedure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Website: &lt;a href="https://age.apache.org/" rel="noopener noreferrer"&gt;https://age.apache.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE GitHub: &lt;a href="https://github.com/apache/age" rel="noopener noreferrer"&gt;https://github.com/apache/age&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Viewer GitHub: &lt;a href="https://github.com/apache/age-viewer" rel="noopener noreferrer"&gt;https://github.com/apache/age-viewer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>postgres</category>
      <category>postgressql</category>
      <category>apacheage</category>
      <category>database</category>
    </item>
    <item>
      <title>Guide: Creating Stored Procedures in PostgreSQL</title>
      <dc:creator>Nnaemeka Daniel John</dc:creator>
      <pubDate>Tue, 22 Aug 2023 11:32:49 +0000</pubDate>
      <link>https://dev.to/dukeofhazardz/guide-creating-stored-procedures-in-postgresql-4g3c</link>
      <guid>https://dev.to/dukeofhazardz/guide-creating-stored-procedures-in-postgresql-4g3c</guid>
      <description>&lt;p&gt;One of the powerful tools at your disposal when using PostgreSQL is the creation of stored procedures, it can help streamline your interactions with your PostgreSQL database. In this article, we'll delve into the ins and outs of creating stored procedures in PostgreSQL, covering everything from their benefits to step-by-step implementation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of Stored Procedures
&lt;/h3&gt;

&lt;p&gt;Stored procedures offer a range of benefits that contribute to enhanced database management and application development:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Improved Performance&lt;/strong&gt;&lt;br&gt;
Stored procedures are precompiled and stored in the database. This means that when you call a stored procedure, the database doesn't need to re-parse and compile the SQL statements each time. This can significantly improve the execution speed of your queries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Modularity and Encapsulation&lt;/strong&gt;&lt;br&gt;
Stored procedures allow you to encapsulate complex logic and operations into reusable units. This promotes modularity in your codebase, making it easier to manage and maintain your database-related tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Enhanced Security&lt;/strong&gt;&lt;br&gt;
By using stored procedures, you can restrict direct access to tables and views, reducing the risk of unauthorized data manipulation. This adds an additional layer of security to your database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Reduced Network Traffic&lt;/strong&gt;&lt;br&gt;
When you execute a stored procedure, you send a single request to the database server, reducing the amount of network traffic compared to sending individual SQL queries. This can be especially advantageous when dealing with remote database servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Transaction Management&lt;/strong&gt;&lt;br&gt;
Stored procedures allow you to group multiple SQL statements into a single transaction. This ensures that either all the statements within the procedure are executed successfully, or none of them are, maintaining data integrity.&lt;/p&gt;


&lt;h3&gt;
  
  
  Creating a Stored Procedure in PostgreSQL
&lt;/h3&gt;

&lt;p&gt;Let's dive into the practical steps of creating a stored procedure in PostgreSQL:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Connect to the Database&lt;/strong&gt;&lt;br&gt;
First, ensure you have the necessary permissions to create a stored procedure in the target database. Connect to the PostgreSQL database using a tool like psql or a graphical interface like pgAdmin.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Define the Procedure&lt;/strong&gt;&lt;br&gt;
Use the CREATE OR REPLACE PROCEDURE statement to define your stored procedure. This statement allows you to create a new procedure or replace an existing one. Below is a basic template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE procedure_name(parameter1 datatype, parameter2 datatype)
LANGUAGE plpgsql
AS $$
DECLARE
    -- Declare local variables if needed
BEGIN
    -- Your SQL logic here
EXCEPTION
    WHEN OTHERS THEN
        -- Handle exceptions if needed
        RAISE EXCEPTION 'exception';
END;
$$;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Step 3: Implement the Logic&lt;/strong&gt;&lt;br&gt;
Within the BEGIN and END; block, write the SQL logic that constitutes your procedure. You can use SQL statements, conditionals, loops, and more to achieve your desired functionality.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For example:
Given a customer_orders table:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_db=# select * from customer_orders;
 order_id | customer_id | order_date | total_amount
----------+-------------+------------+--------------
        1 |           1 | 2023-08-01 |       150.00
        2 |           2 | 2023-08-02 |        75.50
        3 |           1 | 2023-08-03 |       200.00
        4 |           3 | 2023-08-04 |        50.00
        5 |           2 | 2023-08-05 |       120.75
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;We can calculate the sum of &lt;code&gt;total_amount&lt;/code&gt; for the specified &lt;code&gt;customer_id&lt;/code&gt; using a &lt;code&gt;SELECT&lt;/code&gt; statement and store it in the &lt;code&gt;total&lt;/code&gt; variable using the &lt;code&gt;INTO&lt;/code&gt; clause.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE calculate_total_amount_by_customer(customer_id_arg INT)
LANGUAGE plpgsql
AS $$
DECLARE
    total NUMERIC := 0;
BEGIN
    SELECT SUM(total_amount) INTO total
    FROM customer_orders
    WHERE customer_id = customer_id_arg;

    RAISE NOTICE 'Total amount spent by customer %: %', customer_id_arg, total;
EXCEPTION
    WHEN OTHERS THEN
        -- Handle exceptions if needed
        RAISE EXCEPTION 'Error calculating total amount for customer %', customer_id_arg;
END;
$$;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this query, the &lt;code&gt;RAISE NOTICE&lt;/code&gt; statement is used to print a message indicating the total amount spent by the customer.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;EXCEPTION&lt;/code&gt; block handles any exceptions that might occur during the execution of the procedure. If an exception is raised, an error message is raised using the &lt;code&gt;RAISE EXCEPTION&lt;/code&gt; statement.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Step 4: Execute the Procedure&lt;/strong&gt;&lt;br&gt;
Once your stored procedure is defined, execute it using the &lt;code&gt;CALL procedure_name(parameters);&lt;/code&gt; statement. This will trigger the execution of the procedure, and you'll see the result if the procedure is designed to return a value.&lt;/p&gt;

&lt;p&gt;We can execute our above &lt;code&gt;calculate_total_amount_by_customer&lt;/code&gt; procedure example by running;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_db=# CALL calculate_total_amount_by_customer(1);
NOTICE:  Total amount spent by customer 1: 350.00
CALL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see the &lt;code&gt;NOTICE&lt;/code&gt; was raised displaying the total amount spent by the customer id that was passed into the procedure.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Step 5: Managing Errors&lt;/strong&gt;&lt;br&gt;
To handle errors within your stored procedure, you can use &lt;code&gt;EXCEPTION&lt;/code&gt; blocks to catch and handle exceptions that might occur during execution.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Stored procedures are a versatile tool for managing and optimizing your PostgreSQL database. They offer benefits such as improved performance, modularity, security, and transaction management. By following the steps outlined in this guide, you can create and deploy your own stored procedures to enhance your database operations. As you become more comfortable with stored procedures, you'll find that they empower you to create efficient and organized database interactions, contributing to the overall success of your applications.&lt;/p&gt;




&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/sql-createprocedure.html" rel="noopener noreferrer"&gt;PostgreSQL CREATE PROCEDURE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/install-procedure.html#CONFIGURE-OPTIONS" rel="noopener noreferrer"&gt;PostgreSQL Installation Procedure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Website: &lt;a href="https://age.apache.org/" rel="noopener noreferrer"&gt;https://age.apache.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE GitHub: &lt;a href="https://github.com/apache/age" rel="noopener noreferrer"&gt;https://github.com/apache/age&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Viewer GitHub: &lt;a href="https://github.com/apache/age-viewer" rel="noopener noreferrer"&gt;https://github.com/apache/age-viewer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>database</category>
      <category>postgres</category>
      <category>postgressql</category>
      <category>apacheage</category>
    </item>
    <item>
      <title>What are Indexes?: Creating Indexes in PostgreSQL</title>
      <dc:creator>Nnaemeka Daniel John</dc:creator>
      <pubDate>Mon, 21 Aug 2023 14:35:18 +0000</pubDate>
      <link>https://dev.to/dukeofhazardz/what-are-indexes-creating-indexes-in-postgresql-d7k</link>
      <guid>https://dev.to/dukeofhazardz/what-are-indexes-creating-indexes-in-postgresql-d7k</guid>
      <description>&lt;p&gt;In this article, we'll explore the significance of indexes and I will guide you through the process of creating them to enhance the performance of your PostgreSQL database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding the Role of Indexes
&lt;/h3&gt;

&lt;p&gt;Indexes are crucial tools that significantly impact the efficiency of database operations. Imagine you have a massive library with countless books, and you need to find a specific book. Without an organized system, you'd have to search through every book one by one. This is the same way a database searches for information in the absence of indexes – it scans through every record sequentially, which can be very time-consuming and resource-intensive.&lt;/p&gt;

&lt;p&gt;Indexes act as a roadmap, helping the database quickly locate the data you need. They provide an optimized way to access information, reducing the time it will take to retrieve data and improving the overall performance of your database queries.&lt;/p&gt;




&lt;h3&gt;
  
  
  Types of Indexes in PostgreSQL
&lt;/h3&gt;

&lt;p&gt;PostgreSQL offers various types of indexes, each one with its unique characteristics. Here are some commonly used ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;B-Tree Indexes&lt;/strong&gt;&lt;br&gt;
B-Tree indexes are the default indexes in PostgreSQL. They're well-suited for queries that involve comparison operators such as =, &amp;lt;, &amp;gt;, &amp;lt;=, and &amp;gt;=. B-Tree indexes organize data in a balanced tree structure, allowing for efficient search operations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hash Indexes&lt;/strong&gt;&lt;br&gt;
Hash indexes are ideal for equality-based searches. They work by hashing the indexed column's values and storing them in a hash table. Even though they are fast for equality searches, they are less effective for range queries or pattern matching.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GiST (Generalized Search Tree) Indexes&lt;/strong&gt;&lt;br&gt;
GiST indexes are versatile and support various data types. They are especially useful for complex data types like geometric shapes and full-text search. GiST indexes provide multiple search strategies, making them a powerful option for diverse querying needs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GIN (Generalized Inverted Index) Indexes&lt;/strong&gt;&lt;br&gt;
GIN indexes are designed for columns containing arrays or complex types. They allow efficient searching for elements within arrays and are great for scenarios where your data involves multiple values per record.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Creating Indexes in PostgreSQL
&lt;/h3&gt;

&lt;p&gt;Now that we've covered the importance of indexes and their types, let's talk about how you can create indexes in PostgreSQL.&lt;/p&gt;

&lt;p&gt;Suppose you have a table named customer_orders with columns like order_id, customer_id, and order_date. To create an index on the customer_id column, follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect to Your Database
Ensure you're connected to your PostgreSQL database using a tool like psql or a graphical interface like pgAdmin.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_db=# select * from customer_orders;
 order_id | customer_id | order_date | total_amount
----------+-------------+------------+--------------
        1 |           1 | 2023-08-01 |       150.00
        2 |           2 | 2023-08-02 |        75.50
        3 |           1 | 2023-08-03 |       200.00
        4 |           3 | 2023-08-04 |        50.00
        5 |           2 | 2023-08-05 |       120.75
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Write the Index Creation Query
Use the CREATE INDEX statement to create an index. In our example, you would run:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_db=# CREATE INDEX idx_customer_id ON customer_orders(customer_id);
CREATE INDEX
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Monitor and Optimize
&lt;/h3&gt;

&lt;p&gt;Once the index is created, PostgreSQL will automatically use it to optimize relevant queries. However, keep in mind that while indexes improve read performance, they can slow down write operations. Regularly monitor your database's performance and consider indexing columns that are frequently used in WHERE clauses or JOIN operations.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Best Practices and Considerations
&lt;/h3&gt;

&lt;p&gt;While indexes are powerful tools, it's important to use them judiciously. Here are some best practices:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Choose Columns Wisely:&lt;/strong&gt; Index columns that are frequently used in queries, but avoid excessive indexing as it can lead to unnecessary overhead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Analyze Query Patterns:&lt;/strong&gt; Understand your application's query patterns to determine which columns need indexes the most.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Monitor and Maintain:&lt;/strong&gt; Regularly analyze and optimize your indexes. Unused or redundant indexes can negatively impact performance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep Data Consistent:&lt;/strong&gt; Remember that indexes reflect the state of your data. If data is frequently updated, indexes may need to be rebuilt periodically.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;In this comprehensive guide, we've explored the world of PostgreSQL indexes, their types, and how to create them to enhance the performance of your database. By strategically using indexes and following best practices, you can achieve significant improvements in query execution times and overall database efficiency. So go ahead and unleash the power of indexes in PostgreSQL to take your application's performance to new heights!&lt;/p&gt;




&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="//postgresql.org/docs/current/sql-createindex.html"&gt;PostgreSQL CREATE INDEX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/install-procedure.html#CONFIGURE-OPTIONS" rel="noopener noreferrer"&gt;PostgreSQL Installation Procedure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Website: &lt;a href="https://age.apache.org/" rel="noopener noreferrer"&gt;https://age.apache.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE GitHub: &lt;a href="https://github.com/apache/age" rel="noopener noreferrer"&gt;https://github.com/apache/age&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Viewer GitHub: &lt;a href="https://github.com/apache/age-viewer" rel="noopener noreferrer"&gt;https://github.com/apache/age-viewer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>database</category>
      <category>postgres</category>
      <category>apacheage</category>
      <category>development</category>
    </item>
    <item>
      <title>Guide: Installing Apache A Graph Extension (AGE) on PostgreSQL Source Code</title>
      <dc:creator>Nnaemeka Daniel John</dc:creator>
      <pubDate>Thu, 27 Jul 2023 21:56:57 +0000</pubDate>
      <link>https://dev.to/dukeofhazardz/guide-installing-apache-a-graph-extension-age-on-postgresql-source-code-1po5</link>
      <guid>https://dev.to/dukeofhazardz/guide-installing-apache-a-graph-extension-age-on-postgresql-source-code-1po5</guid>
      <description>&lt;p&gt;Hey there, fellow tech enthusiasts! Today, I want to take you on a journey to explore an exciting tool that can supercharge your PostgreSQL experience – Apache AGE. 🚀&lt;/p&gt;

&lt;p&gt;What is Apache AGE, you might ask? Well, it's an awesome extension that allows you to harness the power of graphs within your PostgreSQL database. And trust me, it's going to open up a whole new world of possibilities for your data.&lt;/p&gt;

&lt;p&gt;So, let's dive right in and get started with the installation process. Don't worry; it's not as complex as it sounds!&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Up PostgreSQL
&lt;/h3&gt;

&lt;p&gt;Before we jump into Apache AGE, make sure you have PostgreSQL installed on your system. If you haven't done that yet, don't fret! Head over to this blogpost &lt;a href="https://dev.to/dukeofhazardz/installing-postgresql-from-source-code-full-installation-guide-1f6j"&gt;Installing PostgreSQL FROM Source Code (Full Installation Guide)&lt;/a&gt;, and follow the on-screen instructions. Easy peasy!&lt;/p&gt;

&lt;h3&gt;
  
  
  Apache AGE Installation
&lt;/h3&gt;

&lt;p&gt;Now that PostgreSQL is up and running, it's time to bring in the graph magic – Apache AGE. Here's how you can do it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open up your terminal or command prompt (you know the drill!).&lt;/li&gt;
&lt;li&gt;Clone the Apache AGE repository from Github &lt;a href="https://github.com/apache/age" rel="noopener noreferrer"&gt;Apache AGE&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;username@ubuntu:/home$ git clone git@github.com:apache/age.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Navigate into the AGE repo and install AGE by running &lt;code&gt;PG_CONFIG&lt;/code&gt; by running &lt;code&gt;sudo make PG_CONFIG=~/path_to/postgresql-13.10/bin/pg_config install&lt;/code&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;username@ubuntu:/home/age$ sudo makePG_CONFIG=~/Desktop/postgresql-13.10/bin/pg_config install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure you replace the path with the actual path to your postgres directory.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;install check&lt;/code&gt; to ensure that AGE installed without any issues.
&lt;code&gt;make PG_CONFIG=~/path_to/postgresql-13.10/bin/pg_config install check&lt;/code&gt;
Ensure you run this command without &lt;code&gt;sudo&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Activating Apache AGE on PostgreSQL
&lt;/h3&gt;

&lt;p&gt;Once the installation is complete, it's time to integrate Apache AGE with PostgreSQL. Here's how:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your &lt;code&gt;postgresql.conf&lt;/code&gt; file in the data directory.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user@ubuntu:/home/postgresql-13.10/data$ vi postgresql.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Search and set &lt;code&gt;set_preload_librabries = 'age'&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Search and set &lt;code&gt;search_path = 'ag_catalog, "user", public'&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Exploring AGE on PostgreSQL
&lt;/h3&gt;

&lt;p&gt;After setting up our &lt;code&gt;postgresql.conf&lt;/code&gt; file, we can now start Postgres.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;bin/pg_ctl -D data -l logfile start&lt;/code&gt; to start the postgres server.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;bin/psql --port=5432 my_db&lt;/code&gt; to connect to our database.&lt;/li&gt;
&lt;li&gt;Once connected to our database, we can now run AGE cypher queries on PostgreSQL.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;psql (13.10)
Type "help" for help.

my_db=# 
my_db=# SELECT * FROM cypher('my_db', $$ MATCH (u)
my_db$# RETURN u
my_db$# $$) AS (u agtype);
 u
---
(0 rows)

my_db=#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Congratulations! You've successfully installed Apache AGE on your PostgreSQL database, and now you're equipped with the power of graphs to tackle complex data relationships like a pro. 🚀&lt;/p&gt;

&lt;p&gt;Feel free to experiment with graph queries and let your creativity flow! Apache AGE is an incredible tool that can revolutionize the way you interact with your PostgreSQL data.&lt;/p&gt;

&lt;p&gt;So go ahead, embrace the graph revolution, and unlock the true potential of your database with Apache AGE. Happy graphing! 😎&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/dukeofhazardz/installing-postgresql-from-source-code-full-installation-guide-1f6j"&gt;Installing PostgreSQL FROM Source Code (Full Installation Guide)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Website: &lt;a href="https://age.apache.org/" rel="noopener noreferrer"&gt;https://age.apache.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE GitHub: &lt;a href="https://github.com/apache/age" rel="noopener noreferrer"&gt;https://github.com/apache/age&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Viewer GitHub: &lt;a href="https://github.com/apache/age-viewer" rel="noopener noreferrer"&gt;https://github.com/apache/age-viewer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>apacheage</category>
      <category>apache</category>
      <category>postgres</category>
      <category>database</category>
    </item>
    <item>
      <title>Installing PostgreSQL FROM Source Code (Full Installation Guide)</title>
      <dc:creator>Nnaemeka Daniel John</dc:creator>
      <pubDate>Fri, 21 Jul 2023 22:06:34 +0000</pubDate>
      <link>https://dev.to/dukeofhazardz/installing-postgresql-from-source-code-full-installation-guide-1f6j</link>
      <guid>https://dev.to/dukeofhazardz/installing-postgresql-from-source-code-full-installation-guide-1f6j</guid>
      <description>&lt;p&gt;Hey there, tech enthusiasts! Today, we're diving into the exciting world of PostgreSQL and its full installation from source code. PostgreSQL, also known as Postgres, is a powerful open-source relational database management system that has earned its reputation for robustness, reliability, and extensibility. While installing PostgreSQL from source code might sound a bit daunting, fear not! I've got you covered with this very easy-to-follow guide.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gather the Prerequisites
&lt;/h3&gt;

&lt;p&gt;Before we begin, we need to ensure that we have all the necessary tools and libraries on our system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;C Compiler:&lt;/strong&gt; PostgreSQL is written in C, so a C compiler is a must. Popular choices include GCC (GNU Compiler Collection) and Clang.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build Tools:&lt;/strong&gt; Ensure you have essential build tools like make and autoconf installed. These tools help in compiling the source code efficiently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Libraries:&lt;/strong&gt; PostgreSQL requires certain libraries like readline and zlib. We need to install these development libraries on our system.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depending on your operating system this is the command used to install the needed dependencies on Ubuntu;&lt;br&gt;
&lt;code&gt;sudo apt-get install build-essential libreadline-dev zlib1g-dev flex bison&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Download the Source Code
&lt;/h3&gt;

&lt;p&gt;Head over to the official PostgreSQL website &lt;a href="https://www.postgresql.org/ftp/source/" rel="noopener noreferrer"&gt;PostgreSQL Source Download&lt;/a&gt; and download the source code of the desired version. If you intend to use the Apache AGE extension with PostgreSQL, it is advisable to download version 11, 12 or 13 which AGE currently support.&lt;/p&gt;
&lt;h3&gt;
  
  
  Extract the Source Code
&lt;/h3&gt;

&lt;p&gt;Once the download is complete, navigate to the directory where the source code is saved and extract it using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tar xvfz postgresql-13.10.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configure PostgreSQL
&lt;/h3&gt;

&lt;p&gt;Once you're done extracting, navigate into the extracted directory, and run configure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd postgresql-13.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The configuration step ensures that PostgreSQL is tailored to your system. I'll recommend a basic configuration to get started:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./configure --prefix=$(pwd) --enable-cassert --enable-debug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;--prefix&lt;/code&gt; install all files under the directory PREFIX instead of /usr/local/pgsql. In this case, our present working directory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;--enable-debug&lt;/code&gt; compiles all programs and libraries with debugging symbols. This means that you can run the programs in a debugger to analyze problems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;--enable-cassert&lt;/code&gt; enables assertion checks in the server, which test for many “cannot happen” conditions.  This option is not recommended for production use, but you should have it on for development work or when running a beta version.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Compile and Install
&lt;/h3&gt;

&lt;p&gt;Now, let's compile the source code and install PostgreSQL on our system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gmake &amp;amp;&amp;amp; gmake install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, you can use &lt;code&gt;make &amp;amp;&amp;amp; make install&lt;/code&gt;.&lt;br&gt;
The &lt;code&gt;gmake&lt;/code&gt; command will compile the source code, and &lt;code&gt;gmake install&lt;/code&gt; will install PostgreSQL. You can use &lt;code&gt;sudo&lt;/code&gt; to ensure that the installation has the required permissions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Initialize the Database Cluster
&lt;/h3&gt;

&lt;p&gt;After the installation, right in our postgres directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user@ubuntu:/home/postgresql-13.10$ bin/initdb my_db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use the &lt;code&gt;bin/initdb my_db&lt;/code&gt; command to initialize a database cluster named &lt;code&gt;my_db&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start PostgreSQL Service
&lt;/h3&gt;

&lt;p&gt;We can now start the PostgreSQL service using;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user@ubuntu:/home/postgresql-13.10$ bin/pg_ctl -D my_db -l logfile start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, the postgres server runs on port 5432, but you can change that in the &lt;code&gt;postgresql.conf&lt;/code&gt; file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a PostgreSQL Database
&lt;/h3&gt;

&lt;p&gt;Once our server is started, we can now create a new database using the command below;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user@ubuntu:/home/postgresql-13.10$ bin/createdb --port=5432 new_db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above command creates a new database called &lt;code&gt;new_db&lt;/code&gt; in our database cluster &lt;code&gt;my_db&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And you can start writing queries by connecting to the database;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user@ubuntu:/home/postgresql-13.10$ bin/psql --port=5432 my_db
my_db=# \dt
my_db=# \q
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can stop the database server using the command;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user@ubuntu:/home/postgresql-13.10$ bin/pg_ctl -D my_db stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Congratulations! You have successfully installed PostgreSQL from source code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;You've accomplished an impressive feat - installing PostgreSQL from source code! Embracing the power of PostgreSQL allows you to handle complex data needs and build robust applications. Remember, the journey of a thousand queries begins with a single installation, and you're now well-equipped to harness the potential of this incredible database management system.&lt;/p&gt;

&lt;p&gt;So, take charge, explore the vast PostgreSQL documentation, and let your data-driven dreams soar! Happy coding!&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/install-procedure.html#CONFIGURE-OPTIONS" rel="noopener noreferrer"&gt;PostgreSQL Installation Procedure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/ftp/source/" rel="noopener noreferrer"&gt;PostgreSQL Source Download&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Website: &lt;a href="https://age.apache.org/" rel="noopener noreferrer"&gt;https://age.apache.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE GitHub: &lt;a href="https://github.com/apache/age" rel="noopener noreferrer"&gt;https://github.com/apache/age&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit Apache AGE Viewer GitHub: &lt;a href="https://github.com/apache/age-viewer" rel="noopener noreferrer"&gt;https://github.com/apache/age-viewer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>postgres</category>
      <category>tutorial</category>
      <category>database</category>
      <category>apacheage</category>
    </item>
  </channel>
</rss>
